
    DhJ                         d Z ddlmZ ddlZddlZddl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 d Zd Z G d	 d
e      Z G d de      Z G d de      Zy#  Y >xY w)zGModule implementing low-level socket communication with MySQL servers.
    )dequeN   )	constantserrors)PY2init_bytearraystruct_unpackc                 ~    | j                   st        |       S dj                  | j                   | j                        S )z_Reformat the IOError error message

    This function reformats the IOError error message.
    z{errno} {strerr})errnostrerr)r   strformatstrerror)errs    W/var/www/html/civilisation/venv/lib/python3.12/site-packages/mysql/connector/network.py_strioerrorr   +   s2    
 993x$$399S\\$JJ    c                 `   g }t        |       }t        j                  }||kD  rI|j                  dt	        j
                  d|      z   | d| z          | |d } t        |       }|dz   }||kD  rI|j                  t	        j
                  d|      dd t	        j
                  d|      z   | z          |S )z0Prepare a packet for sending to the MySQL server   <BNr   <Ir      )lenr   MAX_PACKET_LENGTHappendstructpack)bufpktnrpktspllen	maxpktlens        r   _prepare_packetsr#   5   s    DHE++I
)
Ofkk$&>>*9o& 	')*oC	 )
 	KKD%(1-++dE*+-01 2Kr   c                       e Zd ZdZd Zed        Zed        Zd Zd Z	d Z
d Z	 	 dd
ZeZ	 	 ddZd Zd Zej$                  dd dk(  reZeZneZd Zd Zd ZddZy	)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                 h    d | _         d | _        d| _        d| _        t	               | _        d| _        y )Ni    )sock_connection_timeout_packet_number_compressed_packet_numberr   _packet_queuerecvsizeselfs    r   __init__zBaseMySQLSocket.__init__N   s2    	#'  )+&"Wr   c                 n    | j                   dz   | _         | j                   dkD  rd| _         | j                   S )zIncrements the packet numberr      r   )r*   r.   s    r   next_packet_numberz"BaseMySQLSocket.next_packet_numberV   s9     #11A5$"#D"""r   c                 n    | j                   dz   | _         | j                   dkD  rd| _         | j                   S )z'Increments the compressed packet numberr   r2   r   )r+   r.   s    r   next_compressed_packet_numberz-BaseMySQLSocket.next_compressed_packet_number^   s9     *.)G)G!)K&))C/-.D*---r   c                     t         )zOpen the socketNotImplementedErrorr.   s    r   open_connectionzBaseMySQLSocket.open_connectionf       !!r   c                     t         )zGet the location of the socketr7   r.   s    r   get_addresszBaseMySQLSocket.get_addressj   r:   r   c                     	 | j                   j                  t        j                         | j                   j	                          | `y# t        j                  t        f$ r Y yw xY w)z&Shut down the socket before closing itN)r(   shutdownsocket	SHUT_RDWRcloser,   errorAttributeErrorr.   s    r   r>   zBaseMySQLSocket.shutdownn   sN    	IIv//0IIOO"n- 		s   AA A$#A$c                 |    	 | j                   j                          | `y# t        j                  t
        f$ r Y yw xY w)zClose the socketN)r(   rA   r,   r?   rB   rC   r.   s    r   close_connectionz BaseMySQLSocket.close_connectionw   s6    	IIOO"n- 		s    ;;Nc           	         || j                    n|| _        t        || j                        }|D ]I  }	 t        r%| j                  j                  t        |             n| j                  j                  |       K y# t        $ r5}t        j                  d| j                         t        |      f      d}~wt        $ r t        j                  d      w xY w)z Send packets to the MySQL serverN  r   values  r   )r3   r*   r#   r   r(   sendallbufferIOErrorr   OperationalErrorr<   r   rC   )r/   r   packet_numbercompressed_packet_numberpacketspacketr   s          r   
send_plainzBaseMySQLSocket.send_plain   s      ##"/D"3(;(;< 
	:F	:II%%fVn5II%%f-
	:  O--(8(8(:K<L'MO O! :--D99:s   AA<<	C0B55#Cc           	         || j                    n|| _        || j                   n|| _        | j                  }t	        |      }g }t
        j                  }||kD  r+t        ||      }t        r"t               }	|D ]  }
|	|
z  }		 t        |	      }	ndj                  |      }	~t        j                  |	dd       }t        j                  dt	        |            dd t        j                  d| j                        z   dz   }t        rt        |      }|j!                  ||z          |	dd }	t	        |	      }| j                   ||kD  rt        j                  |	d|       }t        j                  dt	        |            dd t        j                  d| j                        z   d	z   }t        rt        |      }|j!                  ||z          |	|d }	t	        |	      }| j                   ||kD  r|	rt        j                  |	      }t        j                  dt	        |            dd t        j                  d| j                        z   t        j                  d|      dd z   }t        rt        |      }|j!                  ||z          ~	nRt        j                  d|      dd t        j                  d|      z   |z   }
t        rt        |
      }
