3
Šãdeþ‹  ã               @   sä   U d Z ddlZddlZddlmZmZ ddlmZmZm	Z	m
Z
mZmZmZ ddlm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mZmZ dd
lmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z( dZ)e*)G dd„ dƒZ+dS )z,Implements the MySQL Client/Server protocol.é    N)ÚDecimalÚDecimalException)ÚAnyÚDictÚListÚOptionalÚSequenceÚTupleÚUnioné   )Úutils)Úget_auth_plugin)ÚPARAMETER_COUNT_AVAILABLEÚ
ClientFlagÚ	FieldFlagÚ	FieldTypeÚ	ServerCmd)ÚDatabaseErrorÚInterfaceErrorÚProgrammingErrorÚget_exception)ÚConnAttrsTypeÚDescriptionTypeÚEofPacketTypeÚHandShakeTypeÚOkPacketTypeÚ%ParseValueFromBinaryResultPacketTypesÚQueryAttrTypeÚ
SocketTypeÚStatsPacketTypeÚ
StrOrBytesÚ!SupportedMysqlBinaryProtocolTypesé
   c               @   s,  e Zd ZdZeeee edœdd„ƒZ	eeee
 ee ee eeee eedœ	dd„ƒZd^ee ee
 ee ee eeeeee ee ee edœdd„Zeeedœdd„ƒZed_eeeedœdd„ƒZed`eee edœdd„ƒZedaeeedœdd„ƒZdbeee
 ee ee eeeee ee ee edœdd„Zeeed œd!d"„ƒZeeeeef d œd#d$„ƒZeeed œd%d&„ƒZeeee d œd'd(„ƒZedceeed*œd+d,„ƒZeed œd-d.„Zeddeee d0œd1d2„ƒZ!dee"eed3f eee#eee d3f  ee f d4œd5d6„Z$eeeeeef d7œd8d9„ƒZ%eeeeee&f d7œd:d;„ƒZ'edfeeeee(f d=œd>d?„ƒZ)eeeeeee*e+j,e+j+f  f d@œdAdB„ƒZ-eeeee+j.f d œdCdD„ƒZ/dge#e eeee0d3f dEœdFdG„Z1dhe"e#e eeee#ee0d3f  ee f dHœdIdJ„Z2eee3eef d œdKdL„ƒZ4eeeeeef dMœdNdO„ƒZ5ee*e+j,e+j+f eeef dMœdPdQ„ƒZ6ee*e+j.e+j7f eeef dMœdRdS„ƒZ8eeeeedTœdUdV„ƒZ9f f d
dd<ddfee:e; e:e< eee3eee f  eee= eedWœ	dXdY„Z>eeeeef d œdZd[„ƒZ?eeed œd\d]„ƒZ@dS )iÚMySQLProtocolzRImplements MySQL client/server protocol

    Create and parses MySQL packets.
    )Úclient_flagsÚdatabaseÚreturnc             C   s    | t j@ r|r|jdƒd S dS )z.Prepare database string for handshake responseÚutf8ó    )r   ZCONNECT_WITH_DBÚencode)r$   r%   © r*   úO/var/www/agendate/envp3/lib/python3.6/site-packages/mysql/connector/protocol.pyÚ_connect_with_dbH   s    zMySQLProtocol._connect_with_db)	r$   ÚusernameÚpasswordr%   Úauth_plugin_classÚauth_pluginÚ	auth_dataÚssl_enabledr&   c             C   s”   |sdS y$t ||ƒ|||||d�}|jƒ }	W n6 ttfk
rb }
 ztd|
› �ƒ|
‚W Y dd}
~
X nX | tj@ rˆt|	ƒ}tjd|ƒ|	 }n|	d }|S )z#Prepare the authentication responser(   )r-   r.   r%   r2   zFailed authentication: Nz<B)	r   Úauth_responseÚ	TypeErrorr   r   ÚSECURE_CONNECTIONÚlenÚstructÚpack)r$   r-   r.   r%   r/   r0   r1   r2   ÚauthZplugin_auth_responseÚerrZresplenr3   r*   r*   r+   Ú_auth_responseO   s"    "
zMySQLProtocol._auth_responseNé-   r   é   @F)Ú	handshaker-   r.   r%   Úcharsetr$   Úmax_allowed_packetr2   r0   Ú
conn_attrsr/   r&   c              C   s.  |dkri }y|d }|	p |d }	W n8 t tfk
r\ } ztd|› d�ƒd‚W Y dd}~X nX |sfd}y|jdƒ}W n tk
rŒ   |}Y nX dd	 }t|ƒ}tjd
|› |› d�||||ƒ}|| j||||||	||ƒ7 }|| j	||ƒ7 }|t
j@ �r||	jdƒd 7 }|t
j@ �r*|
dk	�r*|| j|
ƒ7 }|S )z"Make a MySQL Authentication packetNr1   r0   z&Handshake misses authentication info (ú)ó    r'   Úxé   z<IIHÚsxr(   )r4   ÚKeyErrorr   r)   ÚAttributeErrorr6   r7   r8   r;   r,   r   ÚPLUGIN_AUTHÚCONNECT_ARGSÚmake_conn_attrs)Úselfr>   r-   r.   r%   r?   r$   r@   r2   r0   rA   r/   r1   r:   Úusername_bytesZfillerÚusername_lenÚpacketr*   r*   r+   Ú	make_autht   sL    
zMySQLProtocol.make_auth)rA   r&   c                sº   x ˆ D ]}ˆ | dkrdˆ |< qW t ‡ fdd„ˆ D ƒƒtˆ jƒ ƒ tˆ jƒ ƒ }tjd|ƒ}xXˆ D ]P}|tjdt|ƒƒ7 }||jdƒ7 }|tjdtˆ | ƒƒ7 }|ˆ | jdƒ7 }qbW |S )z Encode the connection attributesNÚ c             3   s"   | ]}t |ƒt ˆ | ƒ V  qd S )N)r6   )Ú.0rD   )rA   r*   r+   ú	<genexpr>¼   s    z0MySQLProtocol.make_conn_attrs.<locals>.<genexpr>z<Br'   )Úsumr6   ÚkeysÚvaluesr7   r8   r)   )rA   Ú	attr_nameZconn_attrs_lenZconn_attrs_packetr*   )rA   r+   rK   µ   s    
.
zMySQLProtocol.make_conn_attrs)r?   r$   r@   r&   c             C   s&   t j|ƒt j|ƒ t j| ƒ dd  S )z Make a SSL authentication packetr(   rE   )r   Ú	int4storeÚ	int2store)r?   r$   r@   r*   r*   r+   Úmake_auth_sslÉ   s    	zMySQLProtocol.make_auth_ssl)ÚcommandÚargumentr&   c             C   s   t j| ƒ}|dk	r||7 }|S )z(Make a MySQL packet containing a commandN)r   Ú	int1store)r[   r\   Údatar*   r*   r+   Úmake_commandÕ   s    
zMySQLProtocol.make_commandr   )Ústatement_idÚrowsr&   c             C   s   t j| ƒt j|ƒ S )z0Make a MySQL packet with Fetch Statement command)r   rX   )r`   ra   r*   r*   r+   Úmake_stmt_fetchÝ   s    zMySQLProtocol.make_stmt_fetch)r>   r-   r.   r%   r?   r$   r2   r0   rA   r/   r&   c              C   s"  y|d }|p|d }W n8 t tfk
rP } ztd|› d�ƒd‚W Y dd}~X nX |sZd}y|jdƒ}W n tk
r€   |}Y nX t|ƒ}tjd|› d	�tj	|ƒ}|| j
|||||
|||ƒ7 }|| j||ƒ7 }|tjd
|ƒ7 }|tj@ rú||jdƒd 7 }|tj@ �r|	dk	�r|| j|	ƒ7 }|S )z0Make a MySQL packet with the Change User commandr1   r0   z&Handshake misses authentication info (rB   NrC   r'   z<BrF   z<Hr(   )r4   rG   r   r)   rH   r6   r7   r8   r   ZCHANGE_USERr;   r,   r   rI   rJ   rK   )rL   r>   r-   r.   r%   r?   r$   r2   r0   rA   r/   r1   r:   rM   rN   rO   r*   r*   r+   Úmake_change_userâ   sD    


zMySQLProtocol.make_change_user)rO   r&   c       	   	   C   s’  i }t jd| dd… ƒd |d< |d tkrDtd|d › dt› �ƒ‚tj| dd… dd	�\} |d
< t jd| dd… ƒ\|d< }}|d< |d< }}|d
 jƒ |d
