o
    –¨Êh¥N  ã                   @   s®   d Z ddlmZ ddlZddlZddlZddlZzddlZW n   Y 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})ÚerrnoÚstrerr)r	   ÚstrÚformatÚstrerror)Úerr© r   úI/var/www/html/env/lib/python3.10/site-packages/mysql/connector/network.pyÚ_strioerror0   s   r   c                 C   sŽ   g }t | ƒ}tj}||kr0| dt d|¡ | d|…  ¡ | |d… } t | ƒ}|d }||ks| t d|¡dd… t d|¡ |  ¡ |S )z0Prepare a packet for sending to the MySQL serveró   ÿÿÿú<BNr   ú<Ir   é   )Úlenr   ÚMAX_PACKET_LENGTHÚappendÚstructÚpack)ÚbufÚpktnrÚpktsÚpllenÚ	maxpktlenr   r   r   Ú_prepare_packets:   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„ Z		d'dd„ZeZ		d'dd„Zdd„ Zdd„ Zejdd… dkrPe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_queueÚrecvsize©Úselfr   r   r   Ú__init__S   s   
zBaseMySQLSocket.__init__c                 C   ó"   | j d | _ | j dkrd| _ | j S )zIncrements the packet numberr   éÿ   r   )r%   r)   r   r   r   Únext_packet_number[   ó   
z"BaseMySQLSocket.next_packet_numberc                 C   r,   )z'Increments the compressed packet numberr   r-   r   )r&   r)   r   r   r   Únext_compressed_packet_numberc   r/   z-BaseMySQLSocket.next_compressed_packet_numberc                 C   ó   t ‚)zOpen the socket©ÚNotImplementedErrorr)   r   r   r   Úopen_connectionk   ó   zBaseMySQLSocket.open_connectionc                 C   r1   )zGet the location of the socketr2   r)   r   r   r   Úget_addresso   r5   zBaseMySQLSocket.get_addressc              	   C   s>   z| j  tj¡ | j  ¡  | `W dS  tjtfy   Y dS w )z&Shut down the socket before closing itN)r#   ÚshutdownÚsocketÚ	SHUT_RDWRÚcloser'   ÚerrorÚAttributeErrorr)   r   r   r   r7   s   s   

