§
    öÛgáW  ã                   ó   — d 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mZ ddlmZ dd	lmZmZmZmZ dd
lmZ dZ G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdZdZdZ G d„ de¦  «        Z d„ Z!d„ Z"d„ Z#d„ Z$eefe eefd„ eefd„ eefd„ eefd„ eefd „ eefd!„ eefd"„ eefd#„ i	Z% G d$„ d%e¦  «        Z& G d&„ d'e¦  «        Z' G d(„ d)e¦  «        Z( G d*„ d+e(e¦  «        Z) G d,„ d-e(¦  «        Z* G d.„ d/e)¦  «        Z+ G d0„ d1e)¦  «        Z, G d2„ d3e)¦  «        Z- G d4„ d5e-¦  «        Z. G d6„ d7e*¦  «        Z/ G d8„ d9e*¦  «        Z0 G d:„ d;e0¦  «        Z1 G d<„ d=e*¦  «        Z2 G d>„ d?ee¦  «        Z3d@„ Z4dS )AzÇ
Manage complex COPY operations; one-to-many COPY streaming.

Primarily this module houses the `CopyManager` class, and the `transfer`
function for a high-level interface to using the `CopyManager`.
é    N)ÚabstractmethodÚabstractproperty)ÚIteratoré   )ÚElementÚ
ElementSet)Úulong_unpackÚ
ulong_pack)Úpq_message_stream)ÚCopyDataÚCopyDoneÚCompleteÚcat_messages)r   i (  c                   ó   — e Zd ZdS )ÚFaultN©Ú__name__Ú
__module__Ú__qualname__© ó    úH/granary/edev/quantum/lib/python3.11/site-packages/postgresql/copyman.pyr   r      s   € € € € € Ø€r   r   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚProducerFaultzb
	Exception raised when the Producer caused an exception.

	Normally, Producer faults are fatal.
	c                 ó   — || _         d S ©N)Úmanager)Úselfr   s     r   Ú__init__zProducerFault.__init__   s   € Ø€$„,€,€,r   c                 ó   — dS )Nzproducer raised exceptionr   ©r   s    r   Ú__str__zProducerFault.__str__"   s   € Ø	$Ð	$r   N©r   r   r   Ú__doc__r   r"   r   r   r   r   r      s<   € € € € € ðð ð
ð ð ð%ð %ð %ð %ð %r   r   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚReceiverFaultaj  
	Exception raised when Receivers cause an exception.

	Faults should be trapped if recovery from an exception is
	possible, or if the failed receiver is optional to the succes of the
	operation.

	The 'manager' attribute is the CopyManager that raised the fault.

	The 'faults' attribute is a dictionary mapping the receiver to the exception
	instance raised.
	c                 ó"   — || _         || _        d S r   )r   Úfaults)r   r   r(   s      r   r   zReceiverFault.__init__2   s   € Ø€$„,Ø€$„+€+€+r   c                 óP   — d                      t          | j        ¦  «        ¦  «        S )Nz{0} faults occurred)ÚformatÚlenr(   r!   s    r   r"   zReceiverFault.__str__6   s    € Ø	×	%Ò	%¥c¨$¬+Ñ&6Ô&6Ñ	7Ô	7Ð7r   Nr#   r   r   r   r&   r&   %   s<   € € € € € ðð ðð ð ð8ð 8ð 8ð 8ð 8r   r&   c                   ó&   — e Zd ZdZ	 	 	 dd„Zd„ ZdS )ÚCopyFaila‡  
	Exception thrown by the CopyManager when the COPY operation failed.

	The 'manager' attribute the CopyManager that raised the CopyFail.

	The 'reason' attribute is a string indicating why it failed.

	The 'receiver_faults' attribute is a mapping of receivers to exceptions that were
	raised on exit.

	The 'producer_fault' attribute specifies if the producer raise an exception
	on exit.
	Nc                 óB   — || _         || _        |pi | _        || _        d S r   )r   ÚreasonÚreceiver_faultsÚproducer_fault)r   r   r/   r0   r1   s        r   r   zCopyFail.__init__G   s-   € ð €$„,Ø€$„+Ø(Ð.¨B€$ÔØ&€$ÔÐÐr   c                 ó   — | j         pdS )Nzcopy aborted)r/   r!   s    r   r"   zCopyFail.__str__P   s   € Ø	ŒÐ	&˜Ð&r   )NNNr#   r   r   r   r-   r-   9   sL   € € € € € ðð ð '+ØØð'ð 'ð 'ð 'ð'ð 'ð 'ð 'ð 'r   r-   ÚPQv3ÚCHUNKSc                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚChunkProtocol)Úbufferc                 ó,   — t          ¦   «         | _        d S r   )r   r7   r!   s    r   r   zChunkProtocol.__init__]   s   € Ý!Ñ#Ô#€$„+€+€+r   c                 ó–   — | j                              t          |¦  «        ¦  «         d„ | j                              ¦   «         D ¦   «         S )Nc                 ó   — g | ]
}|d          ‘ŒS )r   r   ©Ú.0Úxs     r   ú
<listcomp>z*ChunkProtocol.__call__.<locals>.<listcomp>b   s   € Ð	+Ð	+Ð	+�1ˆ!ˆAŒ$Ð	+Ð	+Ð	+r   )r7   ÚwriteÚbytesÚread©r   Údatas     r   Ú__call__zChunkProtocol.__call__`   s@   € Ø„+×Ò•E˜$‘K”KÑ Ô Ð Ø	+Ð	+˜œ×(Ò(Ñ*Ô*Ð	+Ñ	+Ô	+Ð+r   N©r   r   r   Ú	__slots__r   rD   r   r   r   r6   r6   [   s7   € € € € € Ø€ð$ð $ð $ð,ð ,ð ,ð ,ð ,r   r6   c                 ó    — t          d¦  «        S ©Nr   )Ú
memoryview©Úargs    r   Ú	EmptyViewrL   e   s   € Ý�3‰ŒÐr   c                 ó   — g S r   r   rJ   s    r   Ú	EmptyListrN   g   s   € Ø
€r   c                 ó   — d S r   r   rJ   s    r   Ú
ReturnNonerP   i   s   € Øˆr   c                 ó   — | S r   r   rJ   s    r   ÚNoTransformationrR   l   s   € Ø€r   c                  ó   — t           S r   )r   r   r   r   ú<lambda>rT   t   s   € ­L€ r   c                  ó   — t           S r   )rL   r   r   r   rT   rT   v   s   € ­)€ r   c                  ó   — t           S r   )rN   r   r   r   rT   rT   w   s   € ­I€ r   c                  ó   — t           S r   ©rP   r   r   r   rT   rT   x   s   € ­*€ r   c                  ó   — t           S r   rX   r   r   r   rT   rT   y   s   € ­J€ r   c                  ó   — t           S r   ©rR   r   r   r   rT   rT   {   ó   € Õ*:€ r   c                  ó   — t           S r   r[   r   r   r   rT   rT   |   s   € Õ.>€ r   c                  ó   — t           S r   r[   r   r   r   rT   rT   }   r\   r   c                   ó   — e Zd ZdZd„ Zd„ ZdS )ÚCopyTransformer)ÚcurrentÚtransformersÚgetc                 óx   ‡— i | _         ˆfd„t          |¦  «        D ¦   «         | _        | j         j        | _        d S )Nc                 ó>   •— i | ]}|t          ‰|f         ¦   «         “ŒS r   )Úcopy_protocol_mappings)r<   r=   Úsource_protocols     €r   ú
<dictcomp>z,CopyTransformer.__init__.<locals>.<dictcomp>†   s<   ø€ ð ð ð àð Õ˜°Ð2Ô3Ñ5Ô5ðð ð r   )ra   Úsetrb   Ú__getitem__rc   )r   rg   Útarget_protocolss    ` r   r   zCopyTransformer.__init__„   sP   ø€ Ø€$„,ðð ð ð åÐ Ñ!Ô!ðñ ô €$Ôð Œ\Ô%€$„(€(€(r   c                 ój   — | j                              ¦   «         D ]\  }} ||¦  «        | j        |<   Œd S r   )rb   Úitemsra   )r   rC   ÚprotocolÚtransformers       r   rD   zCopyTransformer.__call__Œ   sH   € Ø#Ô0×6Ò6Ñ8Ô8ð .ð .Ñ€h�Ø'˜K¨Ñ-Ô-€4„<�ÑÐð.ð .r   NrE   r   r   r   r`   r`   ‚   s7   € € € € € Ø/€ð&ð &ð &ð.ð .ð .ð .ð .r   r`   c                   óš   — e Zd ZdZdZeefd„Z e e	d¦  «        d         e
¦  «        rej        d         j        nej        j        fd„ZdS )Ú	WireStatea   
	Manages the state of the wire.

	This class manages three possible positions:

	 1. Between wire messages
	 2. Inside message header
	 3. Inside message (with complete header)

	The wire state will become unusable when the configured condition is True.
	©Úremaining_bytesÚsize_fragmentÚ
