
    *Jf(              
       B   d Z ddlZddlmZmZmZ ddlmZ ddlmZ	 ddl
mZmZmZ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 ddlmZmZ ej        j        Zej        j        Zej        j        Z ej        j!        Z"ej        j#        Z$ej        j%        Z&ej'        j(        Z(ej'        j)        Z)ej'        j*        Z*ej'        j+        Z+ej'        j,        Z,ej-        Z.ej/        Z0ej1        Z2ej-        Z3ej/        Z4ej1        Z5 ej6        e7          Z8de9dee         fdZ:dedeee                  fdZ;deded         fdZ<dedeee                  fdZ=dedeee                  fdZ>dedee         deeee                           fdZ?deddfdZ@dedeeejA                          fdZBdedeeeCef                  fdZDd dededeEded         fdZFdedeeG         dee         fdZHer,ejI        ZIejJ        ZJejK        ZKejL        ZLejM        ZMejN        ZNdS e:ZIe;ZJe<ZKe=ZLe>ZMe?ZNdS )!av  
Generators implementing communication protocols with the libpq

Certain operations (connection, querying) are an interleave of libpq calls and
waiting for the socket to be ready. This module contains the code to execute
the operations, yielding a polling state whenever there is to wait. The
functions in the `waiting` module are the ones who wait more or less
cooperatively for the socket to be ready and make these generators continue.

All these generators yield pairs (fileno, `Wait`) whenever an operation would
block. The generator can be restarted sending the appropriate `Ready` state
when the file descriptor is ready.

    N)ListOptionalUnion   )pq)errors)BufferPipelineCommandPQGen	PQGenConn)PGconnPGresult)WaitReady)Deque)_psycopg)pgconn_encodingconninfo_encodingconninforeturnc              #     K   t           j                            |                                           }	 |j        t
          k    r<t          |           }t          j        dt          j	        ||           |          |
                                }|t          k    rn|t          k    r|j        t          fV  n|t          k    r|j        t           fV  n|t"          k    rNt          |           }t          j        dt          j	        ||           t          j        |                    t          j        d| t          j        |                    *d|_        |S )zF
    Generator to create a database connection without blocking.

    Tzconnection is bad: encodingpgconnzconnection failed: zunexpected poll status: r   )r   r   connect_startencodestatusBADr   eOperationalErrorerror_messageconnect_pollPOLL_OKPOLL_READINGsocketWAIT_RPOLL_WRITINGWAIT_WPOLL_FAILEDfinish_pgconnInternalErrornonblocking)r   connr   r   s       U/home/alex/cs2snipeproduction/venv/lib/python3.11/site-packages/psycopg/generators.py_connectr0   6   s     
 9""8??#4#455D;#(22H$Qb&6th&O&O&OQQ   
 ""$$W|##+v%%%%%|##+v%%%%%{""(22H$Qb&6th&O&O&OQQt,,   
 /3633AOD<Q<Q   -4 DK    r   c              #   ^   K   t          |           E d{V  t          |           E d{V }|S )aG  
    Generator sending a query and returning results without blocking.

    The query must have already been sent using `pgconn.send_query()` or
    similar. Flush the query and then return the result using nonblocking
    functions.

    Return the list of results returned by the database (whether success
    or error).
    N)_send_fetch_many)r   rvs     r/   _executer6   Z   sJ       V}}''	'	'	'	'	'	'BIr1   c              #      K   	 |                                  }|dk    rdS t          V }|t          z  r|                                  D)aZ  
    Generator to send a query to the server without blocking.

    The query must have already been sent using `pgconn.send_query()` or
    similar. Flush the query and then return the result using nonblocking
    functions.

    After this generator has finished you may want to cycle using `fetch()`
    to retrieve the results available.
    Tr   N)flushWAIT_RWREADY_Rconsume_input)r   freadys      r/   r3   r3   j   sT      	#LLNN66E7? 	#   """	#r1   c              #     K   g }	 t          |           E d{V }|snh|                    |           |j        }|t          k    s|t          k    s|t
          k    rn*|t          k    rt          |          dk    s
J |            n|S )a  
    Generator retrieving results from the database without blocking.

    The query must have already been sent to the server, so pgconn.flush() has
    already returned 0.

    Return the list of results returned by the database (whether success
    or error).
    TNr   )_fetchappendr   COPY_INCOPY_OUT	COPY_BOTHPIPELINE_SYNClen)r   resultsresr   s       r/   r4   r4      s       !G'''''' 	sW( 2 2f	6I6I ]"" w<<1$$$g$$$!$ Nr1   c              #      K   |                                  r=t          V  	 |                                  |                                  sn