ÿzBaseMySQLSocket.shutdownc              	   C   s0   z
| j  ¡  | `W dS  tjtfy   Y dS w )zClose the socketN)r#   r:   r'   r8   r;   r<   r)   r   r   r   Úclose_connection|   s   

ÿz BaseMySQLSocket.close_connectionc                 C   s   |   ¡  d S ©N)r7   r)   r   r   r   Ú__del__„   s   zBaseMySQLSocket.__del__Nc                 C   s    |du r| j  n|| _t|| jƒ}|D ]:}ztr!| j t|ƒ¡ n| j |¡ W q tyA } ztj	d|  
¡ t|ƒfd�‚d}~w tyM   tj	dd�‚w dS )z Send packets to the MySQL serverNé  ©r	   ÚvalueséÖ  ©r	   )r.   r%   r    r   r#   ÚsendallÚbufferÚIOErrorr   ÚOperationalErrorr6   r   r<   )r*   r   Úpacket_numberÚcompressed_packet_numberÚpacketsÚpacketr   r   r   r   Ú
send_plain‡   s&   €ÿ€ÿ÷zBaseMySQLSocket.send_plainc                 C   s2  |du r| j  n|| _|du r| j n|| _| j}t|ƒ}g }tj}||krït||ƒ}tr>t	ƒ }	|D ]}
|	|
7 }	q2t
|	ƒ}	nd |¡}	~t |	dd… ¡}t dt|ƒ¡dd… t d| j¡ d }trht
|ƒ}| || ¡ |	dd… }	t|	ƒ}| j ||kr¼t |	d|… ¡}t dt|ƒ¡dd… t d| j¡ d	 }tr¤t
|ƒ}| || ¡ |	|d… }	t|	ƒ}| j ||ks€|	rít |	¡}t dt|ƒ¡dd… t d| j¡ t d|¡dd…  }træt
|ƒ}| || ¡ ~	nst d|¡dd… t d|¡ | }
t�rt
|
ƒ}
t|
ƒ}|d
k�r9t |
¡}| t dt|ƒ¡dd… t d| j¡ t d|¡dd…  | ¡ n)t d|¡dd… t d| j¡ t dd¡dd…  }t�r[t
|ƒ}| ||
 ¡ |D ]2}z	| j |¡ W �qd t�y‰ } ztjd|  ¡ t|ƒfd�‚d}~w t�y–   tjdd�‚w dS )z+Send compressed packets to the MySQL serverNó    é @  r   r   r   r   s    @ r   é2   r@   rA   rC   rD   )r.   r%   r0   r&   r   r   r   r    r   Ú	bytearrayrF   ÚjoinÚzlibÚcompressr   r   r   r#   rE   rG   r   rH   r6   r   r<   )r*   r   rI   rJ   r   r   Úzpktsr   r   ÚtmpbufÚpktÚzbufÚheaderÚ
zip_packetr   r   r   r   Úsend_compressed�   sº   



ÿþÿþö
ÿþ
ÿÿ

ÿþýÿþÿ€ÿúzBaseMySQLSocket.send_compressedc           	   
   C   s>  z…t dƒ}d}|dk r'| j d| ¡}|stjdd�‚||7 }t|ƒ}|dk s|d | _tr?t 	dt
|dd… d ƒ¡d }nt d|dd… d ¡d }|}| t |ƒ¡ t|ƒ}|dd	… }|rƒ| j ||¡}|dkrw|dkrwtjdd�‚||d	… }||8 }|sb|W S  tyž } ztjd
|  ¡ t|ƒfd�‚d	}~ww )ú%Receive packets from the MySQL serverrN   r   é   éÝ  rD   r   r   ó    Nr@   rA   )rQ   r#   Úrecvr   ÚInterfaceErrorr   r%   r   r   Úunpack_fromrF   ÚunpackÚextendÚ
memoryviewÚ	recv_intorG   rH   r6   r   )	r*   rL   Ú
packet_lenÚchunkÚpayload_lenÚrestÚpacket_viewÚreadr   r   r   r   Ú
recv_plainò   sJ   û
þþûÿ€ÿzBaseMySQLSocket.recv_plainc              
   C   sú   zct dƒ}d}|dk r'| j d| ¡}|stjdd�‚||7 }t|ƒ}|dk s|d | _td|dd… d ƒd }|}tdƒ}|dkr_| j |¡}|sQtjdd�‚||7 }|t|ƒ }|dksC|| W S  t	y| } ztj
d	|  ¡ t|ƒfd
�‚d}~ww )r\   rN   r   r]   r^   rD   r   r   r_   r@   rA   N)rQ   r#   r`   r   ra   r   r%   r   r   rG   rH   r6   r   )r*   rY   Ú
header_lenrh   ri   rj   Úpayloadr   r   r   r   Úrecv_py26_plain  s8   û
û
ÿ€ÿzBaseMySQLSocket.recv_py26_plainr   é   )rq   é   c                 C   sv   |r9t rt d|dd… d ¡d }nt d|dd… d ¡d }| j |d|d … ¡ ||d d… }|sdS dS )zSplit compressed payloadr   r   r   r_   r]   N)r   r   rb   rc   r'   r   )r*   Úpacket_bunchÚpayload_lengthr   r   r   Ú_split_zipped_payload=  s   þþ÷z%BaseMySQLSocket._split_zipped_payloadc              
   C   sd  z| j  ¡ }|d | _|W S  ty   Y nw tdƒ}g }z½| j d¡}|r>t|ƒdk r>||7 }| j d¡}|r>t|ƒdk s,|rÙt|ƒdk rLtj	dd�‚t
d|dd… d	 ƒd }|d | _t
d|d
d… d	 ƒd }t|ƒ}t|ƒ|k r‘| j |t|ƒ ¡}|s‡tj	dd�‚|| }t|ƒ|k su|dkr§|  |¡ | j  ¡ }|d | _|W S | ||f¡ |dkr³n&tdƒ}| j d¡}|r×t|ƒdk r×||7 }| j d¡}|r×t|ƒdk sÅ|s@W n tyó }	 ztjd|  ¡ t|	ƒfd�‚d}	~	ww tdƒ}
|D ]\}}t�r|
t t|ƒ¡7 }
qú|
t |¡7 }
qú|  |
¡ ~
z| j  ¡ }|d | _|W S  t�y1   Y dS w )z0Receive compressed packets from the MySQL serverr   rN   r   é   r^   rD   r   r   r_   r]   rO   r@   rA   N)r'   Úpopleftr%   Ú
IndexErrorrQ   r#   r`   r   r   ra   r   r&   r   ru   r   rG   rH   r6   r   r   rS   Ú
decompressrF   )r*   rW   rY   rK   ÚabyteÚzip_payload_lengthrt   Úzip_payloadrh   r   Útmpro   r   r   r   Úrecv_compressedJ  sŒ   

