
    b?i[                     Z   S SK r S SKrS SKrS SKrS SKJrJrJrJrJ	r	J
r
JrJrJrJr  SSKJr  SSKJr  \ R&                  " S\ R(                  \ R*                  -  5      r " S S5      r " S	 S
5      r " S S\\5      r " S S5      r " S S\\5      r " S S\5      r " S S\\5      rg)    N)
WarningErrorInterfaceError	DataErrorDatabaseErrorOperationalErrorIntegrityErrorInternalErrorNotSupportedErrorProgrammingError   )logger)
FIELD_TYPEz|\s*((?:INSERT|REPLACE)\s.+\sVALUES?\s+)(\(\s*(?:%s|%\(.+\)s)\s*(?:,\s*(?:%s|%\(.+\)s)\s*)*\))(\s*(?:ON DUPLICATE.*)?);?\s*\Zc                      \ rS rSrSrSrS)S jr\S 5       r\S 5       r	\S 5       r
\S 5       r\S	 5       r\R                  S
 5       r\S 5       r\S 5       r\S 5       rS rS rS rS rS rS rS rS rS*S jrS*S jrS rS rS+S jrS rS*S jrS r S,S jr!S  r"S! r#S" r$S# r%\&r&\'r'\(r(\)r)\*r*\+r+\,r,\-r-\.r.\/r/S$ r0S% r1S& r2S' r3S(r4g)-Cursor   z-Cursor is used to interact with the database.i  c                     Xl         U R                   R                  U l        SU l        SU l        SU l        SU l        SU l        SU l        SU l	        SU l
        X l        g)zVDo not create an instance of a Cursor yourself. Call
connections.Connection.cursor().
Nr   r   )_connectionloop_loop_description
_rownumber	_rowcount
_arraysize	_executed_result_rows
_lastrowid_echo)self
connectionechos      T/var/www/html/livechat/backend/venv/lib/python3.13/site-packages/aiomysql/cursors.py__init__Cursor.__init__$   s[     &%%**
 

    c                     U R                   $ )zeThis read-only attribute return a reference to the Connection
object on which the cursor was created.r   r!   s    r$   r"   Cursor.connection4   s     r'   c                     U R                   $ )aB  This read-only attribute is a sequence of 7-item sequences.

Each of these sequences is a collections.namedtuple containing
information describing one result column:

0.  name: the name of the column returned.
1.  type_code: the type of the column.
2.  display_size: the actual length of the column in bytes.
3.  internal_size: the size in bytes of the column associated to
    this column on the server.
4.  precision: total number of significant digits in columns of
    type NUMERIC. None for other types.
5.  scale: count of decimal digits in the fractional part in
    columns of type NUMERIC. None for other types.
6.  null_ok: always None as not easy to retrieve from the libpq.

This attribute will be None for operations that do not
return rows or if the cursor has not had an operation invoked
via the execute() method yet.
)r   r*   s    r$   descriptionCursor.description:   s    ,    r'   c                     U R                   $ )a  Returns the number of rows that has been produced of affected.

This read-only attribute specifies the number of rows that the
last :meth:`execute` produced (for Data Query Language
statements like SELECT) or affected (for Data Manipulation
Language statements like UPDATE or INSERT).

The attribute is -1 in case no .execute() has been performed
on the cursor or the row count of the last operation if it
can't be determined by the interface.
)r   r*   s    r$   rowcountCursor.rowcountR   s     ~~r'   c                     U R                   $ )zRow index.

This read-only attribute provides the current 0-based index of the
cursor in the result set or ``None`` if the index cannot be
determined.
)r   r*   s    r$   	rownumberCursor.rownumbera        r'   c                     U R                   $ )How many rows will be returned by fetchmany() call.

This read/write attribute specifies the number of rows to
fetch at a time with fetchmany(). It defaults to
1 meaning to fetch a single row at a time.