t	        |
      }|d
kD  rt        j                  |
      }|j!                  t        j                  dt	        |            dd t        j                  d| j                        z   t        j                  d|      dd z   |z          nyt        j                  d|      dd t        j                  d| j                        z   t        j                  dd      dd z   }t        rt        |      }|j!                  ||
z          |D ]  }	 | j"                  j%                  |         y# t&        $ r5}t)        j*                  d| j-                         t/        |      f      d}~wt0        $ r t)        j*                  d      w xY w)z+Send compressed packets to the MySQL serverNr    @  r   r   r   r   s    @ r   2   rG   rH   rJ   rK   )r3   r*   r5   r+   r   r   r   r#   r   	bytearrayrM   joinzlibcompressr   r   r   r(   rL   rN   r   rO   r<   r   rC   )r/   r   rP   rQ   r   r!   zpktsr"   r    tmpbufpktzbufheader
zip_packetr   s                  r   send_compressedzBaseMySQLSocket.send_compressed   s     ##"/D#+..-ED*##C//	9#C/D" "CcMF"$==0Dkk$D	21Q7D$*H*HIJ'(F LL$'EF^FKE..)#}}VJY%78 ++dCI6q;"KKd.L.LMN+, #F^FVd]+	
+F22 )# }}V, ++dCI6q;"KKd.L.LMN"KKe4Qq9: #F^FVd]+;;tU+Aa0;;tU+,.12CSkHErz}}S)V[[s4y9!A>%{{41O1OPQ%{{47!<=  $$ %
 !++dE21Q7"KKd.L.LMN"KKa0156 #F^FVc\* 	:J:		!!*-	:  O--(8(8(:K<L'MO O! :--D99:s   O==	Q0P66#Qc                    	 t        d      }d}|dk  rL| j                  j                  d|z
        }|st        j                  d      ||z  }t        |      }|dk  rL|d   | _        t        r)t        j                  dt        |dd dz               d   }nt        j                  d|dd dz         d   }|}|j                  t        |             t        |      }|dd	 }|rI| j                  j                  ||      }|dk(  r|dkD  rt        j                  d      ||d	 }||z  }|rI|S # t        $ r5}t        j                   d
