a
    <h0p                     @   s0  d dl Z d dl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 d dlmZ d dlZd dlmZmZmZmZmZ d dlmZmZ d	Zd
d Zed\ZZed\ZZed\ZZed\Z Z!ed\Z"Z#ed\Z$Z%ed\Z&Z'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4d Z5d!Z6d"Z7d#Z8d$Z9d%Z:d&Z;d'Z<d(Z=d)Z>d*Z?d+Z@d,ZAdZBd(ZCdZDd-ZEdZFd.ZGdZHdJd0d1ZIeIeCZJeIeDZKeIeGZLeIe:ZMeIeBe)ed  ZNdZOd+ZPd2ZQd3ZQd4ZRd5ZSd6ZTdZUd7ZVd8ZWd9ZXd:ZYd;ZZd<Z[d=Z\d)Z]dZ^dZ_d>d? Z`d@dA ZadBdC ZbdDdE ZcG dFdG dGZdG dHdI dIZedS )K    N)defaultdictdeque)md5)IOBase
TextIOBase)count)Struct)PG_PY_ENCODINGSPG_TYPESPY_TYPESmake_params	string_in)DatabaseErrorInterfaceErrorz1.31.4c                 C   s   t d|  }|j|jfS )N!)r   packunpack_from)fmtZstruc r   F/var/www/html/efn/efnconsultor/selenium/selenium-4.34.2/pg8000/core.py
pack_funcs   s    r   iHiiZihihihZciZbhZcccczMathieu Fenniak       N   R   S   K   Z   T   E   D   C   1   2   3   s   n   t   A   c   d   G   H   I   B   P   Q   p   X    c                 C   s   | t t|d  | S )N   )i_packlen)codedatar   r   r   _create_messagem   s    r;   SVCMDPpqWFLRc              
   C   s@   z|    W n. ty: } ztd|W Y d }~n
d }~0 0 d S Nnetwork error)flushOSErrorr   )socker   r   r   _flush   s    rN   c              
   C   s|   t  }z>t||k rB| |t| }|dkr6td|| qW n. tyr } ztd|W Y d }~n
d }~0 0 t|S )Nr5   rI   )	bytearrayr8   readr   extendrK   bytes)rL   sizebuffblockrM   r   r   r   _read   s     rV   c              
   C   sB   z|  | W n. ty< } ztd|W Y d }~n
d }~0 0 d S rH   )writerK   r   )rL   drM   r   r   r   _write   s    rY   c                 C   s$  | d ur|d urt dzPttds,t dttjtj}|| ||  |rf|tjtj	d W n@ tj
y }	 z&|d ur|  t d|	W Y d }	~	n
d }	~	0 0 n|d ur|}n|d urBzt||f||}W nL tj
y& }	 z0t d| d| d| d	| d
	|	W Y d }	~	n
d }	~	0 0 |rJ|tjtj	d nt dd }
|durzdd l}|du sv|d u r| }d|_|j|_n|}|tdd |dd}|dkr|j||d}td|}
n$|d ur|d ur|  t dW n ty   t dY n0 |
|fS )Nz+If unix_sock is provided, sock must be NoneAF_UNIXz9attempt to connect to unix socket on unsupported platform   zcommunication errorz"Can't create a connection to host z
 and port z (timeout is z and source_address is z).z/one of host, sock or unix_sock must be providedFr   T   i/asciir<   )Zserver_hostnameztls-server-end-pointzServer refuses SSLzFSSL required but ssl module not available in this python installation.)r   hasattrsocketrZ   ZSOCK_STREAMZ
settimeoutconnectZ
setsockoptZ
SOL_SOCKETZSO_KEEPALIVEerrorcloseZcreate_connectionsslZcreate_default_contextZcheck_hostnameZ	CERT_NONEZverify_modeZsendallii_packZrecvdecodeZwrap_socketscrampZmake_channel_bindingImportError)	unix_sockZ	orig_sockhostporttimeoutsource_addresstcp_keepaliveZorig_ssl_contextrL   rM   channel_bindingrc   ssl_contextZrespr   r   r   _make_socket   sx    



"