r   r*   s    r$   	arraysizeCursor.arraysizel   r5   r'   c                     Xl         g)r7   Nr8   )r!   vals     r$   r9   r:   w   s	     r'   c                     U R                   $ )aB  This read-only property returns the value generated for an
AUTO_INCREMENT column by the previous INSERT or UPDATE statement
or None when there is no such value available. For example,
if you perform an INSERT into a table that contains an AUTO_INCREMENT
column, lastrowid returns the AUTO_INCREMENT value for the new row.
)r   r*   s    r$   	lastrowidCursor.lastrowid   s     r'   c                     U R                   $ )zReturn echo mode status.)r    r*   s    r$   r#   Cursor.echo   s     zzr'   c                 ,    U R                   (       d  S$ S$ )z\The readonly property that returns ``True`` if connections was
detached from current cursor
TFr)   r*   s    r$   closedCursor.closed   s    
  ++t66r'   c                    #    U R                   nUc  g U R                  5       I Sh  vN (       a    U R                  5       I Sh  vN (       a  M   SU l         g N1 N! SU l         f = f7f)z2Closing a cursor just exhausts all remaining data.N)r   nextsetr!   conns     r$   closeCursor.close   sZ     <	$'' ''  $D (  $Ds>   A)A AA A	A A)A A 	A&&A)c                 R    U R                   (       d  [        S5      eU R                   $ )NzCursor closed)r   r   r*   s    r$   _get_dbCursor._get_db   s"    "?33r'   c                 <    U R                   (       d  [        S5      eg )Nzexecute() first)r   r   r*   s    r$   _check_executedCursor._check_executed   s    ~~"#455 r'   c                     U$ N r!   rows     r$   	_conv_rowCursor._conv_row   s    
r'   c                     gz!Does nothing, required by DB API.NrS   r!   argss     r$   setinputsizesCursor.setinputsizes       r'   c                     grY   rS   rZ   s     r$   setoutputsizesCursor.setoutputsizes   r^   r'   c                 "  #    U R                  5       nU R                  nUb  X!R                  La  gUR                  (       d  gSU l        U R                  5         UR	                  5       I Sh  vN   U R                  5       I Sh  vN   g N N7f)zGet the next query setNT)rL   r   has_next_clear_resultnext_result_do_get_result)r!   rH   current_results      r$   rF   Cursor.nextset   sy     ||~!^<<%G&&   !!### 	!#s$   A+B-B.BBBBc                 &  ^ [        U[        [        45      (       a  [        U4S jU 5       5      $ [        U[        5      (       a5  UR	                  5        VVs0 s H  u  p4UTR                  U5      _M     snn$ TR                  U5      $ s  snnf )Nc              3   F   >#    U  H  nTR                  U5      v   M     g 7frR   )escape).0argrH   s     r$   	<genexpr>&Cursor._escape_args.<locals>.<genexpr>   s     :TcS))Ts   !)
isinstancetuplelistdictitemsrk   )r!   r[   rH   keyr<   s     `  r$   _escape_argsCursor._escape_args   st    dUDM**:T:::d##<@JJLILjsCS))LII ;;t$$	 Js   BNc                 R    U R                  5       nUb  XR                  X#5      -  nU$ )a  Returns the exact string that is sent to the database by calling
the execute() method. This method follows the extension to the DB
API 2.0 followed by Psycopg.

:param query: ``str`` sql statement
:param args: ``tuple`` or ``list`` of arguments for sql query
)rL   rv   r!   queryr[   rH   s       r$   mogrifyCursor.mogrify   s-     ||~--d99Er'   c                   #    U R                  5       nU R                  5       I Sh  vN (       a    U R                  5       I Sh  vN (       a  M   Ub  XR                  X#5      -  nU R                  U5      I Sh  vN   Xl        U R
                  (       a-  [        R                  " U5        [        R                  " SU5        U R                  $  N N NX7f)a~  Executes the given operation

Executes the given operation substituting any markers with
the given parameters.

For example, getting all rows where id is 5:
  cursor.execute("SELECT * FROM t1 WHERE id = %s", (5,))

:param query: ``str`` sql statement
:param args: ``tuple`` or ``list`` of arguments for sql query
:returns: ``int``, number of rows that has been produced of affected
N%r)	rL   rF   rv   _queryr   r    r   infor   ry   s       r$   executeCursor.execute   s      ||~\\^## \\^## --d99Ekk%   ::KKKKd#~~ $ 	!s:   $CCCC	C*C:C;ACCCc           	        #    U(       d  gU R                   (       a.  [        R                  " SU5        [        R                  " SU5        [        R	                  U5      nU(       a  UR                  S5      S-  nUR                  S5      R                  5       nUR                  S5      =(       d    SnUS	   S
:X  a	  US   S:X  d   eU R                  XEXbU R                  U R                  5       R                  5      I Sh  vN $ S	nU H*  nU R                  X5      I Sh  vN   XpR                  -  nM,     Xpl        U R                  $  NH N*7f)a{  Execute the given operation multiple times

The executemany() method will execute the operation iterating
over the list of parameters in seq_params.

Example: Inserting 3 new employees and their phone number

    data = [
        ('Jane','555-001'),
        ('Joe', '555-001'),
        ('John', '555-003')
        ]
    stmt = "INSERT INTO employees (name, phone) VALUES ('%s','%s')"
    await cursor.executemany(stmt, data)

INSERT or REPLACE statements are optimized by batching the data,
that is using the MySQL multiple rows syntax.

:param query: `str`, sql statement
:param args: ``tuple`` or ``list`` of arguments for sql query
NCALL %sr~   r   rS          r   (r   ))r    r   r   RE_INSERT_VALUESmatchgrouprstrip_do_execute_manymax_stmt_lengthrL   encodingr   r   )	r!   rz   r[   mq_prefixq_values	q_postfixrowsrm   s	            r$   executemanyCursor.executemany   s    , ::KK	5)KKd#""5)wwqzBHwwqz((*H
(bIA;#%(2,#*===//IT5I5I'') ) * Dll5...&  "N~~) /s$   C>E E	E E!)EEc                   #    U R                  5       nU R                  n[        U[        5      (       a  UR	                  U5      n[        U[        5      (       a  UR	                  U5      n[        U5      n	[        U5      nX(" [        U5      U5      -  n
[        U
[        5      (       a  U
R	                  US5      n
X-  n	SnU H  nX(" X5      -  n
[        U
[        5      (       a  U
R	                  US5      n
[        U	5      [        U
5      -   [        U5      -   S-   U:  a+  U R                  X-   5      I S h  vN nX-  n[        U5      n	OU	S-  n	X-  n	M     U R                  X-   5      I S h  vN nX-  nXl
        U$  NH N7f)Nsurrogateescaper   r      ,)rL   rv   rp   strencode	bytearrayiternextlenr   r   )r!   prefixvaluespostfixr[   r   r   rH   rk   sqlvr   rm   rs                 r$   r   Cursor._do_execute_many$  sa    ||~""fc""]]8,Fgs##nnX.GDzVDJ--a#45AC**A!S!!HHX'893x#a& 3w</!3oE,,s}55	'tHC  ,,s}--	 6 .s$   D6F8F97F0F1FFc                   ^#    U R                  5       nU R                  (       a.  [        R                  " ST5        [        R                  " SU5        [	        U5       HL  u  pESTXCR                  U5      4-  nU R                  U5      I Sh  vN   U R                  5       I Sh  vN   MN     SR                  U4S j[        [        U5      5       5       5      nST SU S	3nU R                  U5      I Sh  vN   X`l        U$  Nw Na N7f)