final_viewÚ	conditionc                 ól  — | j         �t          d¦  «        ‚d}| j        }| j        }| j        }|dk    rY ||¦  «        }|t          |dd|z
  …         ¦  «        z  } ||¦  «        dk    r ||¦  «        |z
  }d}n ||¦  «        dk     sJ ‚|dk    r’ ||¦  «        }		 |r$||d…         }||	z
  }
|
dk    r|
 }	d}|dz  }nd}	|
}|sn] ||d         ¦  «        r|| _         |dk    sJ ‚n<|	d	k     rd}|dd…         }|t          |¦  «        z  }n ||dd	…         ¦  «        dz   }Œ†||c| _        | _        |S )
zZ
		Given the state of the COPY and new data, advance the position on the
		COPY stream.
		Nz,wire state encountered exceptional conditionr   éÿÿÿÿé   r   Tr   é   )ru   ÚRuntimeErrorrs   rt   rv   r@   )r   ÚviewÚgetlenr+   Ú	nmessagesrs   rt   Ú	CONDITIONÚoÚvlenÚrbs              r   ÚupdatezWireState.update¢   sà  € ð 
„_Ð Ý	ÐDÑ	EÔ	EÐEà€)ð Ô(€/ØÔ$€-ð Œn€)ð ˜ÒÐð €sˆ=ÑÔ€1Ø•E˜$˜t  !¡˜tœ*Ñ%Ô%Ñ%€=Ø	€cˆ-ÑÔ˜AÒÐð �f˜]Ñ+Ô+¨aÑ/€OØ€M€Màˆ3ˆ}ÑÔ Ò!Ð!Ð!Ð!ð ˜ÒÐØ
ˆ#ˆd‰)Œ)€4ð%,Øð ð �Ð!Ð!Ô"€Tà
˜DÑ
 €RØ
ˆaŠˆàˆS€dØ€oØ�1�n€i€ià€dØ€oð ð à
à€y��a”ÑÔð ð €T„_Ø˜qÒ Ð Ð Ð Ø
Øˆa‚x€xà€_Ø���ŒH€TØ•e˜D‘k”kÑ!€]à
à�f˜T ! A #œYÑ'Ô'¨!Ñ+€OðK%,ðR �Mð +€$Ô˜Ô*ð 
Ðr   ó   fr   c                 ó>   — d| _         d| _        d | _        || _        d S )Nr   r   rr   )r   rv   s     r   r   zWireState.__init__ö   s$   € Ø€$ÔØ€$ÔØ€$„/Ø€$„.€.€.r   N)r   r   r   r$   rF   r	   r+   rƒ   Ú
isinstancerI   Úintr   ÚtypeÚ__ne__r   r   r   r   rq   rq   ”   s—   € € € € € ð
ð 
ð N€à!-°Sð Rð Rð Rð Rðh =G¸JÀzÀzÐRVÑGWÔGWÐXYÔGZÐ\_Ñ<`Ô<`Ð!z ¤¨qÔ!1Ô!8Ð!8ÐfnÔfsÔfzð ð ð ð ð ð r   rq   c                   ó:   — e Zd ZdZd„ Zed„ ¦   «         Zd„ Zd„ ZdS )ÚFittingÚFITTINGc              #   ó,   K  — d d| j         z   dz   fV — d S ©Nú[ú]©Ústater!   s    r   Ú_e_metaszFitting._e_metasÿ   ó)   è è € Øˆc�D”JÑ Ñ$Ð$Ð$Ð$Ð$Ð$Ð$r   c                 ó   — dS )z0
		The COPY data format produced or consumed.
		Nr   r!   s    r   rn   zFitting.protocol  ó   € € € r   c                 ó   — d S r   r   r!   s    r   Ú	__enter__zFitting.__enter__	  ó   € Ø€$r   c                 ó   — d S r   r   ©r   ÚtypÚvalÚtbs       r   Ú__exit__zFitting.__exit__  r™   r   N)	r   r   r   Ú_e_labelr“   r   rn   r˜   rŸ   r   r   r   r‹   r‹   ü   sb   € € € € € Ø€ð%ð %ð %ð ðð ñ Ôððð ð ðð ð ð ð r   r‹   c                   óT   ‡ — e Zd ZdZˆ fd„Zd„ Zed„ ¦   «         Zed„ ¦   «         Zˆ xZ	S )ÚProducerÚPRODUCERc              #   óÒ   •K  — t          ¦   «                              ¦   «         D ]}|V — Œdt          | j        dz  ¦  «        dz   fV — d| j        fV — d| j        | j        z  fV — d S )NrC   i   ÚMBÚmessageszaverage size)Úsuperr“   ÚstrÚtotal_bytesÚtotal_messages©r   r=   Ú	__class__s     €r   r“   zProducer._e_metas  s�   øè è € Ý‰7Œ7×ÒÑÔð ð €aØ	