rp   c                   @   sL  e Zd Zdd Zdd ZdTd	d
Zdd Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 ZdUd2d3Zd4d5 Zd6d7 Zd8d9 ZdVd:d;ZdWd<d=Zd>d? Zd@dA Z dBdC Z!dDdE Z"dFdG Z#dHdI Z$dJdK Z%dLdM Z&dNdO Z'dPdQ Z(dRdS Z)dS )XCoreConnectionc                 C   s   | S Nr   selfr   r   r   	__enter__   s    zCoreConnection.__enter__c                 C   s   |    d S rr   )rb   )rt   exc_type	exc_value	tracebackr   r   r   __exit__   s    zCoreConnection.__exit__	localhostN8  Tc              *   C   s  d| _ d| _tdd| _tdd| _i | _|d u r:td||||d}|d u rTi n|}| | @ }t|dkr|td|	| t
| D ]Z\}}t|tr|d||< q|d u r||= qt|ttfstd	| d
t| dq|d | _t|tr|d| _n|| _d | _t | _i | _t|||||	||
|\| _| _| jjdd| _d | _tdd t| _ t!t"| _#t$| j%t&| j't(| j)t*| j+t,| j-t.| j/t0| j1t2| j3t4| j5t6| j7t8| j9t:| j;t<| j=t>| j?t@| jAtB| jCtD| jEtF| jGtH| jItJ| jKtL| jMi| _Nd}ttO|}| D ]&\}}|P|dtQ | tQ  q|Rd tS| jtOt|d  tS| j| tT| j zdd }tUd }|t,t0fvrtVtW| jd\}}| jN| tW| j|d | q|jXd ur|jXW n2 tYy } z| Z  |W Y d }~n
d }~0 0 d | _[d S )Nutf8)s   INSERTs   DELETEs   UPDATEs   MOVEs   FETCHs   COPYs   SELECTd   )maxlenz.The 'user' connection parameter cannot be None)userdatabaseapplication_namereplicationr   zjThe parameters '{common_params}' can't appear in startup_params, they must be set using keyword arguments.zThe parameter z can't be of type .r   Zrwb)modec                   S   s   t S rr   )r   r   r   r   r   <lambda>X  r5   z)CoreConnection.__init__.<locals>.<lambda>i   r]   r6      )\_client_encodingZ_commands_with_countr   notificationsnoticesparameter_statusesr   keysr8   updatetupleitems
isinstancestrencoderR   rO   typer   password_xidset_statement_numsZ_cachesrp   rn   _usockZmakefile_sock_backend_key_datar   r
   pg_typesdictr   py_typesNOTICE_RESPONSEhandle_NOTICE_RESPONSEAUTHENTICATION_REQUESThandle_AUTHENTICATION_REQUESTPARAMETER_STATUShandle_PARAMETER_STATUSBACKEND_KEY_DATAhandle_BACKEND_KEY_DATAREADY_FOR_QUERYhandle_READY_FOR_QUERYROW_DESCRIPTIONhandle_ROW_DESCRIPTIONERROR_RESPONSEhandle_ERROR_RESPONSEEMPTY_QUERY_RESPONSEhandle_EMPTY_QUERY_RESPONSEDATA_ROWhandle_DATA_ROWCOMMAND_COMPLETEhandle_COMMAND_COMPLETEPARSE_COMPLETEhandle_PARSE_COMPLETEBIND_COMPLETEhandle_BIND_COMPLETECLOSE_COMPLETEhandle_CLOSE_COMPLETEPORTAL_SUSPENDEDhandle_PORTAL_SUSPENDEDNO_DATAhandle_NO_DATAPARAMETER_DESCRIPTIONhandle_PARAMETER_DESCRIPTIONNOTIFICATION_RESPONSEhandle_NOTIFICATION_RESPONSE	COPY_DONEhandle_COPY_DONE	COPY_DATAhandle_COPY_DATACOPY_IN_RESPONSEhandle_COPY_IN_RESPONSECOPY_OUT_RESPONSEhandle_COPY_OUT_RESPONSEmessage_typesr7   rQ   	NULL_BYTEappendrY   rN   Context	ci_unpackrV   ra   BaseExceptionrb   _transaction_status)rt   r   ri   r   rj   r   rl   rh   ro   rk   rm   r   r   startup_paramsrL   Zinit_paramsZstart_paramsZcommon_paramskvprotocolvalr9   contextdata_lenrM   r   r   r   __init__  s    	



 

 