a  Execute stored procedure procname with args

Compatibility warning: PEP-249 specifies that any modified
parameters must be returned. This is currently impossible
as they are only available by storing them in a server
variable and then retrieved by a query. Since stored
procedures return zero or more result sets, there is no
reliable way to get at OUT or INOUT parameters via callproc.
The server variables are named @_procname_n, where procname
is the parameter above and n is the position of the parameter
(from zero). Once all result sets generated by the procedure
have been fetched, you can issue a SELECT @_procname_0, ...
query using .execute() to get any OUT or INOUT values.

Compatibility warning: The act of calling a stored procedure
itself creates an empty result set. This appears after any
result sets generated by the procedure. This is non-standard
behavior with respect to the DB-API. Be sure to use nextset()
to advance through all result sets; otherwise you may get
disconnected.

:param procname: ``str``, name of procedure to execute on server
:param args: `sequence of parameters to use with procedure
:returns: the original args.
r   r~   zSET @_%s_%d=%sN,c              3   2   >#    U  H  nS TU4-  v   M     g7f)z@_%s_%dNrS   )rl   iprocnames     r$   rn   "Cursor.callproc.<locals>.<genexpr>g  s     M<Lqh]2<Ls   zCALL r   r   )rL   r    r   r   	enumeraterk   r   rF   joinranger   r   )r!   r   r[   rH   indexrm   q_argss    `      r$   callprocCursor.callprocC  s     4 ||~::KK	8,KKd##D/JE He[[5E#FFA++a.  ,,.   *
 ME#d)<LMMH:QugQ'kk!n !  	s7   B
