
    Dh(m                         d Z ddlZddlZddlmZ ddlmZmZmZm	Z	m
Z
 ddlmZmZ ddlmZ ddlmZmZ dd	lmZ  G d
 de      Zy)z,Implements the MySQL Client/Server protocol
    N)Decimal   )	FieldFlag	ServerCmd	FieldType
ClientFlagMAX_MYSQL_TABLE_COLUMNS)errorsutils)get_auth_plugin)PY2struct_unpack)get_exceptionc                       e Zd ZdZd Zd Z	 	 	 	 ddZ	 	 ddZd dZ	 	 	 d!dZ	d	 Z
d
 Zd Zd"dZd Zd#dZd$dZd Zd Zd Zd Zd Zd$dZd Zd Zd Zd Zd Z	 	 d%dZd Zd Zy)&MySQLProtocolzRImplements MySQL client/server protocol

    Create and parses MySQL packets.
    c                 V    |t         j                  z  r|r|j                  d      dz   S y)z.Prepare database string for handshake responseutf8    )r   CONNECT_WITH_DBencode)selfclient_flagsdatabases      X/var/www/html/civilisation/venv/lib/python3.12/site-packages/mysql/connector/protocol.py_connect_with_dbzMySQLProtocol._connect_with_db-   s)    *444??6*W44    c                 r   |sy	  t        |      |||||      }|j                         }	|t        j                  z  r&t        |	      }t        j                  d|      |	z   }|S |	dz   }|S # t        t        j                  f$ r2}
t        j
                  dj                  t        |
                  d}
~
ww xY w)z#Prepare the authentication responser   )usernamepasswordr   ssl_enabledzFailed authentication: {0}Nz<B)r   auth_response	TypeErrorr
   InterfaceErrorProgrammingErrorformatstrr   SECURE_CONNECTIONlenstructpack)r   r   r   r   r   auth_plugin	auth_datar    authplugin_auth_responseexcresplenr!   s                r   _auth_responsezMySQLProtocol._auth_response3   s     	?/?;/!Hx')D $(#5#5#7 
 *666./G"KKg69MMM  17:M 6001 	?)),33CH=? ?	?s   &A+ +B6-B11B6Nc
           
          	 |d   }
|	xs |d   }	|sd}	 |j                  d      }t        j                  dj	                  dt        |      	      ||||      }|| j                  |||||	|
|      z  }|| j                  ||      z  }|t        j                  z  r||	j                  d      d
z   z  }|S # t         t        f$ r)}t        j                  dj	                  |            d}~ww xY w# t        $ r |}Y w xY w)z"Make a MySQL Authentication packetr,   r+   *Handshake misses authentication info ({0})Nr   r   z<IIB{filler}{usrlen}sxxxxxxxxxxxxxxxxxxxxxxxx)fillerusrlenr   )r"   KeyErrorr
   r$   r%   r   AttributeErrorr)   r*   r(   r1   r   r   PLUGIN_AUTH)r   	handshaker   r   r   charsetr   max_allowed_packetr    r+   r,   r/   username_bytespackets                 r   	make_authzMySQLProtocol.make_authJ   s7   	J!+.I%A=)AK
 H	&%__V4N 5<<C$7 = 9)+=w+-
 	$%%lHh&.&1&/> 	>
 	$''h??*000k((07::F5 8$ 	J))<CCCHJ J	J  	&%N	&s(   B4 C/ 4C,$C''C,/C=<C=c                     t        j                  |      t        j                  |      z   t        j                  |      z   dz   S )z Make a SSL authentication packets                          )r   	int4store	int1store)r   r;   r   r<   s       r   make_auth_sslzMySQLProtocol.make_auth_sslo   sB     |,123w'(  	r   c                 >    t        j                  |      }|||z  }|S )z(Make a MySQL packet containing a command)r   rB   )r   commandargumentdatas       r   make_commandzMySQLProtocol.make_commandw   s%    w'HDr   c	           
      H   	 |d   }	|xs |d   }|sd}	 |j                  d      }t        j                  dj	                  t        |            t        j                  |      }|| j                  ||||||	|      z  }|| j                  ||      z  }|t        j                  d	|      z  }|t        j                  z  r||j                  d      d
