B
    Ñš[±J  ã               @   s²   d Z ddlmZ ddlZddlZddlZddlZyddlZW n   Y nX ddlm	Z	m
Z
 ddlmZmZmZ dd„ Zd	d
„ ZG dd„ deƒZG dd„ deƒZG dd„ deƒZdS )zGModule implementing low-level socket communication with MySQL servers.
é    )ÚdequeNé   )Ú	constantsÚerrors)ÚPY2Úinit_bytearrayÚstruct_unpackc             C   s    | j st| ƒS dj| j | jd�S )z_Reformat the IOError error message

    This function reformats the IOError error message.
    z{errno} {strerr})ÚerrnoZstrerr)r	   ÚstrÚformatÚstrerror)Úerr© r   ú›C:\Users\HIRONO~1\AppData\Local\Temp\pip-install-ioykiiwb\mysql-connector-python-rf\mysql_connector_python_rf-2.2.2.data\purelib\mysql\connector\network.pyÚ_strioerror+   s    r   c             C   sŒ   g }t | ƒ}tj}xJ||kr\| dt d|¡ | d|…  ¡ | |d… } t | ƒ}|d }qW | t d|¡dd… t d|¡ |  ¡ |S )z0Prepare a packet for sending to the MySQL servers   ÿÿÿz<BNr   z<Ir   é   )Úlenr   ÚMAX_PACKET_LENGTHÚappendÚstructÚpack)ÚbufÚpktnrÚpktsÚpllenÚ	maxpktlenr   r   r   Ú_prepare_packets5   s    
&r   c               @   sº   e Zd ZdZdd„ Zedd„ ƒZedd„ ƒZdd	„ Zd
d„ Z	dd„ Z
dd„ Zd%dd„ZeZd&dd„Zdd„ Zdd„ Zejdd… dkr�eZeZneZdd„ Zdd„ Zd d!„ Zd'd#d$„ZdS )(ÚBaseMySQLSocketa  Base class for MySQL socket communication

    This class should not be used directly but overloaded, changing the
    at least the open_connection()-method. Examples of subclasses are
      mysql.connector.network.MySQLTCPSocket
      mysql.connector.network.MySQLUnixSocket
    c             C   s*   d | _ d | _d| _d| _tƒ | _d| _d S )Néÿÿÿÿi    )ÚsockÚ_connection_timeoutÚ_packet_numberÚ_compressed_packet_numberr   Ú_packet_queueZrecvsize)Úselfr   r   r   Ú__init__N   s    zBaseMySQLSocket.__init__c             C   s"   | j d | _ | j dkrd| _ | j S )zIncrements the packet numberr   éÿ   r   )r!   )r$   r   r   r   Únext_packet_numberV   s    
z"BaseMySQLSocket.next_packet_numberc             C   s"   | j d | _ | j dkrd| _ | j S )z'Increments the compressed packet numberr   r&   r   )r"   )r$   r   r   r   Únext_compressed_packet_number^   s    
z-BaseMySQLSocket.next_compressed_packet_numberc             C   s   t ‚dS )zOpen the socketN)ÚNotImplementedError)r$   r   r   r   Úopen_connectionf   s    zBaseMySQLSocket.open_connectionc             C   s   t ‚dS )zGet the location of the socketN)r)   )r$   r   r   r   Úget_addressj   s    zBaseMySQLSocket.get_addressc          	   C   s@   y | j  tj¡ | j  ¡  | `W n tjtfk
r:   Y nX dS )z&Shut down the socket before closing itN)r   ÚshutdownÚsocketÚ	SHUT_RDWRÚcloser#   ÚerrorÚAttributeError)r$   r   r   r   r,   n   s    
zBaseMySQLSocket.shutdownc          	   C   s2   y| j  ¡  | `W n tjtfk
r,   Y nX dS )zClose the socketN)r   r/   r#   r-   r0   r1   )r$   r   r   r   Úclose_connectionw   s
    