| j#                         t%        |      f      d	}~ww xY w)%Receive packets from the MySQL serverr   r        rK   r   r       NrG   rH   )rX   r(   recvr   InterfaceErrorr   r*   r   r   unpack_fromrM   unpackextend
memoryview	recv_intorN   rO   r<   r   )	r/   rS   
packet_lenchunkpayload_lenrestpacket_viewreadr   s	            r   
recv_plainzBaseMySQLSocket.recv_plain   s   "	Ks^FJq.		q:~6 //d;;% [
 q. #))D$006!A;013346 %mmD&1+2GHK DMM)K01$V,K%ab/Kyy**;=19 //d;;)$%0  M 	K))D$4$4$6C8H#IK K	Ks%   AD1  CD1 /D1 1	E/:0E**E/c                 F   	 t        d      }d}|dk  rL| j                  j                  d|z
        }|st        j                  d      ||z  }t        |      }|dk  rL|d   | _        t        d|dd dz         d   }|}t        d      }|dkD  rL| j                  j                  |      }|st        j                  d      ||z  }|t        |      z
  }|dkD  rL||z   S # t        $ r5}t        j                  d	| j                         t        |      f
      d}~ww xY w)rd   r   r   re   rf   rK   r   r   rg   rG   rH   N)rX   r(   rh   r   ri   r   r*   r	   r   rN   rO   r<   r   )r/   r`   
header_lenrp   rq   rr   payloadr   s           r   recv_py26_plainzBaseMySQLSocket.recv_py26_plain  s7   	Ks^FJq.		q:~6 //d;;% [
 q. #))D'fQqkG.CDQGK D$S)G(		t, //d;;5 "S\1 ( G## 	K))D$4$4$6C8H#IK K	Ks%   AC"  A<C" C" "	D +0DD r      )rz      c                     |rrt         r t        j                  d|dd dz         d   }nt        j                  d|dd dz         d   }| j                  j                  |d|dz           ||dz   d }|rqyy)zSplit compressed payloadr   r   r   rg   re   N)r   r   rj   rk   r,   r   )r/   packet_bunchpayload_lengths      r   _split_zipped_payloadz%BaseMySQLSocket._split_zipped_payload5  s    !'!3!3 1%/"112"4 "(t\!A5F5P!QRS!T%%l1^a5G&HI'(:(;<L r   c                 &   	 | j                   j                         }|d   | _        |S # t        $ r Y nw xY wt	        d      }g }	 | j
                  j                  d      }|r?t        |      dk  r1||z  }| j
                  j                  d      }|rt        |      dk  r1|rt        |      dk  rt        j                  d      t        d|dd d	z         d   }|d   | _        t        d|d
d d	z         d   }t        |      }t        |      |k  r_| j
                  j                  |t        |      z
        }t        |      dk(  rt        j                  d      ||z   }t        |      |k  r_|dk(  r7| j                  |       | j                   j                         }|d   | _        |S |j                  ||f       |dk  rnkt        d      }| j
                  j                  d      }|r?t        |      dk  r1||z  }| j
                  j                  d      }|rt        |      dk  r1|rnA# t        $ r5}	t        j                   d| j#                         t%        |	      f      d}	~	ww xY wt        d      }
|D ]E  \  }}t&        r"|
t)        j*                  t-        |            z  }
.|
t)        j*                  |      z  }
G | j                  |
       ~
	 | j                   j                         }|d   | _        |S # t        $ r Y yw xY w)z0Receive compressed packets from the MySQL serverr   r   r      rf   rK   r   r   rg   re   rV   rG   rH   N)r,   popleftr*   
IndexErrorrX   r(   rh   r   r   ri   r	   r+   r   r   r   rN   rO   r<   r   r   rZ   
decompressrM   )r/   r^   r`   rR   abytezip_payload_lengthr~   zip_payloadrp   r   tmprx   s               r   recv_compressedzBaseMySQLSocket.recv_compressedB  s   	$$,,.C"%a&DJ 		 3/	KIINN1%ECK!O%		q) CK!O v;? //d;; &3439!A;3H&JJK&M"17. "/tVAa[75J!KA!N,U3+&);; IINN+=-0-=,> ?E5zQ$33$??"-"5K +&);; "Q&..{;,,446C*-a&D'J<=%. (,		q)FaeOF IINN1-E FaI P  	K))D$4$4$6C8H#IK K	K S!'. 	0#NGtvg77tw//	0 	""3'	$$,,.C"%a&DJ 		sQ   %( 	44AH5 !CH5 4;H5 0A?H5 0H5 5	I3>0I..I3%L 	LLc                     || _         y)zSet the connection timeoutN)r)   )r/   timeouts     r   set_connection_timeoutz&BaseMySQLSocket.set_connection_timeout  s
    #* r   c           
      h   | j                   st        j                  d      	 |rt        j                  }nt        j
                  }t        j                  | j                   ||||dt        j                  |      | _         | j                   j                          y# t        $ r t        j                  d      t        j                  t        f$ r5}t        j                  d| j                         t        |      f      d}~wt        $ r#}t        j                  t!        |            d}~ww xY w)	zSwitch the socket to use SSLi   rK   F)keyfilecertfileca_certs	cert_reqsdo_handshake_on_connectssl_versionciphersz&Python installation has no SSL supportrG   rH   N)r(   r   ri   sslCERT_REQUIRED	CERT_NONEwrap_socketPROTOCOL_TLSv1do_handshake	NameErrorNotSupportedErrorSSLErrorrN   r<   r   r8   r   )r/   cacertkeyverify_certcipherr   r   s           r   switch_to_sslzBaseMySQLSocket.switch_to_ssl  s    yy''d33	2--	MM			3#U..@DI II""$ 	:**8: :g& 	K''D$4$4$6C8H#IK K" 	2''C11	2s$   A7B 6D10DD1D,,D1)NN)FN)__name__