DDD%D&AD8D	9DD	Dc                    U R                  5         U R                  R                  5       nU R                  b#  U R                  [        U R                  5      :  a  UR                  S5        U$ U R                  U R                     nU =R                  S-  sl        U R                  R                  5       nUR                  U5        U$ )zFetch the next row Nr   )rO   r   create_futurer   r   r   
set_resultr!   futresults      r$   fetchoneCursor.fetchonem  s    jj&&(::C

O!CNN4 JDOO,1jj&&(v
r'   c                 z   U R                  5         U R                  R                  5       nU R                  c  UR	                  / 5        U$ U R
                  U=(       d    U R                  -   nU R                  U R
                  U n[        U[        U R                  5      5      U l        UR	                  U5        U$ )6  Returns the next set of rows of a query result, returning a
list of tuples. When no more rows are available, it returns an
empty list.

The number of rows returned can be specified using the size argument,
which defaults to one

:param size: ``int`` number of rows to return
:returns: ``list`` of fetched rows
)	rO   r   r   r   r   r   r   minr   )r!   sizer   endr   s        r$   	fetchmanyCursor.fetchmany|  s     	jj&&(::NN2Joo!89DOOC0c3tzz?3v
r'   c                 ^   U R                  5         U R                  R                  5       nU R                  c  UR	                  / 5        U$ U R
                  (       a  U R                  U R
                  S nOU R                  n[        U R                  5      U l        UR	                  U5        U$ )zKReturns all rows of a query result set

:returns: ``list`` of fetched rows
N)rO   r   r   r   r   r   r   r   s      r$   fetchallCursor.fetchall  s    
 	jj&&(::NN2J??ZZ 01FZZFdjj/v
r'   c                 <   U R                  5         US:X  a  U R                  U-   nOUS:X  a  UnO[        SU-  5      eSUs=::  a  [        U R                  5      :  d  O  [        S5      eX0l        U R                  R                  5       nUR                  S5        U$ )a1  Scroll the cursor in the result set to a new position according
 to mode.

If mode is relative (default), value is taken as offset to the
current position in the result set, if set to absolute, value
states an absolute target position. An IndexError should be raised in
case a scroll operation would leave the result set. In this case,
the cursor position is left undefined (ideal would be to
not move the cursor at all).

:param int value: move cursor to next position according to mode.
:param str mode: scroll mode, possible modes: `relative` and `absolute`
relativeabsoluteunknown scroll mode %sr   zout of rangeN)	rO   r   r   r   r   
IndexErrorr   r   r   )r!   valuemoder   r   s        r$   scrollCursor.scroll  s     	:%'AZA"#;d#BCCQ(TZZ(^,,jj&&(t
r'   c                    #    U R                  5       nXl        U R                  5         UR                  U5      I S h  vN   U R	                  5       I S h  vN   g  N N7frR   )rL   _last_executedrd   rz   rf   r!   r   rH   s      r$   r   Cursor._query  sM     ||~jjm!!### 	#s!   ;AAAAAAc                 X    SU l         S U l        SU l        S U l        S U l        S U l        g Nr   )r   r   r   r   r   r   r*   s    r$   rd   Cursor._clear_result  s-     
r'   c                 @  #    U R                  5       nSU l        UR                  =U l        nUR                  U l        UR
                  U l        UR                  U l        UR                  U l
        UR                  S:  a  U R                  U5      I S h  vN   g g  N7fr   )rL   r   r   affected_rowsr   r-   r   	insert_idr   r   r   warning_count_show_warnings)r!   rH   r   s      r$   rf   Cursor._do_get_result  s     ||~ $,v--".. **[[
!#%%d+++ $+s   BBBBc                   #    U R                   (       a  U R                   R                  (       a  g UR                  5       I S h  vN nUc  g U H-  nUS   n[        R                  " [        U5      [        S5        M/     g  N<7f)Nr      )r   rc   show_warningswarningswarnr   r   )r!   rH   wswmsgs        r$   r   Cursor._show_warnings  s`     <<DLL11%%'':AB%CMM#c(GQ/  (s   ABB =Bc                     U $ rR   rS   r*   s    r$   	__aiter__Cursor.__aiter__  s    r'   c                 T   #    U R                  5       I S h  vN nUb  U$ [        e N7frR   )r   StopAsyncIteration)r!   rets     r$   	__anext__Cursor.__anext__  s(     MMO#?J$$	 $s   (&(c                    #    U $ 7frR   rS   r*   s    r$   
__aenter__Cursor.__aenter__   s
     s   c                 @   #    U R                  5       I S h  vN   g  N7frR   )rI   )r!   exc_typeexc_valexc_tbs       r$   	__aexit__Cursor.__aexit__  s     jjl 	s   )r   r   r   r    r   r   r   r   r   r   r   r   )FrR   )rS   r   )5__name__