€7€7€7€7Ø•�DÔ$¨Ñ0Ñ1Ô1°DÑ8Ð8Ð8Ð8Ð8Ø�DÔ'Ð'Ð'Ð'Ð'Ø˜Ô)¨DÔ,?Ñ?Ð@Ð@Ð@Ð@Ð@Ð@r   c                 ó"   — d| _         d| _        d S )Nr   )rª   r©   r!   s    r   r   zProducer.__init__  s   € Ø€$ÔØ€$ÔÐÐr   c                 ó   — dS )zÌ
		Method implemented by producers that emit COPY data that is not
		guaranteed to be aligned.

		This is only necessary in failure cases where receivers still need more
		data to complete the message.
		Nr   r!   s    r   ÚrealignzProducer.realign  r–   r   c                 ó   — dS )z#
		Produce the next set of data.
		Nr   r!   s    r   Ú__next__zProducer.__next__(  r–   r   )
r   r   r   r    r“   r   r   r¯   r±   Ú__classcell__©r¬   s   @r   r¢   r¢     s‡   ø€ € € € € Ø€ðAð Að Að Að Aðð ð ð ðð ñ „.ðð ðð ñ „.ðð ð ð ð r   r¢   c                   ó>   — e Zd ZdZed„ ¦   «         Zed„ ¦   «         ZdS )ÚReceiverÚRECEIVERc                 ó   — dS )z0
		Finish the reception of the accepted data.
		Nr   r!   s    r   ÚtransmitzReceiver.transmit1  r–   r   c                 ó   — dS )z+
		Take the data object to be processed.
		Nr   rB   s     r   ÚacceptzReceiver.accept7  r–   r   N)r   r   r   r    r   r¸   rº   r   r   r   rµ   rµ   .  sM   € € € € € Ø€àðð ñ „.ðð
 ðð ñ „.ðð ð r   rµ   c                   ó&   — e Zd ZdZdZeZd„ Zd„ ZdS )ÚNullProducerz
	Produces no copy data.
	r   c                 ó   — d S r   r   r!   s    r   r¯   zNullProducer.realignD  ó   € à€$r   c                 ó   — t           ‚r   )ÚStopIterationr!   s    r   r±   zNullProducer.__next__H  s   € ÝÐr   N)	r   r   r   r$   Ú
_e_factorsÚPROTOCOL_NULLrn   r¯   r±   r   r   r   r¼   r¼   =  sH   € € € € € ðð ð €Ø€ðð ð ðð ð ð ð r   r¼   c                   ó6   ‡ — e Zd ZdZeZˆ fd„Zd„ Zefd„Z	ˆ xZ
S )ÚIteratorProducer)Úiteratorc                 ó’   •— t          |¦  «        | _        | j        j        | _        t          ¦   «                              ¦   «          d S r   )ÚiterrÅ   r±   r§   r   )r   rÅ   r¬   s     €r   r   zIteratorProducer.__init__O  s8   ø€ Ý�x‘.”.€$„-Ø”-Ô(€$„-Ý�'„'×ÒÑÔÐÐÐr   c                 ó   — d S r   r   r!   s    r   r¯   zIteratorProducer.realignT  r¾   r   c                 óÀ   —  || j         ¦  «        }| xj        t          |¦  «        z  c_        | xj        t	          t          t          |¦  «        ¦  «        z  c_        |S r   )rÅ   rª   r+   r©   ÚsumÚmap)r   ÚnextÚns      r   r±   zIteratorProducer.__next__X  sV   € Ø
€dˆ4Œ=ÑÔ€!ØÐÔ�˜Q™œÑÐÔØÐÔ•c�#�c 1™+œ+Ñ&Ô&Ñ&ÐÔØ	
€(r   )r   r   r   rÁ   ÚPROTOCOL_CHUNKSrn   r   r¯   rÌ   r±   r²   r³   s   @r   rÄ   rÄ   K  sj   ø€ € € € € Ø€Ø€ðð ð ð ð ð
ð ð ð  ð ð ð ð ð ð ð ð r   rÄ   c                   óh   ‡ — e Zd ZdZeZed„ ¦   «         Zd„ Zd„ Z	d„ Z
d„ Zd„ Zd„ Zef	 dˆ fd„Zˆ xZS )ÚProtocolProducerzŸ
	Producer using a PQv3 data stream.

	Normally, this class needs to be subclassed as it assumes that the given
	recv_into function will write COPY messages.
	c                 ó   — dS )zÞ
		Given a view containing data read from the wire, recover the
		controller's state.

		This needs to be implemented by subclasses in order for the
		ProtocolReceiver to pass control back to the original state machine.
		Nr   ©r   r|   s     r   ÚrecoverzProtocolProducer.recoverg  r–   r   c                 ó¨  — | j         }|€t          d¦  «        j        | _        d S |j        rt          |j        ¦  «        }d}nÃ|j        dk    rut          j        |j	        z   }| j         j	         
                    dd¦  «        dz   }|t          | j         j	        ¦  «        d …         }t          |¦  «        dz
  }|d|z  z  }|}nC|j        dk    r4t          j        t          |j        dz   ¦  «        z   }d| j         j        z  }ndx}}|                      |¦  «         |rt          |f¦  «        j        | _        d S t          d¦  «        j        | _        d S )	Nr   r   rx   é   ó    ó   ry   r   )Ú_staterÇ   r±   Ú	nextchunkru   r@   rs   r   rˆ   rt   Úljustr+   r	   r
   rÓ   )r   ÚsÚfor_producerÚfor_receiversÚheaderÚbufÚbodylens          r   r¯   zProtocolProducer.realignt  sQ  € Ø
