o
    6	f9                     @   sl  d Z ddlmZmZmZmZm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 ddlmZ dd	lmZmZmZmZ dd
lmZ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" erpddl#m$Z$ ddl%m&Z& dZ'ej(j)Z)ej(j*Z*ej+j,Z,ej+j-Z-ej.j/Z/ej.j0Z0G dd deeef Z1G dd de1def ee Z2G dd de1def e"e Z3dS )z%
psycopg server-side cursor objects.
    )AnyAsyncIteratorListIterableIterator)OptionalTYPE_CHECKINGoverload)warn   )pq)sql)errors)ConnectionTypeQueryParamsPQGen)Row
RowFactoryAsyncRowFactory)
BaseCursorCursor)Self)execute)AsyncCursor)
Connection)AsyncConnectiond   c                
       s4  e Zd ZdZd Zdedee defddZ	def fd	d
Z
edefddZedee fddZedefddZedee fddZ		d&dedee dee ded fddZded fddZded fddZdee deee  fddZd ed!eded fd"d#Zdedejfd$d%Z  ZS )'ServerCursorMixinzDMixin to add ServerCursor behaviour and implementation a BaseCursor.z7_name _scrollable _withhold _described itersize _formatname
scrollablewithholdc                 C   s(   || _ || _|| _d| _t| _t| _d S )NF)_name_scrollable	_withhold
_describedDEFAULT_ITERSIZEitersizeTEXT_format)selfr   r    r!    r+   N/home/ertert/spirit/venv/lib/python3.10/site-packages/psycopg/server_cursor.py__init__*   s   
zServerCursorMixin.__init__returnc                    s,   t   d d}|d| j d|S )Nr    )super__repr__splitinsertr"   join)r*   parts	__class__r+   r,   r1   7   s   
zServerCursorMixin.__repr__c                 C      | j S )zThe name of the cursor.)r"   r*   r+   r+   r,   r   =   s   zServerCursorMixin.namec                 C   r8   )z
        Whether the cursor is scrollable or not.

        If `!None` leave the choice to the server. Use `!True` if you want to
        use `scroll()` on the cursor.
        )r#   r9   r+   r+   r,   r    B   s   zServerCursorMixin.scrollablec                 C   r8   )zY
        If the cursor can be used after the creating transaction has committed.
        )r$   r9   r+   r+   r,   r!   L   s   zServerCursorMixin.withholdc                 C   s,   | j }|o|jtkp|jdk}|r| jS dS )zoIndex of the next row to fetch in the current result.

        `!None` if there is no result to fetch.
            N)pgresultstatus	TUPLES_OKcommand_status_pos)r*   restuplesr+   r+   r,   	rownumberS   s   zServerCursorMixin.rownumberNqueryparamsbinaryc                 c   s    |  |}| jr|  E dH  d| _| |E dH  | ||}| j|dd t| jjE dH }|d j	t