__module____qualname____firstlineno____doc__r   r%   propertyr"   r-   r0   r3   r9   setterr>   r#   rC   rI   rL   rO   rV   r\   r`   rF   rv   r{   r   r   r   r   r   r   r   r   r   rd   rf   r   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   __static_attributes__rS   r'   r$   r   r      s   7 O     
 ! !.             7 7	$ 
600%8,\>(T.(<$
,0 GE#N!MI'#N!M')%r'   r   c                   :   ^  \ rS rSrU 4S jrS rU 4S jrSrU =r$ )_DeserializationCursorMixini  c                    >#    [         TU ]  5       I S h  vN   U R                  (       a1  U R                   Vs/ s H  oR                  U5      PM     snU l        g g  NGs  snf 7frR   )superrf   r   _deserialization_row)r!   r   	__class__s     r$   rf   *_DeserializationCursorMixin._do_get_result	  sN     g$&&&::@D

K
133A6
KDJ  	'Ks    A$A#A$AA$A$c                    Uc  g [        U[        5      (       a  SnO[        U5      nSn[        U R                  5       Hk  u  ntpEnU[
        R                  :X  d  M  U(       a  UOUn[        R                  " [        [        5         [        R                  " X   5      X'   S S S 5        Mm     U(       a  U$ [        U5      $ ! , (       d  f       M  = f)NTF)rp   rs   rr   r   r   r   JSON
contextlibsuppress
ValueError	TypeErrorjsonloadsrq   )r!   rU   	dict_flagr   name
field_typenpoints           r$   r  0_DeserializationCursorMixin._deserialization_row  s    ;c4  Is)CI-6t7H7H-I)E)DqZ__, )u((Y?!%CJ!7CJ @? .J
 J: @?s   C
C	c                 L   > Uc  g [         TU ]  U5      nU R                  U5      $ rR   )r  rV   r  r!   rU   r  s     r$   rV   %_DeserializationCursorMixin._conv_row   s+    ;g$((--r'   )r   )	r   r   r   r   rf   r  rV   r   __classcell__r  s   @r$   r  r    s    L
$. .r'   r  c                       \ rS rSrSrSrg)DeserializationCursori'  z6A cursor automatic deserialization of json type fieldsrS   Nr   r   r   r   r   r   rS   r'   r$   r  r  '  s    @r'   r  c                   8   ^  \ rS rSr\rU 4S jrU 4S jrSrU =r	$ )_DictCursorMixini+  c                   >#    [         TU ]  5       I S h  vN   / nU R                  (       aW  U R                  R                   H7  nUR
                  nX1;   a  UR                  S-   U-   nUR                  U5        M9     Xl        U(       aC  U R                  (       a1  U R                   Vs/ s H  o@R                  U5      PM     snU l	        g g g  Ns  snf 7f)N.)r  rf   r   r   fieldsr  
table_nameappend_fieldsr   rV   )r!   r"  fr  r   r  s        r$   rf   _DictCursorMixin._do_get_result/  s     g$&&&\\((vv><<#-4Dd#	 )
 "Ldjj59ZZ@Z..+Z@DJ !6 	' As"   CCBC*CCCc                 t   > Uc  g [         TU ]  U5      nU R                  [        U R                  U5      5      $ rR   )r  rV   	dict_typezipr%  r  s     r$   rV   _DictCursorMixin._conv_row=  s4    ;g$~~c$,,455r'   )r%  r   )
r   r   r   r   rs   r)  rf   rV   r   r  r  s   @r$   r  r  +  s    IA6 6r'   r  c                       \ rS rSrSrSrg)
DictCursoriD  z.A cursor which returns results as a dictionaryrS   Nr  rS   r'   r$   r-  r-  D  s    8r'   r-  c                   J    \ rS rSrSrS rS rS rS rS r	SS	 jr
SS
 jrSrg)SSCursoriH  a  Unbuffered Cursor, mainly useful for queries that return a lot of
data, or for connections to remote servers over a slow network.