z BaseMySQLSocket.close_connectionNc             C   s¶   |dkr| j  n|| _t|| jƒ}xŽ|D ]†}y&trD| j t|ƒ¡ n| j |¡ W q( tk
rŽ } ztj	d|  
¡ t|ƒfd�‚W dd}~X Y q( tk
r¬   tj	dd�‚Y q(X q(W dS )z Send packets to the MySQL serverNi  )r	   ÚvaluesiÖ  )r	   )r'   r!   r   r   r   ÚsendallÚbufferÚIOErrorr   ÚOperationalErrorr+   r   r1   )r$   r   Úpacket_numberÚcompressed_packet_numberÚpacketsÚpacketr   r   r   r   Ú
send_plain   s    
&zBaseMySQLSocket.send_plainc             C   sV  |dkr| j  n|| _|dkr&| j n|| _| j}t|ƒ}g }tj}||k�rìt||ƒ}tr‚t	ƒ }	x|D ]}
|	|
7 }	qhW t
|	ƒ}	n
d |¡}	~t |	dd… ¡}t dt|ƒ¡dd… t d| j¡ d }trÖt
|ƒ}| || ¡ |	dd… }	t|	ƒ}| j x‚||k�r€t |	d|… ¡}t dt|ƒ¡dd… t d| j¡ d	 }t�rTt
|ƒ}| || ¡ |	|d… }	t|	ƒ}| j �q W |	�rèt |	¡}t dt|ƒ¡dd… t d| j¡ t d|¡dd…  }t�rÚt
|ƒ}| || ¡ ~	næt d|¡dd… t d|¡ | }
t�rt
|
ƒ}
t|
ƒ}|d
k�r€t |
¡}| t dt|ƒ¡dd… t d| j¡ t d|¡dd…  | ¡ nRt d|¡dd… t d| j¡ t dd¡dd…  }t�rÄt
|ƒ}| ||
 ¡ x~|D ]v}y| j |¡ W n^ tk
�r* } ztjd|  ¡ t|ƒfd�‚W dd}~X Y n" tk
�rJ   tjdd�‚Y nX �qØW dS )z+Send compressed packets to the MySQL serverNó    i @  z<Ir   r   z<Bs    @ s   ÿÿÿé2   i  )r	   r3   iÖ  )r	   )r'   r!   r(   r"   r   r   r   r   r   Ú	bytearrayr5   ÚjoinÚzlibÚcompressr   r   r   r   r4   r6   r   r7   r+   r   r1   )r$   r   r8   r9   r   r   Zzpktsr   r   ZtmpbufÚpktZzbufÚheaderZ
zip_packetr   r   r   r   Úsend_compressed•   s~    




**
:$

B6
&zBaseMySQLSocket.send_compressedc       	   
   C   sP  �y
t dƒ}d}x<|dk rL| j d| ¡}|s:tjdd�‚||7 }t|ƒ}qW |d | _tr~t 	dt
|dd… d ƒ¡d }nt d|dd… d ¡d }|}| t |ƒ¡ t|ƒ}|dd	… }xH|�r| j ||¡}|dkrò|dkròtjdd�‚||d	… }||8 }qÂW |S  tk
�rJ } ztjd
|  ¡ t|ƒfd�‚W d	d	}~X Y nX d	S )z%Receive packets from the MySQL serverr=   r   é   iÝ  )r	   r   z<Ió    Ni  )r	   r3   )r?   r   Úrecvr   ÚInterfaceErrorr   r!   r   r   Úunpack_fromr5   ÚunpackÚextendÚ
memoryviewÚ	recv_intor6   r7   r+   r   )	r$   r;   Z
packet_lenÚchunkÚpayload_lenÚrestZpacket_viewÚreadr   r   r   r   Ú
recv_plainê   s:    

zBaseMySQLSocket.recv_plainc          
   C   s  yÀt dƒ}d}x<|dk rJ| j d| ¡}|s8tjdd�‚||7 }t|ƒ}qW |d | _td|dd… d ƒd }|}tdƒ}x<|dkr¸| j |¡}|s¢tjdd�‚||7 }|t|ƒ }q~W || S  t	k