„k€!à€Yå˜‘H”HÔ%€4„>Ø	€6à„\ð &å˜œÑ%Ô%€<Ø€=€=ØÔ˜BÒÐå”- !¤/Ñ1€<àŒ[Ô&×,Ò,¨Q°Ñ8Ô8¸7ÑB€6à	•�D”KÔ-Ñ.Ô.Ð/Ð/Ô	0€3Ý˜&Ñ!Ô! AÑ%€7ð ˆ'�GÑ
Ñ€3Ø€=€=ØÔ˜1ÒÐå”-¥*¨QÔ->ÀÑ-BÑ"CÔ"CÑC€<Ø˜Tœ[Ô8Ñ8€=€=à"%Ð%€<�-à‡,‚,ˆ|ÑÔÐØð &Ý˜-Ð)Ñ*Ô*Ô3€4„>€>€>å˜‘H”HÔ%€4„>€>€>r   c                 ó,  — | xj         | j                             |¦  «        z  c_         | j        j        �B| j        j        }|r|d t	          |¦  «         …         }|                      |¦  «         d | _        | xj        t	          |¦  «        z  c_        |S r   )rª   rØ   rƒ   ru   r+   rÓ   r©   )r   r|   Úfvs      r   Úprocess_copy_dataz"ProtocolProducer.process_copy_data™  s�   € ØÐÔ˜œ×+Ò+¨DÑ1Ô1Ñ1ÐÔØ	„[ÔÐ'àŒÔ€2àð Ø�	•#�b‘'”'��	Œ?€Dà‡<‚<�ÑÔÐØ€4„;ØÐÔ•c˜$‘i”iÑÐÔØ	€+r   c                 ój   — t          ¦   «         | _        | j        | _        |                      |¦  «        S r   )rq   rØ   Ú	recv_viewrÙ   rã   rÒ   s     r   Útrack_statezProtocolProducer.track_state¨  s*   € Ý‘”€$„+Ø”>€$„.Ø	×	Ò	 Ñ	%Ô	%Ð%r   c                 óú   — | j         d |                      | j        | j        ¦  «        …         }|s6|                      t          d¦  «        ¦  «         |                      ¦   «         S |                      |¦  «        }|S rH   )Úbuffer_viewÚ	recv_intor7   Úbuffer_sizerÓ   rI   rÙ   rã   rÒ   s     r   rå   zProtocolProducer.recv_view®  sp   € Ø	Ô	ÐH˜4Ÿ>š>¨$¬+°tÔ7GÑHÔHÐHÔ	I€$Ø	ð à‡<‚<•
˜3‘”Ñ Ô Ð Ø
�.Š.Ñ
Ô
ÐØ	×	Ò	 Ñ	%Ô	%€$Ø	€+r   c                 ó    — t          d¦  «        ‚)Nz!producer not properly initialized)r{   r!   s    r   rÙ   zProtocolProducer.nextchunk·  s   € ÝÐ8Ñ9Ô9Ð9r   c                 ó*   — |                       ¦   «         S r   )rÙ   r!   s    r   r±   zProtocolProducer.__next__º  s   € Ø	�ŠÑ	Ô	Ðr   ré   ú(callable taking writable buffer and sizec                 óÌ   •— t          ¦   «                              ¦   «          || _        || _        t	          |¦  «        | _        t          | j        ¦  «        | _        d | _        d S r   )	r§   r   ré   rê   Ú	bytearrayr7   rI   rè   rØ   )r   ré   rê   r¬   s      €r   r   zProtocolProducer.__init__½  sV   ø€ õ �'„'×ÒÑÔÐØ€$„.Ø €$ÔÝ˜+Ñ&Ô&€$„+Ý ¤Ñ,Ô,€$ÔØ€$„+€+€+r   )ré   rí   )r   r   r   r$   ÚPROTOCOL_PQv3rn   r   rÓ   r¯   rã   ræ   rå   rÙ   r±   Údefault_buffer_sizer   r²   r³   s   @r   rÐ   rÐ   ^  sÏ   ø€ € € € € ðð ð €àðð ñ „.ðð#&ð #&ð #&ðJð ð ð&ð &ð &ðð ð ð:ð :ð :ðð ð ð
 $ð	Ø8ð	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	r   rÐ   c                   ór   ‡ — e Zd ZdZˆ fd„Zed„ ¦   «         Zd„ Zd„ Zˆ fd„Z	e