z   z  }|S # t         t        f$ r)}
t        j                  dj	                  |
            d}
~
ww xY w# t        $ r |}Y w xY w)z0Make a MySQL packet with the Change User commandr,   r+   r3   Nr   r   z<B{usrlen}sx)r6   z<Hr   )r"   r7   r
   r$   r%   r   r8   r)   r*   r(   r   CHANGE_USERr1   r   r   r9   )r   r:   r   r   r   r;   r   r    r+   r,   r/   r=   r>   s                r   make_change_userzMySQLProtocol.make_change_user~   sE   
	J!+.I%A=)AK
 H	&%__V4N ^22#n:M2N&22ND 	$%%lHh&.&1&/> 	>
 	$''h??&++dG,,*000k((07::F5 8$ 	J))<CCCHJ J	J  	&%N	&s(   C D D'$DDD! D!c           	         i }t        d|dd       d   |d<   t        j                  |dd d      \  }|d<   t        d	|dd
       \  |d<   }}|d<   |d<   }}|d   j                         |d<   |d
d }t        j                  ||z         }d}|t
        j                  z  r*|rt        d|dz
        nd}	|d|	 }||	d }|d   dk(  r|dd }|t
        j                  z  rVd|vr|d   j                  d      r	d|c}|d<   nt        j                  |d      \  }|d<   |d   j                  d      |d<   nd|d<   ||z   |d<   ||d<   |S )zParse a MySQL Handshake-packet<xxxxBr      protocolNr   endserver_version_originalz<I8sx2sBH2sBxxxxxxxxxx   server_threadidr;   server_statusr         z5.5.8r+   utf-8mysql_native_passwordr,   capabilities)
r   r   read_stringdecodeintreadr   r'   minr9   
startswith)
r   r>   res
auth_data1capabilities1capabilities2auth_data_lengthr[   
auth_data2sizes
             r   parse_handshakezMySQLProtocol.parse_handshake   s   '&1+>qAJ383D3D12JG4%0./ 2F1RLA	
				Y	_			),-F)G)N)N)P%&}}]]%BC
*6664D3r+a/0"D$JDE]F"~"'_
*000v%56AA'J03V,]+/4/@/@0),]+!$]!3!:!:7!CC!8C%
2K*N
r   c                    |d   dk(  st        j                  d      i }	 t        d|dd       d   |d<   t        j                  |dd       \  }|d<   t        j                  |      \  }|d	<   t        d
|dd       \  |d<   |d<   |dd }|r2t        j
                  |      \  }|d<   |d   j                  d      |d<   |S # t        $ r t        j                  d      w xY w)zParse a MySQL OK-packet   r   z#Failed parsing OK packet (invalid).rM   rN   field_countNaffected_rows	insert_idz<HHstatus_flagwarning_countinfo_msgrY   zFailed parsing OK packet.)r
   r#   r   r   read_lc_intread_lc_stringr]   