< | dd… } tj|| ƒ}d}|tj	@ �r|rÜt
d|d ƒnd}| d|… }| |d… } |d dk�r|dd… }|tj@ �rrd| k�rH|d
 jdƒ�rHd|  } |d< ntj| dd	�\} |d< |d jdƒ|d< nd|d< || |d< ||d< |S )zParse a MySQL Handshake-packetz<xxxxBr   é   Úprotocolz$Protocol mismatch; server version = z, client version = Nr(   )ÚendZserver_version_originalz<I8sx2sBH2sBxxxxxxxxxxé   Zserver_threadidr?   Zserver_statusrC   é   é   r   z5.5.8r0   zutf-8Zmysql_native_passwordr1   Úcapabilitieséÿÿÿÿrk   )r7   ÚunpackÚPROTOCOL_VERSIONr   r   Úread_stringÚdecodeZintreadr   r5   ÚminrI   Ú
startswith)	rO   ÚresZ
auth_data1Zcapabilities1Zcapabilities2Zauth_data_lengthrj   Z
auth_data2Úsizer*   r*   r+   Úparse_handshake  s8    .zMySQLProtocol.parse_handshakec             C   s@   t j| dƒ\} }|dkr tdƒ‚t j| dd�\} }| |jdƒfS )z$Parse a MySQL AuthNextFactor packet.r   é   z.Failed parsing AuthNextFactor packet (invalid)r(   )rf   zutf-8)r   Úread_intr   rn   ro   )rO   Ústatusr0   r*   r*   r+   Úparse_auth_next_factorS  s
    z$MySQLProtocol.parse_auth_next_factorc             C   sê   | d dkst dƒ‚i }y tjd| dd… ƒd |d< tj| dd… ƒ\} |d< tj| ƒ\} |d	< tjd