zCoreConnection.__init__c                 C   s   || j |< d S rr   )r   )rt   typZout_funcr   r   r   register_out_adapter  s    z#CoreConnection.register_out_adapterc                 C   s   || j |< d S rr   )r   )rt   oidZin_funcr   r   r   register_in_adapter  s    z"CoreConnection.register_in_adapterc                    s&    fdd| tD }t||_d S )Nc                    s<   i | ]4}|d kr|dd  d|dd j  jddqS )r5   Nr[   r]   replace)errors)re   r   .0srs   r   r   
<dictcomp>  s   z8CoreConnection.handle_ERROR_RESPONSE.<locals>.<dictcomp>)splitr   r   ra   )rt   r:   r   msgr   rs   r   r     s    
z$CoreConnection.handle_ERROR_RESPONSEc                 C   s   d S rr   r   rt   r:   r   r   r   r   r     s    z*CoreConnection.handle_EMPTY_QUERY_RESPONSEc                 C   s   d S rr   r   r   r   r   r   r     s    z$CoreConnection.handle_CLOSE_COMPLETEc                 C   s   d S rr   r   r   r   r   r   r     s    z$CoreConnection.handle_PARSE_COMPLETEc                 C   s   d S rr   r   r   r   r   r   r     s    z#CoreConnection.handle_BIND_COMPLETEc                 C   s   d S rr   r   r   r   r   r   r     s    z&CoreConnection.handle_PORTAL_SUSPENDEDc                 C   s   dS Ehttps://www.postgresql.org/docs/current/protocol-message-formats.htmlNr   r   r   r   r   r     s    z+CoreConnection.handle_PARAMETER_DESCRIPTIONc                 C   s   d S rr   r   r   r   r   r   r     s    zCoreConnection.handle_COPY_DONEc                    sj   t |\}} jdu r tdnFt jtr\|r:tdqft| j fdd}| _n
 jj	 _dS )r   Nz7An output stream is required for the COPY OUT response.z@The COPY OUT stream is binary, but the stream parameter is text.c                    s    j | d  d S )Nr   )streamrW   )r:   r   re   r   r   w  s    z2CoreConnection.handle_COPY_OUT_RESPONSE.<locals>.w)
	bh_unpackr   r   r   r   codecs
getdecoderr   stream_writerW   )rt   r:   r   	is_binarynum_colsr   r   r   r   r     s    
z'CoreConnection.handle_COPY_OUT_RESPONSEc                 C   s   | | d S rr   )r   r   r   r   r   r     s    zCoreConnection.handle_COPY_DATAc                    s,  t |\}} jdu rtdt jtrt jtrX|rDtdq` fdd}|}n jj}td}||}|dkrzqtj	t
 tj	t|d  tj	|d|  tj	 qhnJ jD ]B}	t|	tr|rtd	|	j}
n|	}
t
|
 tj	 qtj	t tj	t tj	 dS )
r   NzxThe 'stream' parameter is required for the COPY IN response. The 'stream' parameter can be an I/O stream or an iterable.zHThe COPY IN stream is binary, but the stream parameter is a text stream.c                    s*   |    |  jdj t| S )Ni   )clearrQ   r   rP   r   r   r8   )bffrr   rt   r   r   ri  s
    z2CoreConnection.handle_COPY_IN_RESPONSE.<locals>.rii    r   r6   zZThe COPY IN stream is binary, but the stream parameter is an iterable with str type items.)r   r   r   r   r   r   readintorO   rY   r   r   r7   rN   r   r   r   _send_messageCOPY_DONE_MSGSYNC_MSG)rt   r:   r   r   r   r   r   r   Z
bytes_readr   br   r   r   r     sF    


z&CoreConnection.handle_COPY_IN_RESPONSEc                 C   sZ   t |d }d}|t|}||| d}||d d d}| j|||f dS )r   r   r6   r]   r[   N)i_unpackfindr   re   r   r   )rt   r:   r   Zbackend_pididxZnull_idxZchannelZpayloadr   r   r   r     s    z+CoreConnection.handle_NOTIFICATION_RESPONSEc                 C   s   | j du rtdzzt| jt t| j W zPz| j   W n0 tjyl } ztd|W Y d}~n
d}~0 0 W d| _d| _ qd| _d| _ 0 nbzPz| j   W n0 tjy } ztd|W Y d}~n
d}~0 0 W d| _d| _ nd| _d| _ 0 0 dS )zCloses the database connection.

        This function is part of the `DBAPI 2.0 specification
        <http://www.python.org/dev/peps/pep-0249/>`_.
        Nconnection is closedrI   )	r   r   rY   r   TERMINATE_MSGrN   rb   r_   ra   )rt   rM   r   r   r   rb   "  s*    
"
"zCoreConnection.closec           
      C   s  t |d }|dkrn|dkrR| jdu r2td| t| jt  t| j n|dkrdt	|d}| jdu r|tdd	t