kr?| |d  |du rH| j| _n|rLtnt| _|  E dH  dS )z0Generator implementing `ServerCursor.execute()`.NFT)force_extended)_make_declare_statementr%   
_close_gen_start_query_convert_query_execute_sendr   _connpgconnr<   
COMMAND_OK_raise_for_resultformatr)   BINARYr(   _describe_gen)r*   rC   rD   rE   pgqresultsr+   r+   r,   _declare_gen`   s   

zServerCursorMixin._declare_genc                 c   sR    | j | j| j t| j E d H }| | || _| jd| j	d d| _
d S )Nr   )rQ   T)_pgconnsend_describe_portalr"   encode	_encodingr   _check_results_results_select_current_resultr)   r%   )r*   rU   r+   r+   r,   rS      s   

zServerCursorMixin._describe_genc                 c   s    | j jj}|tkr|tkrd S | js|tkrd S | js>td	t
| j}| j |E d H }|d us7J |jdkr>d S td	t| j}| j |E d H  d S )Nz3SELECT 1 FROM pg_catalog.pg_cursors WHERE name = {}r   zCLOSE {})rM   rN   transaction_statusIDLEINTRANSr$   r%   r   SQLrQ   Literalr"   _exec_commandntuples
Identifier)r*   tsrC   r@   r+   r+   r,   rI      s$   

zServerCursorMixin._close_gennumc                 c   s    | j r	td| js|  E d H  |  E d H  td|d u r(tdnt	|t
| j}| jj|| jdE d H }|d usEJ || _| jj|dd | jd|j| jS )Nzthe cursor is closedzFETCH FORWARD {} FROM {}ALL)result_formatF)set_loadersr   )closedeInterfaceErrorr%   rJ   rS   r   ra   rQ   rb   re   r"   rM   rc   r)   r;   _txset_pgresult	load_rowsrd   	_make_row)r*   rg   rC   r@   r+   r+   r,   
_fetch_gen   s   


zServerCursorMixin._fetch_genvaluemodec                 c   sd    |dvrt d| dtdt|dkrdndt|t| j}| j|E d H  d S )N)relativeabsolutez
bad mode: z'. It should be 'relative' or 'absolute'zMOVE{} {} FROM {}rv   z	 ABSOLUTE )	
ValueErrorr   ra   rQ   rb   re   r"   rM   rc   )r*   rs   rt   rC   r+   r+   r,   _scroll_gen   s   

zServerCursorMixin._scroll_genc                 C   s   t |tr|| j}t |tjst|}tdt| jg}| j	d ur3|
t| j	r/dnd |
td | jrF|
td |
td |
| td|S )NDECLARESCROLLz	NO SCROLLCURSORz	WITH HOLDFORr/   )
isinstancebytesdecoderZ   r   
Composablera   re   r"   r#   appendr$   r4   )r*   rC   r5   r+   r+   r,   rH      s   




z)ServerCursorMixin._make_declare_statement)NN)__name__
__module____qualname____doc__r2   	__slots__strr   boolr-   r1   propertyr   r    r!   intrB   r   r   r   rV   rS   rI   r   r   rr   ry   r   ComposedrH   __classcell__r+   r+   r6   r,   r   %   sF    
	

r   c                       z  e Zd ZdZdZedddddded	ee d
efddZeddddddede	e
 d	ee d
ef
ddZdddddddedee	e
  d	ee d
ef
ddZd3ddZd3 fddZ	d4dddedee dee dedef
ddZddded ee d!eddfd"d#Zdee
 fd$d%Zd5d'edee
 fd(d)Zdee
 fd*d+Zdee
 fd,d-Zd6d/ed0eddfd1d2Z  ZS )7ServerCursorpsycopgr+   NFr    r!   
connectionzConnection[Row]r   r    r!   c                C      d S Nr+   r*   r   r   r    r!   r+   r+   r,   r-         zServerCursor.__init__Connection[Any]row_factoryc                C   r   r   r+   r*   r   r   r   r    r!   r+   r+   r,   r-         	r   r    r!   c                C   *   t j| ||p|jd t| ||| d S N)r   )r   r-   r   r   r   r+   r+   r,   r-         	r.   c                 C       | j std|  dt d S d S Nzthe server-side cursor z[ was deleted while still open. Please use 'with' or '.close()' to close the cursor properlyrk   r
   ResourceWarningr9   r+   r+   r,   __del__      
zServerCursor.__del__c                    sh   | j j& | jr	 W d   dS | j js| j |   t   W d   dS 1 s-w   Y  dS )zI
        Close the current cursor and free associated resources.
        NrM   lockrk   waitrI   r0   closer9   r6   r+   r,   r     s   
"zServerCursor.closerE   rC   rD   rE   kwargsc             
   K   s   |rt dt|d  | jjrtdz$| jj | j| 	||| W d   W | S 1 s3w   Y  W | S  tj
yL } z|dd}~ww )zC
        Open a cursor to execute a query to the database.
        keyword not supported: r   2server-side cursors not supported in pipeline modeN	TypeErrorlistrW   pipeline_statusrl   NotSupportedErrorrM   r   r   rV   _NO_TRACEBACKwith_tracebackr*   rC   rD   rE   r   exr+   r+   r,   r     s"   

zServerCursor.executeT	returning
params_seqr   c                C   s
   t d)z/Method not implemented for server-side cursors.0executemany not supported on server-side cursorsrl   r   r*   rC   r   r   r+   r+   r,   executemany(  s   
zServerCursor.executemanyc                 C   sX   | j j | j | d}W d    n1 sw   Y  |r*|  jd7  _|d S d S Nr   r   rM   r   r   rr   r?   r*   recsr+   r+   r,   fetchone2  s   
zServerCursor.fetchoner   sizec                 C   sZ   |s| j }| jj | j| |}W d    n1 sw   Y  |  jt|7  _|S r   	arraysizerM   r   r   rr   r?   lenr*   r   r   r+   r+   r,   	fetchmany;  s   
zServerCursor.fetchmanyc                 C   sP   | j j | j | d }W d    n1 sw   Y  |  jt|7  _|S r   rM   r   r   rr   r?   r   r   r+   r+   r,   fetchallC  s
   
zServerCursor.fetchallc                 c   sr    	 | j j | j | | j}W d    n1 sw   Y  |D ]}|  jd7  _|V  q"t|| jk r8d S qNTr   rM   r   r   rr   r'   r?   r   r*   r   recr+   r+   r,   __iter__I  s   
zServerCursor.__iter__ru   rs   rt   c                 C   s`   | j j | j | || W d    n1 sw   Y  |dkr+|  j|7  _d S || _d S )Nru   )rM   r   r   ry   r?   r*   rs   rt   r+   r+   r,   scrollS  s   