| dd… ƒ\|d< |d< | dd… } | r¶tj| ƒ\} |d< |d jdƒ|d< W n, tk
rä } zt dƒ|‚W Y dd}~X nX |S )zParse a MySQL OK-packeté   r   z#Failed parsing OK packet (invalid).z<xxxxBrd   Zfield_countNZaffected_rowsZ	insert_idz<HHÚstatus_flagÚwarning_countZinfo_msgzutf-8zFailed parsing OK packet.)r   r7   rl   r   Úread_lc_intÚread_lc_stringro   Ú
ValueError)rO   Z	ok_packetr:   r*   r*   r+   Úparse_ok\  s     zMySQLProtocol.parse_okc             C   sR   yt j| dd… ƒd }|S  tjtfk
rL } ztdƒ|‚W Y dd}~X nX dS )z=Parse a MySQL packet with the number of columns in result setry   Nr   zFailed parsing column count)r   r|   r7   Úerrorr~   r   )rO   Úcountr:   r*   r*   r+   Úparse_column_counts  s
    z MySQLProtocol.parse_column_countúutf-8)rO   Úencodingr&   c             C   s¼   t j| dd… ƒ\} }t j| ƒ\} }t j| ƒ\} }t j| ƒ\} }t j| ƒ\} }t j| ƒ\} }ytjd| ƒ\}}}}}W n  tjk