__module____qualname____doc__r0   propertyr3   r5   r9   r<   r>   rE   rT   sendrb   ru   ry   sysversion_inforh   r   r   r   r    r   r   r%   r%   E   s     # # . ."" -1,0:( D1515S:j$KLK> !&$
=M^+
2r   r%   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )MySQLUnixSocketzoMySQL socket class using UNIX sockets

    Opens a connection through the UNIX socket of the MySQL Server.
    c                 8    t         t        |           || _        y N)superr   r0   unix_socket)r/   r   	__class__s     r   r0   zMySQLUnixSocket.__init__  s    ot-/&r   c                     | j                   S r   )r   r.   s    r   r<   zMySQLUnixSocket.get_address  s    r   c                    	 t        j                   t         j                  t         j                        | _        | j                  j	                  | j
                         | j                  j                  | j                         y # t        $ r5}t        j                  d| j                         t        |      f      d }~wt        $ r#}t        j                  t        |            d }~ww xY w)Ni  rH   )r?   AF_UNIXSOCK_STREAMr(   
settimeoutr)   connectr   rN   r   ri   r<   r   	Exceptionr   )r/   r   s     r   r9   zMySQLUnixSocket.open_connection  s    	2fnnf6H6HIDIII  !9!9:IId../ 	K''D$4$4$6C8H#IK K 	2''C11	2s$   BB 	C,0B==C,	C''C,)z/tmp/mysql.sockr   r   r   r   r0   r<   r9   __classcell__r   s   @r   r   r     s    
' 	2r   r   c                   0     e Zd ZdZd fd	Zd Zd Z xZS )MySQLTCPSocketzXMySQL socket class using TCP/IP

    Opens a TCP/IP connection to the MySQL Server.
    c                 b    t         t        |           || _        || _        || _        d| _        y )Nr   )r   r   r0   server_hostserver_port
force_ipv6_family)r/   hostportr   r   s       r   r0   zMySQLTCPSocket.__init__  s.    nd,.$r   c                 N    dj                  | j                  | j                        S )Nz{0}:{1})r   r   r   r.   s    r   r<   zMySQLTCPSocket.get_address  s!     0 0$2B2BCCr   c                    dgdz  }	 t        j                  | j                  | j                  dt         j                  t         j
                        }|D ]B  }| j                  r|d   t         j                  k(  r|} n|d   t         j                  k(  s@|} n | j                  r3|d   .t        j                  dj                  | j                              |d   |d   }|\  | _        }}}}	 t        j                   | j                  ||      | _        | j                   j#                  | j$                         | j                   j'                  |       y# t        $ r5}t        j                  d| j                         t        |      f      d}~ww xY w# t        $ r5}t        j                  d| j                         t        |      f      d}~wt(        $ r#}t        j*                  t-        |            d}~ww xY w)z7Open the TCP/IP connection to the MySQL server
        N   r   zNo IPv6 address found for {0}i  rH   )r?   getaddrinfor   r   r   SOL_TCPr   AF_INET6AF_INETr   ri   r   r   rN   r<   r   r(   r   r)   r   r   rO   r   )	r/   addrinfo	addrinfosinfosocktypeproto_sockaddrr   s	            r   r9   zMySQLTCPSocket.open_connection  s    6A:	D**4+;+;+/+;+;+,f.@.@+1>>;I
 " ??tAw&//'A#H!W.#H 8A;#6++3::4;K;KLN N{"$Q<
 <D8T\8UAx	4dllHeDDIII  !9!9:IIh'  	K''D$4$4$6C8H#IK K	K  	K''D$4$4$6C8H#IK K 	4))#c(33	4sD   B
E AE /A&F 	F0FF	G? 0GG?G::G?)z	127.0.0.1i  Fr   r   s   @r   r   r     s    
D&4r   r   )r   collectionsr   r?   r   r   rZ   r    r   r   catch23r   r   r	   r   r#   objectr%   r   r   r   r   r   <module>r      sk   0    
 	
   7 7K h2f h2\2o 2264_ 64S	s   A A