fd„Zd„ Zˆ fd	„Zˆ fd
„Zˆ xZS )ÚStatementProducer©Ú	statementÚ
parametersc              #   óZ   •K  — t          ¦   «                              ¦   «         D ]}|V — Œd S r   )r§   r“   r«   s     €r   r“   zStatementProducer._e_metasË  s;   øè è € Ý‰7Œ7×ÒÑÔð ð €aØ	
€7€7€7€7ðð r   c                 ó   — | j         €dS dS )NÚcreatedÚ	producing)Ú_chunksr!   s    r   r’   zStatementProducer.stateÏ  s   € à	„\ÐØ
ˆ)Ø	ˆr   c                 ó4   — | j                              ¦   «         S r   )rû   Úcountr!   s    r   rý   zStatementProducer.countÕ  s   € Ø	Œ×	Ò	Ñ	Ô	Ðr   c                 ó4   — | j                              ¦   «         S r   )rû   Úcommandr!   s    r   rÿ   zStatementProducer.commandØ  s   € Ø	Œ×	Ò	Ñ	Ô	Ðr   c                 óŽ   •—  t          ¦   «         j        |j        j        j        j        fi |¤Ž || _        || _        d | _        d S r   )	r§   r   ÚdatabaseÚpqÚsocketré   rõ   rö   rû   )r   rõ   ÚargsÚkwr¬   s       €r   r   zStatementProducer.__init__Û  sG   ø€ Ø…%�'„'Ô�9Ô%Ô(Ô/Ô9Ð@Ð@¸RÐ@Ð@Ð@Ø€$„.Ø€$„/Ø€$„,€,€,r   c                 óö  — g }	 |s%|                       || j        ¦  «        ¦  «         |¯%n# t          $ r |s‚ Y nw xY w| j        j        j        }t          |¦  «        |j                             ¦   «         z   |j        pdz   }t          |¦  «        }d |_        |j         
                    ¦   «          |                      |¦  «        }| j        j        j        t          u r| j        | _        | j        j        �J ‚|S rH   )Úextendrû   rÀ   r  r  r   Úmessage_bufferÚgetvalueÚ	read_datarI   Útruncateræ   Ú_xactr’   ÚxactCompleteÚ
confiscaterÙ   rØ   ru   )r   rÌ   ra   r  r7   r|   Úrs          r   r  zStatementProducer.confiscateã  s  € Ø€'ð
Øð 'Ø‡N‚N�4�4˜œÑ%Ô%Ñ&Ô&Ð&ð ð 'øøå	ð 
ð 
ð 
Ø
ð 
à	ð
ð 
ð
øøøð „|ÔÔ€"Ý˜Ñ Ô  2Ô#4×#=Ò#=Ñ#?Ô#?Ñ?À2Ä<ÐCVÐSVÑW€&Ý	�FÑ	Ô	€$Ø€"„,ØÔ×ÒÑÔÐà
×Ò�tÑÔ€!à	„\ÔÔ¥Ð-Ð-à”O€4„>Ø
Œ+Ô
 Ð
(Ð
(Ð
(Ø	
€(s   „', ¬<»<c                 óŠ   — | j         j        j        j                             t          |¦  «        ¦  «         | j        | _        d S r   )rû   r  r  r  r?   r@   r  rÙ   rÒ   s     r   rÓ   zStatementProducer.recoverú  s4   € à„,ÔÔÔ)×/Ò/µ°d±´Ñ<Ô<Ð<Ø”?€$„.€.€.r   c                 ó¾   •— t          ¦   «                              ¦   «          | j        �t          d¦  «        ‚ | j        j        | j        Ž | _        | j        | _        d S )Nzreceiver already used)	r§   r˜   rû   r{   rõ   Úchunksrö   r  rÙ   )r   r¬   s    €r   r˜   zStatementProducer.__enter__ÿ  sR   ø€ Ý�'„'×ÒÑÔÐØ	„\ÐÝ	Ð-Ñ	.Ô	.Ð.Ø&�”Ô&¨¬Ð8€$„,à”?€$„.€.€.r   c                 ó"  •— |�t          |t          ¦  «        rS| j        j        }|j        s@| j        j        �4|                     ¦   «          |j        j	        r| 
                    ¦   «          t          ¦   «                              |||¦  «         d S r   )Ú
issubclassÚ	Exceptionrõ   r  Úclosedrû   r  Ú	interruptr  ÚxactÚ_pq_completer§   rŸ   )r   rœ   r�   rž   Údbr¬   s        €r   rŸ   zStatementProducer.__exit__  s�   ø€ Ø€[•J˜s¥IÑ.Ô.€[ØŒÔ€2Ø
Œ)ð ˜œÔ*Ð6ð ‡L‚L�N„N€NØ	„u„zð à‡_‚_ÑÔÐÝ�'„'×Ò�3˜˜RÑ Ô Ð Ð Ð r   )r   r   r   rÁ   r“   Úpropertyr’   rý   rÿ   r   rÌ   r  rÓ   r˜   rŸ   r²   r³   s   @r   ró   ró   È  sé   ø€ € € € € Ø*€ðð ð ð ð ð ðð ñ „(ðð
ð ð ð ð  ð  ðð ð ð ð ð "ð ð ð ð ð.#ð #ð #ð
#ð #ð #ð #ð #ð
!ð 
!ð 
!ð 
!ð 
!ð 
!ð 
!ð 
!ð 
!r   ró   c                   ó&   — e Zd ZdZeZdZd„ Zd„ ZdS )ÚNullReceiverr   Únullc                 ó   — d S r   r   r!   s    r   r¸   zNullReceiver.transmit  r¾   r   c                 ó   — d S r   r   rB   s     r   rº   zNullReceiver.accept  r™   r   N)	r   r   r   rÁ   rÂ   rn   r’   r¸   rº   r   r   r   r  r    sA   € € € € € Ø€Ø€Ø	€ðð ð ðð ð ð ð r   r  c                   ó>   ‡ — e Zd ZeZdZˆ fd„Zd„ Zd„ Zd„ Z	d„ Z
ˆ xZS )ÚProtocolReceiver)Úsendr|   c                 ó~   •— t          ¦   «                              ¦   «          || _        t          d¦  «        | _        d S rH   )r§   r   r#  rI   r|   )r   r#  r¬   s     €r   r   zProtocolReceiver.__init__#  s1   ø€ Ý�'„'×ÒÑÔÐØ€$„)Ý˜‰oŒo€$„)€)€)r   c                 ó   — || _         d S r   )r|   rB   s     r   rº   zProtocolReceiver.accept(  s   € Ø€$„)€)€)r   c                 ó~   — | j         r5| j         |                      | j         ¦  «        d …         | _         | j         °3d S d S r   )r|   r#  r!   s    r   r¸   zProtocolReceiver.transmit+  sN   € ØŒ	ð 0ØŒy˜Ÿš 4¤9Ñ-Ô-Ð.Ð.Ô/€4„9ð 	Œ	ð 0ð 0ð 0ð 0ð 0r   c                 ó   — | S r   r   r!   s    r   r˜   zProtocolReceiver.__enter__/  ó   € Ø	€+r   c                 ó   — d S r   r   r›   s       r   rŸ   zProtocolReceiver.__exit__2  r™   r   )r   r   r   rð   rn   rF   r   rº   r¸   r˜   rŸ   r²   r³   s   @r   r"  r"    s~   ø€ € € € € Ø€Ø€ðð ð ð ð ð
ð ð ð0ð 0ð 0ðð ð ðð ð ð ð ð ð r   r"  c                   óˆ   ‡ — e Zd ZdZej        ez   dz   Zd„ Zˆ fd„Z G d„ de¦  «        Z	d„ Z
efˆ fd„	Zˆ fd	„Zd
„ Zd„ Zˆ xZS )ÚStatementReceiverrô   )r  c              #   ó,   K  — d d| j         z   dz   fV — d S rŽ   r‘   r!   s    r   r“   zStatementReceiver._e_metas9  r”   r   c                 óœ   •— || _         || _        d | _        t          ¦   «                              |j        j        j        j        ¦  «         d S r   )	rõ   rö   r  r§   r   r  r  r  r#  )r   rõ   rö   r¬   s      €r   r   zStatementReceiver.__init__<  sB   ø€ Ø€$„.Ø€$„/Ø€$„)Ý�'„'×Ò�9Ô%Ô(Ô/Ô4Ñ6Ô6Ð6Ð6Ð6r   c                   ó   — e Zd ZdS )úStatementReceiver.WireReadyNr   r   r   r   Ú	WireReadyr/  E  s   € € € € € Ø€$r   r0  c              #   ó.   K  — |                       ¦   «         ‚r   )r0  r!   s    r   Úraise_wire_readyz"StatementReceiver.raise_wire_readyG  s   è è € Ø�ŠÑÔÐr   c                 ó  •— t          ¦   «                              ¦   «          	  | j        j         ||                      ¦   «         ¦  «        g| j        ¢R Ž  d S # | j        $ r | j        j        j        j	        | _	        Y d S w xY wr   )
r§   r˜   rõ   Úload_chunksr2  rö   r0  r  r  r  )r   rÇ   r¬   s     €r   r˜   zStatementReceiver.__enter__K  s¢   ø€ Ý�'„'×ÒÑÔÐð/Ø€4„>ÔØ€Dˆ×	Ò	Ñ	 Ô	 Ñ!Ô!ðØ$(¤Oðð ð ð ð ð øð 
Œð /ð /ð /ð Œ~Ô&Ô)Ô.€4„9€9€9€9ð/øøøs   £3A Á%BÂ Bc                 ó–  •— | j         €#t          ¦   «                              |||¦  «        S | j        rI| j        j        j        }t          | j        ¦  «        |_        | j        j         	                    ¦   «          n¬|€w| j         j
        | j         _        | j        j         	                    ¦   «          | j                              ¦   «         D ](}t          |dd ¦  «        t          j        k    r|| _        Œ)n3t#          |t$          ¦  «        r| j        j         	                    ¦   «          t          ¦   «                              |||¦  «        S )Nrˆ   )r  r§   rŸ   r|   rõ   r  r  r@   Úmessage_datar  ÚCopyDoneSequencer¦   Úmessages_receivedÚgetattrr   rˆ   Ú_complete_messager  r  )r   rœ   r�   rž   r  r=   r¬   s         €r   rŸ   zStatementReceiver.__exit__W  s#  ø€ Ø	„YÐå