r–   tdƒd‚Y nX |j|ƒ|dddd| tj@ ||f	S )zParse a MySQL column-packetry   Nz	<xHIBHBxxz!Failed parsing column information)	r   r}   r7   rl   r€   r   ro   r   ZNOT_NULL)rO   r„   Ú_Únamer?   Zcolumn_typeÚflagsr*   r*   r+   Úparse_column|  s&    
zMySQLProtocol.parse_columnc             C   sš   |d dkr| j |ƒS d}i }ytjd|ƒ}W n. tjk
r\ } zt|ƒ|‚W Y dd}~X nX |d dkott|ƒdks~t|ƒ‚|d	 |d
< |d |d< |S )zParse a MySQL EOF-packetry   r   zFailed parsing EOF packet.z<xxxBBHHNr   éþ   é	   ru   r{   é   rz   )r   r7   rl   r€   r   r6   )rL   rO   Úerr_msgrr   Úunpackedr:   r*   r*   r+   Ú	parse_eof�  s    
zMySQLProtocol.parse_eofT)rO   Úwith_headerr&   c       	   (   C   s$  d}i }dg}d}|r*| dd… j dƒ}n
| j dƒ}xê|D ]â}ydd„ |j dd	ƒD ƒ\}}W n, tk
rˆ } zt|ƒ|‚W Y dd}~X nX |jd
ƒ}yt|ƒ||< W q: ttfk
�r   yt|jd
ƒƒ||< W nD tk
�r } z&t|› d|› dt|ƒ› d�ƒ|‚W Y dd}~X nX Y q:X q:W |S )zParse the statistics packetz)Failed getting COM_STATISTICS informationrC   ry   Ns     c             S   s   g | ]}|j ƒ ‘qS r*   )Ústrip)rR   Úvr*   r*   r+   ú
<listcomp>¿  s    z2MySQLProtocol.parse_statistics.<locals>.<listcomp>ó   :ru   zutf-8z (ú:rB   )	Úsplitr~   r   ro   ÚintrG   r   r   Úrepr)	rO   r�   Úerrmsgrr   ÚpairsZlblÚpairÚvalr:   r*   r*   r+   Úparse_statistics±  s*    


<zMySQLProtocol.parse_statistics.)ÚsockÚversionr�   r&   c             C   s*  |}g }d}d}d}�x
|s$||kr&P |j ƒ }	|	jdƒr |	dd… g}
|j ƒ }	x(|	jdƒrv|
j|	dd… ƒ |j ƒ }	qPW |
j|	dd… ƒ tjtdƒj|
ƒƒ}n>|	d dkrÈ|	d dk rÈ| j|	ƒ}d}nd}tj|	dd… ƒ}|dkrú|dk	rú|j|ƒ n|dk�r|dk�rt|	ƒ‚|d7 }qW ||fS )	z¶Read 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   s   ÿÿÿry   rC   r‰   é   r   )	Úrecvrq   Úappendr   Zread_lc_string_listÚ	bytearrayÚjoinrŽ   r   )rL   r�   rž   r�   r…   ra   ÚeofZrowdataÚirO   Zdatasr*   r*   r+   Úread_text_resultÎ  s8    