ÿþÿÿ
ÿû


þÜ€(ÿ€ÿ


ÿ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   s0  | j s	tjdd�‚zB|rtj}ntj}|du r&tj| j ||||d|d�| _ ntj| j ||||d||d�| _ | j  ¡  |rIt | j  	¡ | j
¡ W dS W dS  tyW   t d¡‚ tjtfyr }	 ztjd|  ¡ t|	ƒfd	�‚d}	~	w tjy… }	 zt t|	ƒ¡‚d}	~	w ty— }	 zt t|	ƒ¡‚d}	~	ww )
zSwitch the socket to use SSLi   rD   NF)ÚkeyfileÚcertfileÚca_certsÚ	cert_reqsÚdo_handshake_on_connectÚciphers)r�   r‚   rƒ   r„   r…   Ússl_versionr†   z&Python installation has no SSL supportr@   rA   )r#   r   ra   ÚsslÚCERT_REQUIREDÚ	CERT_NONEÚwrap_socketÚdo_handshakeÚmatch_hostnameÚgetpeercertÚserver_hostÚ	NameErrorÚNotSupportedErrorÚSSLErrorrG   r6   r   ÚCertificateErrorr   r3   )
r*   ÚcaÚcertÚkeyÚverify_certÚverify_identityÚcipherr‡   r„   r   r   r   r   Úswitch_to_sslž  sJ   

ý
ý
ÿÿÿ€€€ÿzBaseMySQLSocket.switch_to_ssl)NN)FFNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r+   Úpropertyr.   r0   r4   r6   r7   r=   r?   rM   Úsendr[   rm   rp   ÚsysÚversion_infor`   ru   r~   r€   rš   r   r   r   r   r!   J   s>    

	
ÿ
ÿU&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 r>   )Úsuperr£   r+   Úunix_socket)r*   r¦   ©Ú	__class__r   r   r+   Ì  s   
zMySQLUnixSocket.__init__c                 C   s   | j S r>   )r¦   r)   r   r   r   r6   Ð  s   zMySQLUnixSocket.get_addressc              
   C   sŒ   zt   t jt j¡| _| j | j¡ | j | j¡ W d S  ty3 } zt	j
d|  ¡ t|ƒfd�‚d }~w tyE } zt	 
t|ƒ¡‚d }~ww )NiÒ  rA   )r8   ÚAF_UNIXÚSOCK_STREAMr#   Ú
settimeoutr$   Úconnectr¦   rG   r   ra   r6   r   Ú	Exceptionr   )r*   r   r   r   r   r4   Ó  s   ÿÿ€€ÿzMySQLUnixSocket.open_connection)r¤   ©r›   rœ   r�   rž   r+   r6   r4   Ú__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+   r�   Ú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   r6   í  s   zMySQLTCPSocket.get_addressc           	   
   C   sj  dgd }zIt  | j| jdt jt j¡}|D ]}| jr%|d t jkr%|} n|d t jkr0|} nq| jrC|d du rCt	 
d | j¡¡‚|d du rM|d }W n tyg } zt	j
d|  ¡ t|ƒfd�‚d}~ww |\| _}}}}zt   | j||¡| _| j | j¡ | j |¡ W dS  ty¢ } zt	j
d|  ¡ t|ƒfd�‚d}~w ty´ } zt	 t|ƒ¡‚d}~ww )z7Open the TCP/IP connection to the MySQL server
        Né   r   zNo IPv6 address found for {0}iÓ  rA   )r8   Úgetaddrinfor�   r³   rª   ÚSOL_TCPr´   ÚAF_INET6ÚAF_INETr   ra   r   rG   r6   r   rµ   r#   r«   r$   r¬   r­   rH   r   )	r*   ÚaddrinfoÚ	addrinfosÚinfor   ÚsocktypeÚprotoÚ_Úsockaddrr   r   r   r4   ð  sT   
ýþ
ÿ€ÿ€ÿÿ€€ÿzMySQLTCPSocket.open_connection)r±   r²   Fr®   r   r   r§   r   r°   à  s
    r°   )rž   Úcollectionsr   r8   r   r¡   rS   rˆ   Ú r   r   Úcatch23r   r   r   r   r    Úobjectr!   r£   r°   r   r   r   r   Ú<module>   s&   
  ~