ValueError)r   r>   	ok_packets      r   parse_okzMySQLProtocol.parse_ok   s   ayA~''(MNN		E'4Xva{'KA'NIm$383D3DVABZ3P0VY//4/@/@/H,VY{++8q+L)Y}%'ABZF272F2Fv2N/:.(1*(=(D(DW(M	*%   	E''(CDD	Es   BC C!c                     	 t        j                  |dd       d   }|t        kD  ry|S # t        j                  t
        f$ r t        j                  d      w xY w)z=Parse a MySQL packet with the number of columns in result setrj   Nr   zFailed parsing column count)r   rq   r	   r)   errorrs   r
   r#   )r   r>   counts      r   parse_column_countz MySQLProtocol.parse_column_count   s`    	G%%fQRj1!4E..Lj) 	G''(EFF	Gs   $) ) /Ac                    t        j                  |dd       \  }}t        j                  |      \  }}t        j                  |      \  }}t        j                  |      \  }}t        j                  |      \  }}t        j                  |      \  }}	 t        d|      \  }}}}}|j                  |      |dddd| t        j                  z  |fS # t        j                  $ r t        j                  d      w xY w)zParse a MySQL column-packetrj   Nz	<xHIBHBxxz!Failed parsing column information)
r   rr   r   r)   rw   r
   r#   r]   r   NOT_NULL)r   r>   r;   _name
field_typeflagss          r   parse_columnzMySQLProtocol.parse_column   s   **6!":6**62**62**62--f5**62	M&{F;Q:A
 KK FY'''	
 		
 || 	M''(KLL	Ms   C )C;c                 (   |d   dk(  r| j                  |      S d}i }	 t        d|      }|d   dk(  rt        |      dk  st	        j
                  |      |d   |d	<   |d
   |d<   |S # t        j                  $ r t	        j
                  |      w xY w)zParse a MySQL EOF-packetrj   r   zFailed parsing EOF packet.z<xxxBBHHr      	      ro      rn   )ru   r   r)   rw   r
   r#   r(   )r   r>   err_msgra   unpackeds        r   	parse_eofzMySQLProtocol.parse_eof  s    !9>==((.	1$Z8H s"s6{a'7''00'{O%a[M
 || 	1''00	1s   A( ()Bc           
         d}i }|r|dd j                  d      }n|j                  d      }|D ]T  }	 |j                  dd      D cg c]  }|j                          c}\  }}	|j	                  d      }	 t        |	      ||<   V |S c c}w #  t        j                  |      xY w#  	 t        |	j	                  d            ||<   n+#  t        j                  dj                  |||	            xY wY xY w)	zParse the statistics packetz)Failed getting COM_STATISTICS informationrj   Ns        :r   rY   z{0} ({1}:{2}).)splitstripr
   r#   r]   intr   r%   )
r   r>   with_headererrmsgra   pairspairvlblvals
             r   parse_statisticszMySQLProtocol.parse_statistics  s   <12J$$[1ELL-E 	CD415D!1DEAaggiE
c
 **W%CCs8C	C  
 F4++F33CC&szz'':;CHC //(//SAC C sA   BBB6B'BB$'C5*CC5(C00C5c                    g }d}d}d}|dk\  }	 |s||k(  r	 ||fS |j                         }	|	j                  d      r|	dd g}
|j                         }	|	j                  d      r6|
j                  |	dd        |j                         }	|	j                  d      r6|
j                  |	dd        t        j                  t        d      j                  |
            }nd|	d   dk(  r|	d   dk  r| j                  |	      }d}n@|r$|	d   dk(  r|	d   d	kD  r| j                  |	      }d}nd}t        j                  |	dd       }|||j                  |       n||t        |	      |d
z  }\)zRead MySQL text result

        Reads all or given number of rows from the socket.

        Returns a tuple with 2 elements: a list with all rows and
        the EOF packet.
        Nr   )rN      rN   s   rj   r   r   r   r   r   )
recvr`   appendr   read_lc_string_list	bytearrayjoinr   ru   r   )r   sockversionrx   rowseofrowdataieof57r>   datass              r   read_text_resultzMySQLProtocol.read_text_result5  s    9$a5j2 Sy1 YY[F  1''8LL,!YY[F ''8 VABZ(33IcN4G4G4NO)s"vay1}nnV,F1INvay1}mmF+33F12J?{w2G$#F++FA5 r   c                 p   |d   t         j                  k(  rd}d}n_|d   t         j                  k(  rd}d}nD|d   t         j                  t         j                  fv rd}d}n|d   t         j
                  k(  rd}d}|d	   t        j                  z  rj                         }|d
 t        |d|       d   fS )z%Parse an integer from a binary packetr   bhr   r   rj   qrW   r   Nr   )
r   TINYSHORTINT24LONGLONGLONGr   UNSIGNEDupperr   )r   r>   fieldformat_lengths        r   _parse_binary_integerz#MySQLProtocol._parse_binary_integer_  s    8y~~%GF1X(GF1X)//9>>::GF1X+++GF8i(((mmoGvwwq8H!I!!LMMr   c                 n    |d   t         j                  k(  rd}d}nd}d}||d t        ||d|       d   fS )z)Parse a float/double from a binary packetr   rW   drj   fNr   )r   DOUBLEr   )r   r>   r   r   r   s        r   _parse_binary_floatz!MySQLProtocol._parse_binary_floats  sL    8y'''FGFGvwwq8H!I!!LMMr   c           	      D   |d   }d}|dk(  r/t        j                  t        d|dd       d   |d   |d         }n\|dk\  rWd}|d	k(  rt        d
|d|dz          d   }t        j                   t        d|dd       d   |d   |d   |d   |d   |d   |      }||dz   d |fS )z&Parse a timestamp from a binary packetr   Nrj   Hr   r   )yearmonthdayr      IrW   rN      )r   r   r   hourminutesecondmicrosecond)datetimedater   )r   r>   r   r   valuemcss         r   _parse_binary_timestampz%MySQLProtocol._parse_binary_timestamp~  s    Q;MM"3q4Q7Qi1IE q[C|#C&1*)=>qA%%"3q4Q7Qi1IAYayay!E vz{#U++r   c                     |d   }|d|dz    }d}|dkD  rt        d|dd       d   }t        d|dd       d   }|d   dk(  r|dz  }t        j                  ||d   ||d	   |d   
      }||dz   d |fS )z'Parse a time value from a binary packetr   r   rW   r   NrN   rX   r   r   )dayssecondsmicrosecondsminuteshours)r   r   	timedelta)r   r>   r   r   rG   r   r   tmps           r   _parse_binary_timez MySQLProtocol._parse_binary_time  s    a