zMySQLProtocol.read_text_result)rO   Úfieldr&   c             C   sž   |d t jkrd}d}nL|d t jkr0d}d}n4|d t jt jfkrNd}d}n|d t jkrdd}d}|d	 tj@ rz|jƒ }| |d
… t	j
|| d|… ƒd fS )z%Parse an integer from a binary packetr   z<bz<hru   z<iry   z<qri   rŸ   Nr   )r   ÚTINYÚSHORTÚINT24ÚLONGÚLONGLONGr   ZUNSIGNEDÚupperr7   rl   )rO   r§   Úformat_Úlengthr*   r*   r+   Ú_parse_binary_integer÷  s    z#MySQLProtocol._parse_binary_integerc             C   sD   |d t jkrd}d}nd}d}| |d… tj|| d|… ƒd fS )z)Parse a float/double from a binary packetr   ri   z<dry   z<fNr   )r   ÚDOUBLEr7   rl   )rO   r§   r¯   r®   r*   r*   r+   Ú_parse_binary_float  s    z!MySQLProtocol._parse_binary_floatr'   )rO   r?   r&   c             C   s    t j| ƒ\} }| t|j|ƒƒfS )z(Parse a New Decimal from a binary packet)r   r}   r   ro   )rO   r?   Úvaluer*   r*   r+   Ú_parse_binary_new_decimal  s    z'MySQLProtocol._parse_binary_new_decimal)rO   Ú
field_typer&   c          	   C   sô   | d }d}|dkrpt jd| dd… ƒd }| d }| d }|tjtjfkr^tj|||d�}qàtj|||d�}np|dkràd}|d	kr t jd
| d|d … ƒd }tjt jd| dd… ƒd | d | d | d | d | d |d�}| |d d… |fS )z&Parse a timestamp from a binary packetr   Nry   z<Hr   r‹   )ÚyearÚmonthÚdayrŸ   é   z<Iri   rd   é   )r¶   r·   r¸   ÚhourÚminuteÚsecondÚmicrosecond)r7   rl   r   ÚDATETIMEÚ	TIMESTAMPÚdatetimeÚdate)rO   rµ   r¯   r³   r¶   r·   r¸   Úmcsr*   r*   r+   Ú_parse_binary_timestamp$  s,    z%MySQLProtocol._parse_binary_timestampc             C   s´   | d }|s | dd… t jƒ fS | d|d … }d}|dkrTtjd|dd… ƒd }tjd|dd… ƒd }|d dkr€|d
9 }t j||d ||d |d d	�}| |d d… |fS )z'Parse a time value from a binary packetr   r   Nri   z<Ird   rŸ   rº   )ÚdaysÚsecondsÚmicrosecondsÚminutesÚhoursrk   )rÁ   Ú	timedeltar7   rl   )rO   r¯   r^   rÃ   rÅ   Útmpr*   r*   r+   Ú_parse_binary_timeD  s"    z MySQLProtocol._parse_binary_time)ÚfieldsrO   r?   r&   c       
      C   sÖ  t |ƒd d d }dd„ |d|… D ƒ}||d… }g }d}�xŒt|ƒD �]~\}}	|t|d d ƒ d|d d > @ r„|jdƒ qJ|	d tjtjtjtjtj	fkrÀ| j
||	ƒ\}}|j|ƒ qJ|	d tjtjfkrð| j||	ƒ\}}|j|ƒ qJ|	d tjtjfk�r"| j||ƒ\}}|j|ƒ qJ|	d tjtjtjfk�r\| j||	d ƒ\}}|j|ƒ qJ|	d tjk�r†| j|ƒ\}}|j|ƒ qJtj|ƒ\}}y|j|j|ƒƒ W qJ tk
�rÈ   |j|ƒ Y qJX qJW t|ƒS )	z(Parse values from a binary result packetrŸ   ru   ri   c             S   s   g | ]}t |ƒ‘qS r*   )r–   )rR   r¥   r*   r*   r+   r’   c  s    z6MySQLProtocol._parse_binary_values.<locals>.<listcomp>r   Nr   )r6   Ú	enumerater–   r¡   r   r¨   r©   rª   r«   r¬   r°   r±   ÚFLOATr²   ÚDECIMALZ
NEWDECIMALr´   r¿   ÚDATErÀ   rÄ   ÚTIMErÌ   r   r}   ro   ÚUnicodeDecodeErrorÚtuple)
rL   rÍ   rO   r?   Znull_bitmap_lengthÚnull_bitmaprV   r³   Úposr§   r*   r*   r+   Ú_parse_binary_values[  sL    $

z"MySQLProtocol._parse_binary_values)r�   Úcolumnsr�   r?   r&   c       
      C   s¸   g }d}d}d}xž|dk	rP ||kr&P |j ƒ }	|	d dkrJ| j|	ƒ}d}n&|	d dkrpd}| j||	dd… |ƒ}|dkrŒ|dk	rŒ|j|ƒ n|dkr¤|dkr¤t|	ƒ‚|d7 }qW ||fS )zwRead MySQL binary protocol result

        Reads all or given number of binary resultset rows from the socket.
        Nr   ry   r‰   rd   r   )r    rŽ   r×   r¡   r   )