zServerCursor.scrollr.   Nr   r   ru   )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   r   r   r   r   r+   r+   r6   r,   r      s    	





	 
r   r   c                       r   )7AsyncServerCursorr   r+   NFr   r   zAsyncConnection[Row]r   r    r!   c                C   r   r   r+   r   r+   r+   r,   r-   c  r   zAsyncServerCursor.__init__AsyncConnection[Any]r   c                C   r   r   r+   r   r+   r+   r,   r-   m  r   r   c                C   r   r   )r   r-   r   r   r   r+   r+   r,   r-   x  r   r.   c                 C   r   r   r   r9   r+   r+   r,   r     r   zAsyncServerCursor.__del__c              	      s   | j j4 I d H 2 | jr	 W d   I d H  d S | j js(| j |  I d H  t  I d H  W d   I d H  d S 1 I d H sAw   Y  d S r   r   r9   r6   r+   r,   r     s   .zAsyncServerCursor.closer   rC   rD   rE   r   c             
      s   |rt dt|d  | jjrtdz1| jj4 I d H  | j| 	|||I d H  W d   I d H  W | S 1 I d H sAw   Y  W | S  tj
yZ } z|d d }~ww )Nr   r   r   r   r   r+   r+   r,   r     s$   
zAsyncServerCursor.executeTr   r   r   c                   s   t d)Nr   r   r   r+   r+   r,   r     s   
zAsyncServerCursor.executemanyc              	      st   | j j4 I d H  | j | dI d H }W d   I d H  n1 I d H s&w   Y  |r8|  jd7  _|d S d S r   r   r   r+   r+   r,   r     s   (zAsyncServerCursor.fetchoner   r   c              	      sv   |s| j }| jj4 I d H  | j| |I d H }W d   I d H  n1 I d H s+w   Y  |  jt|7  _|S r   r   r   r+   r+   r,   r     s   (zAsyncServerCursor.fetchmanyc              	      sl   | j j4 I d H  | j | d I d H }W d   I d H  n1 I d H s&w   Y  |  jt|7  _|S r   r   r   r+   r+   r,   r     s   (zAsyncServerCursor.fetchallc              	   C  s   	 | j j4 I d H  | j | | jI d H }W d   I d H  n1 I d H s(w   Y  |D ]}|  jd7  _|V  q/t|| jk rEd S qr   r   r   r+   r+   r,   	__aiter__  s   (zAsyncServerCursor.__aiter__ru   rs   rt   c              	      s^   | j j4 I d H  | j | ||I d H  W d   I d H  d S 1 I d H s(w   Y  d S r   )rM   r   r   ry   r   r+   r+   r,   r     s   .zAsyncServerCursor.scrollr   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   r   r   r   r   r   r   r   r+   r+   r6   r,   r   ]  s    	




		 
r   r   N)4r   typingr   r   r   r   r   r   r   r	   warningsr
   rw   r   r   r   rl   abcr   r   r   r   rowsr   r   r   cursorr   r   _compatr   
generatorsr   cursor_asyncr   r   r   connection_asyncr   r&   Formatr(   rR   
ExecStatusrO   r=   TransactionStatusr_   r`   r   r   r   r+   r+   r+   r,   <module>   s<     0 