#A:T!"X.q1CS$q),Q/7a<BJD  d)-a.1)-a'+Aw	0 vz{#S))r   c                 ,   t        |      dz   dz   dz  }|d| D cg c]  }t        |       }}||d }g }t        |      D ]  \  }}|t        |dz   dz           d|dz   dz  z  z  r|j                  d       9|d   t        j
                  t        j                  t        j                  t        j                  t        j                  fv r'| j                  ||      \  }}	|j                  |	       |d   t        j                  t        j                  fv r'| j                  ||      \  }}	|j                  |	       |d   t        j                  t        j                  t        j                   fv r(| j#                  ||      \  }}	|j                  |	       Z|d   t        j$                  k(  r(| j'                  ||      \  }}	|j                  |	       t)        j*                  |      \  }}	|j                  |	        t-        |      S c c}w )z(Parse values from a binary result packetr   r   rW   r   Nr   )r(   r   	enumerater   r   r   r   r   r   r   r   r   FLOATr   DATETIMEDATE	TIMESTAMPr   TIMEr   r   rr   tuple)
r   fieldsr>   null_bitmap_lengthr   null_bitmapvaluesposr   r   s
             r   _parse_binary_valuesz"MySQLProtocol._parse_binary_values  s   !&kAo1a7'-a0B'CD!s1vDD*+,#F+ 	%JC3Aqy>*aC!Gq=.@Ad#qinnioo'oo'nni.@.@B B #'"<"<VU"Ke$qi..	@@"&":":65"Ie$qi00)..'113 3"&">">vu"Me$qY^^+"&"9"9&%"He$"'"6"6v">e$+	%. V}7 Es   Hc                 "   g }d}d}d}	 |	 ||fS ||k(  r	 ||fS |j                         }|d   dk(  r| j                  |      }d}n|d   dk(  rd}| j                  ||dd       }|||j                  |       n||t	        |      |dz  })zwRead MySQL binary protocol result

        Reads all or given number of binary resultset rows from the socket.
        Nr   rj   r   rN   r   )r   r   r   r   r   )	r   r   columnsrx   r   r   r   r   r>   s	            r   read_binary_resultz MySQLProtocol.read_binary_result  s    
  c{ Ez c{ YY[FayCnnV,a227F12JG{v1F##F++FA! r   c                 z   |d   dk(  st        j                  d      i }	 t        j                  |dd d      \  }|d<   t        j                  |d      \  }|d<   t        j                  |d      \  }|d	<   |d
d }t        j                  |d      \  }|d<   |S # t        $ r t        j                  d      w xY w)z'Parse a MySQL Binary Protocol OK packetrj   r   zFailed parsing Binary OK packetrN   Nstatement_idr   num_columns
num_paramsr   ro   )r
   r#   r   read_intrs   )r   r>   ok_pkts      r   parse_binary_prepare_okz%MySQLProtocol.parse_binary_prepare_ok  s    ayA~''(IJJ	K/4~~fQRj!/L,VVN+.3nnVQ.G+VVM*-2^^FA-F*VVL)ABZF05vq0I-VVO,   	K''(IJJ	Ks   A8B B:c                    d}d}|dk  r[|dk\  rd}t         j                  }n|dk\  rd}t         j                  }n|dk\  rd}t         j                  }nod	}t         j                  }n\d
}|dk  rd}t         j                  }nB|dk  rd}t         j                  }n*|dk  rd}t         j                  }nt         j                  }d}t        j                  ||      ||fS )z0Prepare an integer for the MySQL binary protocolNr   ir   i r   i   r   r         Bi  r   l    r   Q)r   r   r   r   r   r)   r*   )r   r   r~   r   r   s        r   _prepare_binary_integerz%MySQLProtocol._prepare_binary_integer  s    
19}&^^
&&__
+%&^^
&//
E|&^^
%&__
*$&^^
&//
GU+Z??r   c                 &   t        |t        j                        rt        j                  }n6t        |t        j                        rt        j
                  }nt        d      t        j                  |j                        t        j                  |j                        z   t        j                  |j                        z   }t        |t        j                        r|t        j                  |j                        z   t        j                  |j                        z   t        j                  |j                        z   }|j                   dkD  r"|t        j"                  |j                         z  }t        j                  t%        |            |z   }||fS )a  Prepare a timestamp object for the MySQL binary protocol

        This method prepares a timestamp of type datetime.datetime or
        datetime.date for sending over the MySQL binary protocol.
        A tuple is returned with the prepared value and field type
        as elements.

        Raises ValueError when the argument value is of invalid type.

        Returns a tuple.
        z2Argument must a datetime.datetime or datetime.dater   )