rL   r�   rØ   r�   r?   ra   r¤   rV   r¥   rO   r*   r*   r+   Úread_binary_resultŽ  s,    
z MySQLProtocol.read_binary_resultc             C   s²   | d dkst dƒ‚i }yhtj| dd… dƒ\} |d< tj| dƒ\} |d< tj| dƒ\} |d	< | d
d… } tj| dƒ\} |d< W n, tk
r¬ } zt dƒ|‚W Y dd}~X nX |S )z'Parse a MySQL Binary Protocol OK packetry   r   zFailed parsing Binary OK packetrd   Nr`   ru   Znum_columnsZ
num_paramsr   r{   )r   r   rv   r~   )rO   Zok_pktr:   r*   r*   r+   Úparse_binary_prepare_ok³  s    z%MySQLProtocol.parse_binary_prepare_ok)r³   r&   c             C   s´   d}d}| dk rX| dkr$d}t j}q¢| dkr8d}t j}q¢| dkrLd}t j}q¢d	}t j}nJd}| d
krpd}t j}n2| 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   é€   z<bi €  z<hl        z<iz<qéÿ   z<Biÿÿ  z<Hl   ÿÿ z<Iz<Qi€ÿÿÿi €ÿÿi   €)r   r¨   r©   r«   r¬   r7   r8   )r³   rµ   r‡   r®   r*   r*   r+   Úprepare_binary_integerÅ  s6    z$MySQLProtocol.prepare_binary_integerc             C   s¼   t | tjƒrtj}nt | tjƒr(tj}ntdƒ‚tj| j	ƒtj
| jƒ tj
| jƒ }t | tjƒr¢|tj
| jƒ tj
| jƒ tj
| jƒ }| jdkr¢|tj| jƒ7 }tj
t|ƒƒ| }||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Ñ   r~   r   rY   r¶   r]   r·   r¸   r»   r¼   r½   r¾   rX   r6   )r³   rµ   Úpackedr*   r*   r+   Úprepare_binary_timestampç  s    $(
z&MySQLProtocol.prepare_binary_timestampc       	      C   s  t | tjtjfƒstdƒ‚tj}d}d}d}t | tjƒrž| jdk rFd}t| j	dƒ\}}t|dƒ\}}|t
jt| jƒƒt
j|ƒ t
j|ƒ t
j|ƒ 7 }| j}n8|t
jdƒt
j| jƒ t
j| jƒ t
j| jƒ 7 }| j}|rè|t
j|ƒ7 }t
j|ƒ| }t
jt|ƒƒ| }||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   NrC   r   i  é<   )rÞ   rÁ   rÊ   Útimer~   r   rÒ   rÅ   ÚdivmodrÆ   r   rX   Úabsr]   rÇ   r»   r¼   r½   r¾   r6   )	r³   rµ   ÚnegativerÃ   rß   rÉ   Ú	remainderZminsZsecsr*   r*   r+   Úprepare_binary_time  s,    
00z!MySQLProtocol.prepare_binary_time)Ú	statementÚparamr^   r&   c             C   s   t j| ƒt j|ƒ | }|S )zMPrepare long data for prepared statements

        Returns a string.
        )r   rX   rY   )rè   ré   r^   rO   r*   r*   r+   Úprepare_stmt_send_long_dataC  s    z)MySQLProtocol.prepare_stmt_send_long_data)	r`   r^   Ú
parametersr‡   Úlong_data_usedr?   Úquery_attrsÚconverter_str_fallbackr&   c	             C   s   d}	dgt |ƒd d  }
g }g }d}t |ƒ}g }|s:|n|t }|dkrNd}|dkrZi }|r˜t|ƒ}x|D ]\}}|j|ƒ qlW dgt |ƒd d  }
|s¢|�r4|t |ƒkr¶td	ƒ‚�xzt|ƒD �]l\}}d}|dk�r|
|d   d|d > O  < |jtjtj	ƒtj|ƒ ƒ qÂ||k�r>|| d �r4tj
}ntj}�nšt|tƒ�rh| j|ƒ\}}}|j|ƒ �npt|tƒ�r |j|ƒ}|jtjt |ƒƒ| ƒ tj}�n8t|tƒ�rÎ|jtjt |ƒƒ| ƒ tj
}�n
t|tƒ�r|jtjt t|ƒj|ƒƒƒt|ƒj|ƒ ƒ tj}nÊt|tƒ�r4|jtjd
|ƒƒ tj}n¤t|tjtjfƒ�rb| j|ƒ\}}|j|ƒ nvt|tjtjfƒ�r�| j|ƒ\}}|j|ƒ nH|�rÄt|ƒj|ƒ}|jtjt |ƒƒ| ƒ tj}nt d|j!j"› d�ƒ‚|jtj|ƒtj|ƒ ƒ |rÂ|d |krÂ|||  d j|ƒ}|jtjt |ƒƒ| ƒ qÂW tj#|ƒtj|ƒ tj#|	ƒ }|dk	�rj|t |ƒ }n|}|�r|dk	�rŒ|tj|ƒ7 }|dj$dd„ |
D ƒƒtjdƒ 7 }d}xP|D ]H}||7 }|dk	�rö|d |k�rî||||  7 }n|d7 }|d7 }�q¸W x|D ]}||7 }�q
W |S )z6Make a MySQL packet with the Statement Execute commandr   r   rŸ   ri   rC   Zutf8mb4r'   NzTFailed executing prepared statement: data values does not match number of parametersz<dz&MySQL binary protocol can not handle 'z	' objectsc             S   s   g | ]}t jd |ƒ‘qS )ÚB)r7   r8   )rR   Úbitr*   r*   r+   r’   ¼  s    z3MySQLProtocol.make_stmt_execute.<locals>.<listcomp>r(   )%r6   r   Úlistr¡   r   rÎ   r   r]   r   ZNULLZBLOBÚSTRINGrÞ   r–   rÝ   Ústrr)   Zlc_intZVARCHARÚbytesr   rÐ   Úfloatr7   r8   r±   rÁ   rÂ   rà   rÊ   râ   rç   r   Ú	__class__Ú__name__rX   r£   )rL   r`   r^   rë   r‡   rì   r?   rí   rî   Ziteration_countrÕ   rV   Útypesrß   Zdata_lenZquery_attr_namesr…   Zattr_valrÖ   r³   Ú_flagsrµ   r†   rO   Zparameter_countr�   Za_typeZa_valuer*   r*   r+   Úmake_stmt_executeN  s®    