� rþ } ztj
d	|  ¡ t|ƒfd
�‚W dd}~X Y nX dS )z%Receive packets from the MySQL serverr=   r   rF   iÝ  )r	   r   z<IrG   i  )r	   r3   N)r?   r   rH   r   rI   r   r!   r   r   r6   r7   r+   r   )r$   rD   Z
header_lenrO   rP   rQ   Úpayloadr   r   r   r   Úrecv_py26_plain  s.    


zBaseMySQLSocket.recv_py26_plainr   é   )rV   é   c             C   st   xn|rnt r(t d|dd… d ¡d }nt d|dd… d ¡d }| j |d|d … ¡ ||d d… }qW dS )zSplit compressed payloadz<Ir   r   rG   rF   N)r   r   rJ   rK   r#   r   )r$   Zpacket_bunchÚpayload_lengthr   r   r   Ú_split_zipped_payload5  s    z%BaseMySQLSocket._split_zipped_payloadc          
   C   sz  y| j  ¡ }|d | _|S  tk
r,   Y nX tdƒ}g }�yz| j d¡}x(|rrt|ƒdk rr||7 }| j d¡}qLW �x<|�r²t|ƒdk r–tj	dd�‚t
d|dd… d	 ƒd }|d | _t
d|d
d… d	 ƒd }t|ƒ}xHt|ƒ|k �r$| j |t|ƒ ¡}t|ƒdk�rtj	dd�‚|| }qÞW |dk�rR|  |¡ | j  ¡ }|d | _|S | ||f¡ |dk�rlP tdƒ}| j d¡}x.|�r®t|ƒdk �r®||7 }| j d¡}�q‚W qxW W n> tk
�rô }	 ztjd|  ¡ t|	ƒfd�‚W dd}	~	X Y nX tdƒ}
x:|D ]2\}}t�r&|
t t|ƒ¡7 }
n|
t |¡7 }
�qW |  |
¡ ~
y| j  ¡ }|d | _|S  tk
�rt   Y nX dS )z0Receive compressed packets from the MySQL serverr   r=   r   é   iÝ  )r	   z<Ir   rG   rF   i @  i  )r	   r3   N)r#   Úpopleftr!   Ú
IndexErrorr?   r   rH   r   r   rI   r   r"   r   rY   r   r6   r7   r+   r   r   rA   Ú
decompressr5   )r$   rC   rD   r:   ZabyteZzip_payload_lengthrX   Zzip_payloadrO   r   ÚtmprT   r   r   r   Úrecv_compressedB  sp    








(


zBaseMySQLSocket.recv_compressedc             C   s
   || _ dS )zSet the connection timeoutN)r    )r$   Útimeoutr   r   r   Úset_connection_timeout‘  s    z&BaseMySQLSocket.set_connection_timeoutFc          
   C   sä   | j stjdd�‚y@|r tj}ntj}tj| j ||||dtj|d�| _ | j  ¡  W nŒ t	k
rp   t 
d¡‚Y np tjtfk
r° } ztjd|  ¡ t|ƒfd�‚W dd}~X Y n0 tk
rÞ } zt t|ƒ¡‚W dd}~X Y nX dS )	zSwitch the socket to use SSLi   )r	   F)ÚkeyfileÚcertfileÚca_certsÚ	cert_reqsÚdo_handshake_on_connectÚssl_versionÚciphersz&Python installation has no SSL supporti  )r	   r3   N)r   r   rI   ÚsslÚCERT_REQUIREDÚ	CERT_NONEÚwrap_socketÚPROTOCOL_TLSv1Údo_handshakeÚ	NameErrorZNotSupportedErrorÚSSLErrorr6   r+   r   r)   r
   )r$   ÚcaÚcertÚkeyZverify_certÚcipherre   r   r   r   r   Úswitch_to_ssl–  s&    