isinstancer   r   r   r   r   rs   r   	int2storer   rB   r   r   r   r   r   r   rA   r(   )r   r   r~   packeds       r   _prepare_binary_timestampz'MySQLProtocol._prepare_binary_timestamp  s$    eX../"++Jx}}-"JDF F //%**-//%++.///%)),- eX../uuzz::ooell34ooell34F   1$%//%*;*;<<V-6
##r   c                    t        |t        j                  t        j                  f      st	        d      t
        j                  }d}d}d}t        |t        j                        r|j                  dk  rd}t        |j                  d      \  }}t        |d      \  }}	|t        j                  t        |j                              t        j                  |      z   t        j                  |      z   t        j                  |	      z   z  }|j                  }n|t        j                  d      t        j                  |j                        z   t        j                  |j                         z   t        j                  |j"                        z   z  }|j$                  }|r|t        j                  |      z  }t        j                  |      |z   }t        j                  t'        |            |z   }||fS )a  Prepare a time object for the MySQL binary protocol

        This method prepares a time object of type datetime.timedelta or
        datetime.time for sending over the MySQL binary protocol.
        A tuple is returned with the prepared value and field type
        as elements.

        Raises ValueError when the argument value is of invalid type.

        Returns a tuple.
        z3Argument must a datetime.timedelta or datetime.timer   Nr   r   i  <   )r   r   r   timers   r   r   r   divmodr   r   rA   absrB   r   r   r   r   r   r(   )
r   r   r~   negativer   r   r   	remainderminssecss
             r   _prepare_binary_timez"MySQLProtocol._prepare_binary_time8  s    %("4"4hmm!DEEG G ^^
eX//0zzA~!'t!<UI!)R0LT4us5::7u-.t,- t,- .F $$Cuq)uzz23u||45 u||45 6F ##Ceooc**F*V3V-6
##r   c                 b    t        j                  |      t        j                  |      z   |z   }|S )zMPrepare long data for prepared statements

        Returns a string.
        )r   rA   r   )r   	statementparamrG   r>   s        r   _prepare_stmt_send_long_dataz*MySQLProtocol._prepare_stmt_send_long_datae  s5     OOI&OOE"# 	 r   c           
      &
   d}dgt        |      dz   dz  z  }g }	g }