zMySQLProtocol.make_stmt_executec             C   sX   | d dkst dƒ‚tj| dd… dd�\} }| rJ| d d	krJ| dd… } |jd
ƒ| fS )z&Parse a MySQL AuthSwitchRequest-packetry   r‰   z'Failed parsing AuthSwitchRequest packetrd   Nr(   )rf   r   r   r'   rk   rk   )r   r   rn   ro   )rO   Zplugin_namer*   r*   r+   Úparse_auth_switch_requestÑ  s    z'MySQLProtocol.parse_auth_switch_requestc             C   s    | d dkst dƒ‚| dd… S )z!Parse a MySQL AuthMoreData-packetry   r   z"Failed parsing AuthMoreData packetrd   N)r   )rO   r*   r*   r+   Úparse_auth_more_dataÝ  s    z"MySQLProtocol.parse_auth_more_data)
NNNr<   r   r=   FNNN)r<   r   r=   )N)r   )	NNNr<   r   FNNN)rƒ   )T)r   )r'   )rƒ   )r   rƒ   )Ar÷   Ú
__module__Ú__qualname__Ú__doc__Ústaticmethodr–   r   ró   rô   r,   r    Úboolr;   r   r   rP   rK   r¢   rZ   r_   rb   rc   rt   r	   rx   r   r   r‚   r   rˆ   r   rŽ   r   rœ   r   r   r¦   r°   rõ   r²   r   r´   r
   rÁ   rÂ   rÄ   rÊ   rÌ   r   r×   rÙ   r   rÚ   rÝ   rà   râ   rç   rê   r   r!   r   r   rú   rû   rü   r*   r*   r*   r+   r#   B   sÒ            44	        .13 *'(2 !&00yr#   ),rÿ   rÁ   r7   Údecimalr   r   Útypingr   r   r   r   r   r	   r
   rQ   r   Zauthenticationr   Ú	constantsr   r   r   r   r   Úerrorsr   r   r   r   rø   r   r   r   r   r   r   r   r   r   r    r!   rm   r–   r#   r*   r*   r*   r+   Ú<module>   s   $4