Instead of copying every row of data into a buffer, this will fetch
rows as needed. The upside of this, is the client uses much less memory,
and rows are returned much faster when traveling over a slow network,
or if the result set is very big.

There are limitations, though. The MySQL protocol doesn't support
returning the total number of rows, so the only way to tell how many rows
there are is to iterate over every row returned. Also, it currently isn't
possible to scroll backwards, as only the current row is held in memory.
c                 j  #    U R                   nUc  g U R                  b;  U R                  UR                  L a"  U R                  R                  5       I S h  vN    U R                  5       I S h  vN (       a    U R                  5       I S h  vN (       a  M   S U l         g  NJ N3 N! S U l         f = f7frR   )r   r   _finish_unbuffered_queryrF   rG   s     r$   rI   SSCursor.closeW  s     <<<#(D,,77999	$'' ''  $D : (  $DsN   AB3B!B3B' /B#0B' B%	B' 	B3#B' %B' '	B00B3c                    #    U R                  5       nXl        UR                  USS9I S h  vN   U R                  5       I S h  vN   U R                  $  N( N7f)NT)
unbuffered)rL   r   rz   rf   r   r   s      r$   r   SSCursor._querye  sP     ||~jjtj,,,!!###~~ 	-#s!   *AAAAAAc                 x   #    U R                   R                  5       I Sh  vN nU R                  U5      nU$  N7f)zRead next row N)r   _read_rowdata_packet_unbufferedrV   rT   s     r$   
_read_nextSSCursor._read_nextl  s3     LL@@BBnnS!
 Cs   :8:c                    #    U R                  5         U R                  5       I Sh  vN nUc  gU =R                  S-  sl        U$  N7f)zFetch next row Nr   )rO   r8  r   rT   s     r$   r   SSCursor.fetchoner  s@     OO%%;1
	 &s   $AA Ac                 v   #    / n U R                  5       I Sh  vN nUc   U$ UR                  U5        M1   N7f)zPFetch all, as per MySQLdb. Pretty useless for large queries, as
it is buffered.
N)r   r$  )r!   r   rU   s      r$   r   SSCursor.fetchall{  s@      'C{ KK	 's   979Nc                    #    U R                  5         Uc  U R                  n/ n[        U5       HG  nU R                  5       I Sh  vN nUc    U$ UR	                  U5        U =R
                  S-  sl        MI     U$  N67f)r   Nr   )rO   r   r   r8  r$  r   )r!   r   r   r   rU   s        r$   r   SSCursor.fetchmany  sz      	<??DtA))C{  KKOOq O   *s   AA>A<7A>c                   #    U R                  5         US:X  aQ  US:  a  [        S5      e[        U5       H  nU R                  5       I Sh  vN   M     U =R                  U-  sl        gUS:X  aY  XR                  :  a  [        S5      eXR                  -
  n[        U5       H  nU R                  5       I Sh  vN   M     Xl        g[        SU-  5      e N N7f)a  Scroll the cursor in the result set to a new position
according to mode . Same as :meth:`Cursor.scroll`, but move cursor
on server side one by one row. If you want to move 20 rows forward
scroll will make 20 queries to move cursor. Currently only forward
scrolling is supported.

:param int value: move cursor to next position according to mode.
:param str mode: scroll mode, possible modes: `relative` and `absolute`
r   r   z0Backwards scrolling not supported by this cursorNr   r   )rO   r   r   r8  r   r   )r!   r   r   _r   s        r$   r   SSCursor.scroll  s      	:qy' )9 : : 5\oo''' "OOu$OZ&'FH H //)C3Zoo'''  #O"#;d#BCC ( (s%   A	CCA-C9C:CC)r   r   r   rR   r   )r   r   r   r   r   rI   r   r8  r   r   r   r   r   rS   r'   r$   r/  r/  H  s+    $
0Dr'   r/  c                       \ rS rSrSrSrg)SSDictCursori  z<An unbuffered cursor, which returns results as a dictionary rS   Nr  rS   r'   r$   rD  rD    s    Fr'   rD  )rer  r   r
  pymysql.errr   r   r   r   r   r   r	   r
   r   r   logr   r"   r   compile
IGNORECASEDOTALLr   r   r  r  r  r-  r/  rD  rS   r'   r$   <module>rK     s    	   ) ) )
  " ::' MMBII	 k k\. .>A7 A6 629!6 9vDv vDrG#X Gr'   