d}|i }|rD|rAt        |      t        |      k7  rt        j                  d      t        |      D ]  \  }}||   }d}|_||dz  xx   d|dz  z  z  cc<   |
j	                  t        j                  t        j                        t        j                  |      z          o||v r,||   d   rt        j                  }n@t        j                  }n.t        |t              r(| j                  |      \  }}}|	j	                  |       nt        |t              rt        r1|	j	                  t        j                   t        |            |z          nA|j#                  |      }|	j	                  t        j                   t        |            |z          t        j$                  }n\t        |t&              rB|	j	                  t        j                   t        |            |z          t        j                  }n
t        rct        |t(              rS|j#                  |      }|	j	                  t        j                   t        |            |z          t        j$                  }nt        |t*              rr|	j	                  t        j                   t        t        |      j#                  |                  t        |      j#                  |      z          t        j,                  }nt        |t.              r6|	j	                  t1        j2                  d|             t        j4                  }nt        |t6        j6                  t6        j8                  f      r&| j;                  |      \  }}|	j	                  |       nt        |t6        j<                  t6        j>                  f      r&| jA                  |      \  }}|	j	                  |       n9t        jB                  djE                  |jF                  jH                  	            |
j	                  t        j                  |      t        j                  |      z          	 t        jJ                  |      t        j                  |      z   t        jJ                  |      z   djM                  |D cg c]  }t1        j2                  d
|       c}      z   t        j                  d      z   }|
D ]  }||z  }	 |	D ]  }||z  }	 |S c c}w )z6Make a MySQL packet with the Statement Execute commandr   r   r   rW   r   zTFailed executing prepared statement: data values does not match number of parametersr   z:MySQL binary protocol can not handle '{classname}' objects)	classnamer   )'r(   r
   r#   r   r   r   rB   r   NULLBLOBSTRINGr   r   r   r&   r   lc_intr   VARCHARbytesunicoder   DECIMALfloatr)   r*   r   r   r   r   r   r   r   r$   r%   	__class____name__rA   r   )r   r   rG   
parametersr   long_data_usedr;   iteration_countr   r   typesr   r   r|   r   r~   bitr>   a_typea_values                       r   make_stmt_executezMySQLProtocol.make_stmt_executep  s;    cc$i!m12!N$4yC
O+++23 3 $J/ 95QS	=+qS1W~=+LL!@!&!7"8 9N*%c*1-%.^^
 &/%5%5
s+"::5AVZMM&)s+ell3u:&>&+', - !&W 5!LLU4u<>!*!2!2Ju-MM%,,s5z":U"BC!*J"5'2!LL1EMM%,,s5z":U"BC!*!2!2Jw/MMSU):):#*% && '),U):):7)CDE "+!2!2Ju-MM&++c5"9:!*!1!1J(9(98=='IJ+/+I+I,(VZMM&)(:(:HMM'JK+/+D+DU+K(VZMM&) 11006&+oo&>&> 17 1@A A U__Z8"__U34 5q95x OOL)OOE"#OOO,- HH{Cfkk#s+CDE OOA	 	  	FfF	  	GgF	  Ds   8T
c                     |d   dk(  st        j                  d      t        j                  |dd d      \  }}|r|d   d	k(  r|dd }|j	                  d
      |fS )z&Parse a MySQL AuthSwitchRequest-packetrj   r   z'Failed parsing AuthSwitchRequest packetrN   Nr   rP   rX   r   r   )r
   r#   r   r\   r]   )r   r>   plugin_names      r   parse_auth_switch_requestz'MySQLProtocol.parse_auth_switch_request  sq    ayC''9; ; !& 1 1&*' JfRjAoCR[F!!&)611r   c                 F    |d   dk(  st        j                  d      |dd S )z!Parse a MySQL AuthMoreData-packetrj   r   z"Failed parsing AuthMoreData packetrN   N)r
   r#   )r   r>   s     r   parse_auth_more_dataz"MySQLProtocol.parse_auth_more_data  s1    ayA~''46 6 abzr   )NNN!   r      @FN)r  r   r   )N)NNNr  r   FN)rY   )T)r   ) r!  r   Nr   )r  
__module____qualname____doc__r   r1   r?   rC   rH   rK   rh   ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r!  r   r   r   r   '   s    
. KO+,=B"#J 67)3 CGAB8<"H*X(G
4(6(TN(	N,0*$@8"@B $D+$Z	 CE@FXt
2r   r   )r$  r)   r   decimalr   	constantsr   r   r   r   r	    r
   r   authenticationr   catch23r   r   r   objectr   r!  r   r   <module>r+     s;   0   J J  + ' !u
F u
r   