t
| j| j  d
|  d
 }| t|t  t| j n4|dkr`dd |dd tD }tj|| jd| jd| jd| _| j d}| jjd
t }| t|tt| |  t| j n|dkr| j|dd d | j d}	| t|	 t| j nR|dkr| j|dd d n,|dv rtd| dntd| ddS )r   r      NzGserver requesting password authentication, but no password was providedr   r5   r6   zKserver requesting MD5 password authentication, but no password was provideds   md5r]   
   c                 S   s   g | ]}| d qS )r]   )re   )r   mr   r   r   
<listcomp>V  r5   z@CoreConnection.handle_AUTHENTICATION_REQUEST.<locals>.<listcomp>r|   )rn         )   r6         r\   	   zAuthentication method z not supported by pg8000.z not recognized by pg8000.)r   r   r   r   PASSWORDr   rN   r   joincccc_unpackr   r   Z	hexdigestr   r   rf   ZScramClientre   rn   ZauthZget_client_firstZmechanism_namer7   r8   Zset_server_firstZget_client_finalZset_server_final)
rt   r:   r   Z	auth_codeZsaltpwdZ
mechanismsZinitZmechr   r   r   r   r   8  sb    









z,CoreConnection.handle_AUTHENTICATION_REQUESTc                 C   s
   || _ d S rr   )r   r   r   r   r   r   |  s    z%CoreConnection.handle_READY_FOR_QUERYc                 C   s
   || _ d S rr   )r   r   r   r   r   r     s    z&CoreConnection.handle_BACKEND_KEY_DATAc           
      C   s   t |d }d}g }g }t|D ]r}|||t| }|t|d 7 }ttdt||}	|| j	|	d< |d7 }|
|	 |
| j|	d   q ||_||_|jd u rg |_d S )Nr   r  r[   )Z	table_oidZcolumn_attrnumtype_oidZ	type_sizeZtype_modifierformatname   r  )H_unpackranger   r   r8   r   zipihihih_unpackre   r   r   r   columnsinput_funcsrows)
rt   r:   r   r   r   r  r  r   r  Zfieldr   r   r   r     s*    

z%CoreConnection.handle_ROW_DESCRIPTIONr   c                 C   sp   t |}||| jt  |tt| |D ]}|t|dkrJdn| q4| t	| t
| jt d S )Nr   r   )rO   rQ   r   r   r   H_packr8   r7   r   PARSErY   r   	FLUSH_MSG)rt   statement_name_bin	statementoidsr   r   r   r   r   
send_PARSE  s    zCoreConnection.send_PARSEc                 C   s    |  tt|  t| jt d S rr   )r   DESCRIBE	STATEMENTrY   r   r  )rt   r  r   r   r   send_DESCRIBE_STATEMENT  s    z&CoreConnection.send_DESCRIBE_STATEMENTc                 C   s   |  t|| jt  d S rr   )r   QUERYr   r   r   )rt   sqlr   r   r   
send_QUERY  s    zCoreConnection.send_QUERYc                 C   s*   t |}| | t| j | | |S rr   )r   r#  rN   r   handle_messages)rt   r  r   r   r   r   execute_simple  s
    


zCoreConnection.execute_simplec              
   C   s   t ||d}| t|| t| jt t| j | | | t t| jt zt| j W n< t	y } z$| jd u rt
dn|W Y d }~n
d }~0 0 t| j|}| t| | | |   t| jt t| j | | |S )N)r   r   )r   r  r   rY   r   r   rN   r$  r   AttributeErrorr   r   r   	send_BINDsend_EXECUTE)rt   r  valsr  r   r   rM   paramsr   r   r   execute_unnamed  s*    







zCoreConnection.execute_unnamedc              
   C   s   t  D ]6}d| }|dt }|| jvr| j|  q>q| ||| | | t| jt	 zt
| j W n< ty } z$| jd u rtdn|W Y d }~n
d }~0 0 t|}| | ||j|jfS )NZpg8000_statement_r]   r   )r   r   r   r   addr  r   rY   r   r   rN   r&  r   r   r$  r  r  )rt   r  r  r   Zstatement_namer  rM   r   r   r   r   prepare_statement  s$    






z CoreConnection.prepare_statementc                 C   sF   t |||d}| || |   t| jt t| j | | |S )N)r  r  r  )r   r'  r(  rY   r   r   rN   r$  )rt   r  r*  r  r  r  r   r   r   r   execute_named  s    

zCoreConnection.execute_namedc              
   C   s   t |}|tt|d  || zt| jt| W nV tyz } z&t|dkrbt	dn|W Y d }~n"d }~0  t
y   t	dY n0 d S )Nr6   zwrite to closed filer   )rO   rQ   r7   r8   rY   r   rR   
ValueErrorr   r   r&  )rt   r9   r:   rT   rM   r   r   r   r     s    

zCoreConnection._send_messagec                 C   s   t t| td tt| }|D ]D}|du r@|td q$|| j}|tt| || q$|td | t	| t
| jt dS )r   r   Nr   )rO   r   r  r8   rQ   r7   r   r   r   BINDrY   r   r  )rt   r  r*  Zretvalvaluer   r   r   r   r'    s    zCoreConnection.send_BINDc                 C   s   t | jt t | jt dS r   )rY   r   EXECUTE_MSGr  rs   r   r   r   r(    s    zCoreConnection.send_EXECUTEc                 C   s   d S rr   r   )rt   r   r   r   r   r   r   #  s    zCoreConnection.handle_NO_DATAc                 C   s   | j tkr>|jd u r>|j d d }|dkr>td|_|d d d}z0t|d }|j	dkrp||_	n| j	|7  _	W n t
y   Y n0 d S )Nr   ;ZROLLBACKzin failed transaction blockr       )r   IN_FAILED_TRANSACTIONra   r  r   rstripupperr   int	row_countr/  )rt   r:   r   r"  valuesr9  r   r   r   r   &  s    

z&CoreConnection.handle_COMMAND_COMPLETEc                 C   sx   d}g }|j D ]X}t||d }|d7 }|dkr6d }n&|t||||  | jd}||7 }|| q|j| d S )Nr  r   r6   r   )encoding)r  r   r   r   r   r  )rt   r:   r   r   rowfuncZvlenr   r   r   r   r   6  s    
zCoreConnection.handle_DATA_ROWc                 C   sR   d }|t kr>tt| jd\}}| j| t| j|d | q|jd urN|jd S )Nr   r6   )r   r   rV   r   r   ra   )rt   r   r9   r   r   r   r   r$  D  s    
zCoreConnection.handle_messagesc                 C   sT   |  tt|  t| jt t| jt t| j td}| 	| | j
| dS r   )r   CLOSEr  rY   r   r  r   rN   r   r$  r   remove)rt   r  r   r   r   r   close_prepared_statementO  s    

z'CoreConnection.close_prepared_statementc                 C   s    | j dd |tD  dS )r   c                 S   s"   i | ]}|d d |dd qS )r   r[   Nr   r   r   r   r   r   [  r5   z9CoreConnection.handle_NOTICE_RESPONSE.<locals>.<dictcomp>N)r   r   r   r   r   r   r   r   r   Y  s    z%CoreConnection.handle_NOTICE_RESPONSEc                 C   s   | t}|d | d||d d | j }}|| j|< |dkr`| }t||| _n|dkrt|dkr|q|n|dkr|d S )Nr]   r[   r   Zclient_encodingZinteger_datetimesonZserver_version)r   r   re   r   r   lowerr	   get)rt   r:   r   poskeyr1  r;  r   r   r   r   ]  s    
 