&zBaseMySQLSocket.switch_to_ssl)NN)NN)FN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r%   Úpropertyr'   r(   r*   r+   r,   r2   r<   ÚsendrE   rS   rU   ÚsysÚversion_inforH   rY   r_   ra   ru   r   r   r   r   r   E   s.   	 
 
T&Or   c                   s2   e Zd ZdZd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
ÚMySQLUnixSocketzoMySQL socket class using UNIX sockets

    Opens a connection through the UNIX socket of the MySQL Server.
    ú/tmp/mysql.sockc                s   t t| ƒ ¡  || _d S )N)Úsuperr~   r%   Úunix_socket)r$   r�   )Ú	__class__r   r   r%   ¹  s    zMySQLUnixSocket.__init__c             C   s   | j S )N)r�   )r$   r   r   r   r+   ½  s    zMySQLUnixSocket.get_addressc          
   C   s¢   y2t   t jt j¡| _| j | j¡ | j | j¡ W nj tk
rn } zt	j
d|  ¡ t|ƒfd�‚W d d }~X Y n0 tk
rœ } zt	 
t|ƒ¡‚W d d }~X Y nX d S )NiÒ  )r	   r3   )r-   ÚAF_UNIXÚSOCK_STREAMr   Ú
settimeoutr    Úconnectr�   r6   r   rI   r+   r   Ú	Exceptionr
   )r$   r   r   r   r   r*   À  s    &zMySQLUnixSocket.open_connection)r   )rv   rw   rx   ry   r%   r+   r*   Ú__classcell__r   r   )r‚   r   r~   ³  s   r~   c                   s2   e Zd ZdZd‡ fdd„	Zdd„ Zd	d
„ Z‡  ZS )ÚMySQLTCPSocketzXMySQL socket class using TCP/IP

    Opens a TCP/IP connection to the MySQL Server.
    ú	127.0.0.1éê  Fc                s*   t t| ƒ ¡  || _|| _|| _d| _d S )Nr   )r€   r‰   r%   Úserver_hostÚserver_portÚ
force_ipv6Ú_family)r$   ÚhostÚportrŽ   )r‚   r   r   r%   Ò  s
    zMySQLTCPSocket.__init__c             C   s   d  | j| j¡S )Nz{0}:{1})r   rŒ   r�   )r$   r   r   r   r+   Ù  s    zMySQLTCPSocket.get_addressc       	   
   C   s�  dgd }y”t  | j| jdt jt j¡}x<|D ]4}| jrL|d t jkrL|}P q,|d t jkr,|}P q,W | jrˆ|d dkrˆt	 
d | j¡¡‚|d dkrœ|d }W n< tk
rÚ } zt	j
d|  ¡ t|ƒfd�‚W dd}~X Y nX |\| _}}}}y0t   | j||¡| _| j | j¡ | j |¡ W nn tk
�rZ } zt	j
d|  ¡ t|ƒfd�‚W dd}~X Y n2 tk
�rŠ } zt	 t|ƒ¡‚W dd}~X Y nX dS )z7Open the TCP/IP connection to the MySQL server
        Né   r   zNo IPv6 address found for {0}iÓ  )r	   r3   )r-   ÚgetaddrinforŒ   r�   r„   ÚSOL_TCPrŽ   ÚAF_INET6ÚAF_INETr   rI   r   r6   r+   r   r�   r   r…   r    r†   r‡   r7   r
   )	r$   ZaddrinfoZ	addrinfosÚinfor   ÚsocktypeÚprotoÚ_Zsockaddrr   r   r   r*   Ü  s>    

(&zMySQLTCPSocket.open_connection)rŠ   r‹   F)rv   rw   rx   ry   r%   r+   r*   rˆ   r   r   )r‚   r   r‰   Ì  s   r‰   )ry   Úcollectionsr   r-   r   r|   rA   ri   Ú r   r   Zcatch23r   r   r   r   r   Úobjectr   r~   r‰   r   r   r   r   Ú<module>   s$   
  p