‰'Œ'×
Ò
˜3  RÑ
(Ô
(Ð(à	„Yð *ð
 	ŒÔÔ"€2å˜4œ9Ñ%Ô%€2„?Ø„>Ô×'Ò'Ñ)Ô)Ð)Ð)ð €{àœ	Ô2€4„9Ôà„>Ô×'Ò'Ñ)Ô)Ð)àŒI×'Ò'Ñ)Ô)ð  ð  €qÝˆq�&˜$ÑÔ¥8¤=Ò0Ð0Ø€TÔøð õ �#•yÑ!Ô!ð *à„>Ô×'Ò'Ñ)Ô)Ð)å	‰Œ×	Ò	˜#˜s BÑ	'Ô	'Ð'r   c                 ó4   — | j                              ¦   «         S r   )r:  Úextract_countr!   s    r   rý   zStatementReceiver.countw  s   € Ø	Ô	×	-Ò	-Ñ	/Ô	/Ð/r   c                 óZ   — | j                              ¦   «                              d¦  «        S )NÚascii)r:  Úextract_commandÚdecoder!   s    r   rÿ   zStatementReceiver.commandz  s%   € Ø	Ô	×	/Ò	/Ñ	1Ô	1×	8Ò	8¸Ñ	AÔ	AÐAr   )r   r   r   rÁ   r"  rF   r“   r   ÚBaseExceptionr0  r2  rÇ   r˜   rŸ   rý   rÿ   r²   r³   s   @r   r+  r+  5  sù   ø€ € € € € Ø*€ØÔ'¨*Ñ4°yÑ@€ð%ð %ð %ð7ð 7ð 7ð 7ð 7ðð ð ð ð �ñ ô ð ðð ð ð !ð 
/ð 
/ð 
/ð 
/ð 
/ð 
/ð(ð (ð (ð (ð (ð@0ð 0ð 0ðBð Bð Bð Bð Bð Bð Br   r+  c                   ó6   ‡ — e Zd ZdZdZeZˆ fd„Zd„ Zd„ Z	ˆ xZ
S )ÚCallReceiverz4
	Call the given object with a list of COPY lines.
	)Úcallablec                 ód   •— || _         d | _        t          ¦   «                              ¦   «          d S r   )rD  Úlinesr§   r   )r   rD  r¬   s     €r   r   zCallReceiver.__init__„  s-   ø€ Ø€$„-Ø€$„*Ý�'„'×ÒÑÔÐÐÐr   c                 óV   — | j         �|                      | j         ¦  «         d | _         d S r   )rF  rD  r!   s    r   r¸   zCallReceiver.transmit‰  s)   € Ø	„ZÐØ‡=‚=�”ÑÔÐØ€$„*€*€*r   c                 ó   — || _         d S r   )rF  )r   rF  s     r   rº   zCallReceiver.acceptŽ  s   € Ø€$„*€*€*r   )r   r   r   r$   rÁ   rÎ   rn   r   r¸   rº   r²   r³   s   @r   rC  rC  }  sl   ø€ € € € € ðð ð €Ø€ðð ð ð ð ð