z&CoreConnection.handle_PARAMETER_STATUS)rz   Nr{   NNNNNTNNNN)r   )r   r   N)N)*__name__
__module____qualname__ru   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rb   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   rq      sj                
 	>
D

	


rq   c                   @   s   e Zd ZdddZdS )r   Nc                 C   sF   || _ |d u rd ng | _d| _|| _|| _|d u r6g n|| _d | _d S )Nr   )r  r  r9  r  r   r  ra   )rt   r  r   r  r  r   r   r   r   s  s    zContext.__init__)NNN)rF  rG  rH  r   r   r   r   r   r   r  s   r   )r5   )fr   r_   collectionsr   r   hashlibr   ior   r   	itertoolsr   structr   rf   pg8000.convertersr	   r
   r   r   r   pg8000.exceptionsr   r   verr   r7   r   r  r  rd   Z	ii_unpackZihihih_packr  Zci_packr   Zbh_packr   Z	cccc_packr
  
__author__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r0  r  r!  ZEXECUTEZFLUSHZSYNCr  r  Z	TERMINATEr>  r;   r  r   r   r   r2  r  ZPORTALZRESPONSE_SEVERITYZRESPONSE_CODEZRESPONSE_MSGZRESPONSE_DETAILZRESPONSE_HINTZRESPONSE_POSITIONZRESPONSE__POSITIONZRESPONSE__QUERYZRESPONSE_WHEREZRESPONSE_FILEZRESPONSE_LINEZRESPONSE_ROUTINEZIDLEIN_TRANSACTIONr5  rN   rV   rY   rp   rq   r   r   r   r   r   <module>   s   
Q    z