t          V  3t          |            |                                 S )z
    Generator retrieving a single result from the database without blocking.

    The query must have already been sent to the server, so pgconn.flush() has
    already returned 0.

    Return a result from the database (whether success or error).
    )is_busyr'   r;   _consume_notifies
get_resultr   s    r/   r?   r?      s       ~~ 	  """>>## LLL		 fr1   commandsc              #     K   g }	 t           V }|t          z  r|                                  t          |            g }|                                 s|                                 }||sn|                    |           g }nw|j        }|t          k    r|rJ |                    |g           nJ|t          k    s|t          k    s|t          k    rt          j        d          |                    |           |                                 |t          z  r3|                                  |sn |                                             G|S )zGenerator to send queries from a connection in pipeline mode while also
    receiving results.

    Return a list results, including single PIPELINE_SYNC elements.
    TNz$COPY cannot be used in pipeline mode)r9   r:   r;   rJ   rI   rK   r@   r   rD   rA   rB   rC   r    NotSupportedErrorREADY_Wr8   popleft)r   rL   rF   r=   rG   rr   s          r/   _pipeline_communicaterR      sv      G$!7? 	&  """f%%%"$Cnn&& &%%''9 NN3'''CCXF..#&s++++7**f.@.@FiDWDW  1B   

1- nn&& &0 7? 	!LLNNN H   I$!L Nr1   c                 n    	 |                                  }|sd S | j        r|                     |           5N)notifiesnotify_handler)r   ns     r/   rJ   rJ      sG    %OO 	E  	%!!!$$$%r1   c              #      K   t           V  |                                  g }	 |                                 }|r|                    |           nn.|S rT   )r'   r;   rU   r@   )r   nsrW   s      r/   rU   rU      sb      
LLL
	BOO 	IIaLLLL Ir1   c              #     K   	 |                      d          \  }}|dk    rnt          V  |                                  =|dk    r|S t          |           E d {V }t	          |          dk    rt          j        d          |d         }|j        t          k    r%t          |           }t          j
        ||          |S )NTr   r   z)you cannot mix COPY with other operationsr   )get_copy_datar'   r;   r4   rE   r    ProgrammingErrorr   
COMMAND_OKr   error_from_result)r   nbytesdatarF   resultr   s         r/   	copy_fromrb     s      ++A..Q;;  zz %V,,,,,,,,G
7||a !LMMMQZF}
"""6**!&8<<<<Mr1   Tbufferr8   c              #      K   |                      |          dk    r"t          V  |                      |          dk    "|r,	 	 t          V }|rn|                                 }|dk    rd S +d S )Nr   )put_copy_datar)   r8   )r   rc   r8   r=   r<   s        r/   copy_torf     s       

v
&
&!
+
+ 

v
&
&!
+
+  		$  AAvv		 	r1   errorc              #   d  K   |                      |          dk    r"t          V  |                      |          dk    "	 t          V  |                                 }|dk    rn%t          |           E d {V \  }|j        t
          k    r%t          |           }t          j        ||          |S )Nr   Tr   )	put_copy_endr)   r8   r4   r   r]   r   r    r^   )r   rg   r<   ra   r   s        r/   copy_endrj   7  s      


e
$
$
)
) 

e
$
$
)
)LLNN66	 'v........IV}
"""6**!&8<<<<Mr1   )T)O__doc__loggingtypingr   r   r    r   r   r    abcr	   r
   r   r   pq.abcr   r   waitingr   r   _compatr   _cmoduler   
_encodingsr   r   
ConnStatusOKr   PollingStatusr$   READINGr%   WRITINGr(   FAILEDr*   
ExecStatusr]   rB   rA   rC   rD   Rr'   Wr)   RWr9   r:   rO   READY_RW	getLogger__name__loggerstrr0   r6   r3   r4   r?   rR   rJ   PGnotifyrU   
memoryviewrb   boolrf   bytesrj   connectexecutesend
fetch_manyfetchpipeline_communicate r1   r/   <module>r      s   "  ( ( ( ( ( ( ( ( ( (             : : : : : : : : : : : : $ $ $ $ $ $ $ $                             : : : : : : : :]m


''%]%
=!
-
M#	+		
'
'
'8		8	$	$!s !y0 ! ! ! !HV d8n 5     #& #U4[ # # # #. 5h#8    @6 eHX$67    ,00#O40
4X 0 0 0 0f%f % % % % %V d2;&7 8    f uZ-A'B!C    6 F F 4 5;    2V HUO h    ,  1GG=D$JNE#8 GGDJE0r1   