ð ð ð
ð ð ð ð ð ð r   rC  c                   ól   — e Zd ZdZdZdZd„ Zed„ ¦   «         Zd„ Z	d„ Z
d„ Zd	„ Zd
„ Zd„ Zd„ Zd„ Zd„ ZdS )ÚCopyManagerzS
	A class for managing COPY operations.

	Connects the producer to the receivers.
	ÚCOPY)ÚproducerÚ	receiversc              #   ó,   K  — d d| j         z   dz   fV — d S rŽ   r‘   r!   s    r   r“   zCopyManager._e_metasš  r”   r   c                 óL   — | j         €dS t          | j        j        ¦  «        dz   S )NÚinitializedz messages transferred)ro   r¨   rL  rª   r!   s    r   r’   zCopyManager.state�  s)   € à	ÔÐØ
ˆ-Ý	ˆTŒ]Ô)Ñ	*Ô	*Ð-DÑ	DÐDr   c                 óÄ   — || _         d | _        t          |¦  «        | _        d| _        t          ¦   «         }|j        }| j        D ]} ||j        ¦  «         Œ|| _        d S )NF)	rL  ro   r   rM  Ú_seen_stop_iterationri   Úaddrn   Ú	protocols)r   rL  rM  ÚrprS  r=   s         r   r   zCopyManager.__init__£  se   € Ø€$„-Ø€$ÔÝ˜iÑ(Ô(€$„.Ø#€$ÔÝ
�u„u€"Ø
Œ€#ØŒ>ð ð €aØ€3€q„z�?„?€?€?Ø€$„.€.€.r   c                 óP  — | j         rt          d¦  «        ‚d| _        t          | j        j        | j        ¦  «        | _         | j                             ¦   «          	 | j        D ]}|                     ¦   «          Œn+# t          $ r  | j
        t          j        ¦   «         Ž  Y nw xY w| S )Nzcopy already started©r   r   )ro   r{   Ú_statsr`   rL  rn   rT  r˜   rM  r  rŸ   ÚsysÚexc_info)r   r=   s     r   r˜   zCopyManager.__enter__®  sµ   € Ø	Ôð .Ý	Ð,Ñ	-Ô	-Ð-Ø€$„+Ý$ T¤]Ô%;¸T¼^ÑLÔL€$ÔØ„-×ÒÑÔÐð"ØŒNð ð €qØ‡K‚K�M„M€M€Mðøå	ð "ð "ð "Ø€4„=•#”,‘.”.Ð!Ð!Ð!Ð!ð"øøøà	€+s   ÁA; Á;%B#Â"B#c                 ó  — |�t          |t          ¦  «        sd S d }	 | j                             ¦   «          	 |                      ¦   «          n# t
          $ r Y nw xY w| j                             |||¦  «         n# t          $ r}|}Y d }~nd }~ww xY w| j        st          | d|¬¦  «        ‚i }| j        D ]6}	 |                     |||¦  «         Œ# t          $ r}|||<   Y d }~Œ/d }~ww xY w|s|s	|s| j	        st          | d|pd |¬¦  «        ‚d S )Nzno receivers)r1   z%could not complete the COPY operation)r0   r1   )
r  r  rL  r¯   Ú_service_producerrÀ   rŸ   rM  r-   rR  )r   rœ   r�   rž   Úprofailr=   Úexit_faultsÚes           r   rŸ   zCopyManager.__exit__»  s   € ð 	€_�Z¨­YÑ7Ô7€_à	€6à€'ðà„=×ÒÑÔÐð	ð 	×ÒÑÔÐÐøõ ð 	ð 	ð 	à€Dð	øøøð „=×Ò˜#˜s BÑ'Ô'Ð'Ð'øÝ	ð ð ð à€7€7€7€7€7€7øøøøðøøøð
 
Œð BÝ	�$˜¸Ð	AÑ	AÔ	AÐAà€+ØŒ>ð ð €aðØ‡J‚Jˆs�C˜ÑÔÐÐøÝ
ð ð ð Ø€K��N€N€N€N€N€Nøøøøðøøøð 	ð ˆKð ˜7ð ¨$Ô*Cð Ý	�$Ø+Ø!Ð) TØð
ñ 
ô 
ð ðð sR   �A9 ·A ÁA9 Á
AÁA9 ÁAÁA9 Á9
BÂB
Â
BÂ7CÃ
C(ÃC#Ã#C(c                 óœ   — |j         | j        vrt          d¦  «        ‚|                     ¦   «          | j                             |¦  «         dS )zÇ
		Reconcile a receiver that faulted.

		This method should be used to add back a receiver that failed to
		complete its write operation, but is capable of completing the
		operation at this time.
		z+cannot add new receivers to copy operationsN)rn   rT  r{   r¸   rM  rS  )r   r  s     r   Ú	reconcilezCopyManager.reconcileî  sK   € ð „Z�t”~Ð%Ð%Ý	ÐCÑ	DÔ	DÐDØ‡*‚*�,„,€,à„.×Ò�QÑÔÐÐÐr   c                 óL  — | j         st          ‚	 t          | j        ¦  «        }n.# t          $ r	 d| _        ‚ t
          $ r t          | ¦  «        ‚w xY w|                      |¦  «         | j         D ]4}|                     | j         	                    |j
        ¦  «        ¦  «         Œ5d S )NT)rM  rÀ   rÌ   rL  rR  r  r   ro   rº   rc   rn   )r   Únextdatar=   s      r   r\  zCopyManager._service_producerü  sÉ   € à	Œð å	ÐðÝ�4”=Ñ!Ô!€8€8øÝ	ð 	ð 	ð 	à#€4ÔØÝ	ð ð ð Ý	�tÑ	Ô	Ððøøøð ×Ò�8ÑÔÐð Œ>ð .ð .€aØ‡8‚8ˆDÔ× Ò  ¤Ñ,Ô,Ñ-Ô-Ð-Ð-ð.ð .s	   �% ¥+Ac                 óâ   — i }| j         D ]3}	 |                     ¦   «          Œ# t          $ r}|||<   Y d }~Œ,d }~ww xY w|r/|D ]}| j                              |¦  «         Œt	          | |¦  «        ‚d S r   )rM  r¸   r  Údiscardr&   )r   r(   r=   r_  s       r   Ú_service_receiverszCopyManager._service_receivers  s¨   € Ø€&ØŒ>ð ð €aðØ‡J‚J�L„L€L€LøÝ
ð ð ð Ø€Fˆ1�I€I€I€I€I€Iøøøøðøøøàð %àð ð €qØ„N×Ò˜1ÑÔÐÐÝ	�t˜VÑ	$Ô	$Ð$ð	%ð %s   �"¢
;¬6¶;c                 ó´   — | 5  	 	 |                       ¦   «          |                      ¦   «          Œ)# t          $ r Y nw xY w	 d d d ¦  «         d S # 1 swxY w Y   d S r   )r\  rf  rÀ   r!   s    r   ÚrunzCopyManager.run   sÄ   € Øð 	ð 	ð	ðØ	×ÒÑÔÐØ	×ÒÑÔÐðøõ ð 	ð 	ð 	à€Dð	øøøàð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	s'   ƒA…*/¯
<¹A»<¼AÁAÁAc                 ó   — | S r   r   r!   s    r   Ú__iter__zCopyManager.__iter__*  r(  r   c                 ó   — | j         j        }| j         j        }|                      ¦   «          | j        d         | j         j        |z
  z   | j        d         | j         j        |z
  z   f| _        |                      ¦   «          | j        }d| _        |S )Nr   r   rW  )rL  rª   r©   r\  rX  rf  )r   r¦   r@   Úcurrent_statss       r   r±   zCopyManager.__next__-  s‹   € ØŒ]Ô)€(Ø
Œ-Ô
#€%à×ÒÑÔÐð „;ˆq„>�T”]Ô1°HÑ<Ñ=Ø„;ˆq„>�T”]Ô.°Ñ6Ñ7ð€$„+ð ×ÒÑÔÐà”+€-Ø€$„+Ø	Ðr   N)r   r   r   r$   r    rÁ   r“   r  r’   r   r˜   rŸ   ra  r\  rf  rh  rj  r±   r   r   r   rJ  rJ  ‘  sß   € € € € € ðð ð
 €Ø(€ð%ð %ð %ð ðEð Eñ „(ðEð
	ð 	ð 	ðð ð ð1ð 1ð 1ðfð ð ð.ð .ð .ð*%ð %ð %ð	ð 	ð 	ðð ð ðð ð ð ð r   rJ  c                 ó¢   — t          t          | ¦  «        gd„ |D ¦   «         ¢R Ž }|                     ¦   «          |j        j        |j        j        fS )z±
	Perform a COPY operation using the given statements::

		>>> import copyman
		>>> copyman.transfer(src.prepare("COPY table TO STDOUT"), dst.prepare("COPY table FROM STDIN"))
	c                 óZ   — g | ](}t          |t          ¦  «        r|nt          |¦  «        ‘Œ)S r   )r†   rµ   r+  r;   s     r   r>   ztransfer.<locals>.<listcomp>F  s4   € ÐNÐNÐN¸q��A•xÑ	 Ô	 Ð:€A€AÕ&7¸Ñ&:Ô&:ÐNÐNÐNr   )rJ  ró   rh  rL  rª   r©   )rL  rM  Úcms      r   Útransferrp  =  s]   € õ Ý�HÑÔðàNÐNÀIÐNÑNÔNðð ð €ð ‡‚�„€Ø	ŒÔ	# R¤[Ô%<Ð=Ð=r   )5r$   rY  Úabcr   r   Úcollectionsr   Úpython.elementr   r   Úpython.structlibr	   r
   Úprotocol.bufferr   Úprotocol.element3r   r   r   r   Úprotocol.xact3r  rñ   r  r   r   r&   r-   rð   rÎ   rÂ   Úobjectr6   rL   rN   rP   rR   rf   r`   rq   r‹   r¢   rµ   r¼   rÄ   rÐ   ró   r  r"  r+  rC  rJ  rp  r   r   r   ú<module>ry     s	  ððð ð €
€
€
Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø  Ð  Ð  Ð  Ð  Ð  Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ð 6Ø .Ð .Ð .Ð .Ð .Ð .Ø IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ 4Ð 4Ð 4Ð 4Ð 4Ð 4ð  Ð ðð ð ð ð ˆIñ ô ð ð
%ð 
%ð 
%ð 
%ð 
%�Eñ 
%ô 
%ð 
%ð8ð 8ð 8ð 8ð 8�Eñ 8ô 8ð 8ð('ð 'ð 'ð 'ð 'ˆyñ 'ô 'ð 'ð6 €ð €à€ð,ð ,ð ,ð ,ð ,�Fñ ,ô ,ð ,ðð ð ðð ð ðð ð ðð ð ð �Ð! Mà�=Ð!Ð$8Ð$8à�ÐÐ"3Ð"3Ø�Ð!Ð$5Ð$5Ø�ÐÐ"4Ð"4Ø�=Ð!Ð$6Ð$6à�ÐÐ":Ð":Ø�?Ð#Ð&>Ð&>Ø�ÐÐ":Ð":ðÐ ð$.ð .ð .ð .ð .�fñ .ô .ð .ð$fð fð fð fð f�ñ fô fð fðPð ð ð ð ˆgñ ô ð ð(ð ð ð ð ˆw˜ñ ô ð ð<ð ð ð ð ˆwñ ô ð ðð ð ð ð �8ñ ô ð ðð ð ð ð �xñ ô ð ð&hð hð hð hð h�xñ hô hð hðTI!ð I!ð I!ð I!ð I!Ð(ñ I!ô I!ð I!ðV
ð 
ð 
ð 
ð 
�8ñ 
ô 
ð 
ðð ð ð ð �xñ ô ð ð,FBð FBð FBð FBð FBÐ(ñ FBô FBð FBðPð ð ð ð �8ñ ô ð ð(jð jð jð jð j�'˜8ñ jô jð jðX>ð >ð >ð >ð >r   