o
    "4g9                     @  sp  d Z ddlmZ ddlmZmZmZ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 ddlmZ ddlmZ ddl m!Z! ddl"m#Z# errd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/j0Z0ej/j1Z1G dd de!eef Z2G dd de2def ee Z3G dd de2def e#e Z4dS )z%
psycopg server-side cursor objects.
    )annotations)AnyAsyncIteratorIterableIteratorTYPE_CHECKINGoverload)warn   )pq)sql)errors)ConnectionTypeQueryParamsPQGen)Row
RowFactoryAsyncRowFactory)Cursor)Self)execute)
BaseCursor)AsyncCursor)
Connection)AsyncConnectiond   c                      s   e Zd ZdZd Zd0d	d
Zd1 fddZed1ddZ	ed2ddZ
ed3ddZed4ddZ		d5d6ddZd7d d!Zd7d"d#Zd8d&d'Zd9d+d,Zd:d.d/Z  ZS );ServerCursorMixinzDMixin to add ServerCursor behaviour and implementation a BaseCursor.z7_name _scrollable _withhold _described itersize _formatnamestr
scrollablebool | Nonewithholdboolc                 C  s(   || _ || _|| _d| _t| _t| _d S )NF)_name_scrollable	_withhold
_describedDEFAULT_ITERSIZEitersizeTEXT_format)selfr   r    r"    r-   ^/var/www/html/authentication-server/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.   r3   9   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  r:   )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%   r;   r-   r-   r.   r    D   s   zServerCursorMixin.scrollablec                 C  r:   )zY
        If the cursor can be used after the creating transaction has committed.
        )r&   r;   r-   r-   r.   r"   N   s   zServerCursorMixin.withhold
int | Nonec                 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.   	rownumberU   s   zServerCursorMixin.rownumberNqueryr   paramsParams | NonebinaryPQGen[None]c                 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,   rF   rG   rI   pgqresultsr-   r-   r.   _declare_genb   s   

zServerCursorMixin._declare_genc                 c  sR    | j | j| j t| j E d H }| | || _| jd| j	d d| _
d S )Nr   )rV   T)_pgconnsend_describe_portalr$   encode	_encodingr   _check_results_results_select_current_resultr+   r'   )r,   rZ   r-   r-   r.   rX      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 {})rR   rS   transaction_statusIDLEINTRANSr&   r'   r   SQLrV   Literalr$   _exec_commandntuples
Identifier)r,   tsrF   rC   r-   r-   r.   rN      s$   

zServerCursorMixin._close_gennumPQGen[list[Row]]c                 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'   rO   rX   r   rf   rV   rg   rj   r$   rR   rh   r+   r>   _txset_pgresult	load_rowsri   	_make_row)r,   rl   rF   rC   r-   r-   r.   
_fetch_gen   s   


zServerCursorMixin._fetch_genvalueint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 {}r}   z	 ABSOLUTE )	
ValueErrorr   rf   rV   rg   rj   r$   rR   rh   )r,   ry   r{   rF   r-   r-   r.   _scroll_gen   s   

zServerCursorMixin._scroll_gensql.Composedc                 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FORr1   )
isinstancebytesdecoder_   r   
Composablerf   rj   r$   r%   appendr&   r6   )r,   rF   r7   r-   r-   r.   rM      s   




z)ServerCursorMixin._make_declare_statement)r   r   r    r!   r"   r#   )r0   r   )r0   r!   )r0   r#   )r0   r<   )NN)rF   r   rG   rH   rI   r!   r0   rJ   )r0   rJ   )rl   r<   r0   rm   )ry   rz   r{   r   r0   rJ   )rF   r   r0   r   )__name__
__module____qualname____doc__r4   	__slots__r/   r3   propertyr   r    r"   rE   r[   rX   rN   rx   r   rM   __classcell__r-   r-   r8   r.   r   '   s*    
	




r   c                         e Zd ZdZdZeddddBddZeddddCddZdddddDddZdEddZdE fddZ	dFdddGd&d'Zd(d)dHd-d.Z	dId0d1Z
dJdKd6d7ZdLd8d9ZdMd;d<ZdNdOd@dAZ  ZS )PServerCursorpsycopgr-   NFr    r"   
connectionConnection[Row]r   r   r    r!   r"   r#   c                C     d S Nr-   r,   r   r   r    r"   r-   r-   r.   r/         zServerCursor.__init__Connection[Any]row_factoryRowFactory[Row]c                C  r   r   r-   r,   r   r   r   r    r"   r-   r-   r.   r/         	r   r    r"   RowFactory[Row] | Nonec                C  *   t j| ||p|jd t| ||| d S N)r   )r   r/   r   r   r   r-   r-   r.   r/         	r0   Nonec                 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rq   r	   ResourceWarningr;   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rR   lockrq   waitrN   r2   closer;   r8   r-   r.   r     s   
"zServerCursor.closerI   rF   r   rG   rH   rI   kwargsr   r   c             
   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listr\   pipeline_statusrr   NotSupportedErrorrR   r   r   r[   _NO_TRACEBACKwith_tracebackr,   rF   rG   rI   r   exr-   r-   r.   r     s"   

zServerCursor.executeT	returning
params_seqIterable[Params]r   c                C  s
   t d)z/Method not implemented for server-side cursors.0executemany not supported on server-side cursorsrr   r   r,   rF   r   r   r-   r-   r.   executemany*  s   
zServerCursor.executemany
Row | Nonec                 C  sX   | j j | j | d}W d    n1 sw   Y  |r*|  jd7  _|d S d S Nr
   r   rR   r   r   rx   rB   r,   recsr-   r-   r.   fetchone4  s   
zServerCursor.fetchoner   sizerz   	list[Row]c                 C  sZ   |s| j }| jj | j| |}W d    n1 sw   Y  |  jt|7  _|S r   	arraysizerR   r   r   rx   rB   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   rR   r   r   rx   rB   r   r   r-   r-   r.   fetchallE  s
   
zServerCursor.fetchallIterator[Row]c                 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
   rR   r   r   rx   r)   rB   r   r,   r   recr-   r-   r.   __iter__K  s   
zServerCursor.__iter__r|   ry   r{   c                 C  s`   | j j | j | || W d    n1 sw   Y  |dkr+|  j|7  _d S || _d S )Nr|   )rR   r   r   r   rB   r,   ry   r{   r-   r-   r.   scrollU  s   

zServerCursor.scroll)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#   r0   r   r   
rF   r   rG   rH   rI   r!   r   r   r0   r   rF   r   r   r   r   r#   r0   r   r0   r   r   r   rz   r0   r   r0   r   )r0   r   r|   ry   rz   r{   r   r0   r   )r   r   r   r   r   r/   r   r   r   r   r   r   r   r   r   r   r-   r-   r8   r.   r      s8    	


	


r   r   c                      r   )PAsyncServerCursorr   r-   NFr   r   AsyncConnection[Row]r   r   r    r!   r"   r#   c                C  r   r   r-   r   r-   r-   r.   r/   e  r   zAsyncServerCursor.__init__AsyncConnection[Any]r   AsyncRowFactory[Row]c                C  r   r   r-   r   r-   r-   r.   r/   o  r   r   AsyncRowFactory[Row] | Nonec                C  r   r   )r   r/   r   r   r   r-   r-   r.   r/   z  r   r0   r   c                 C  r   r   r   r;   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   r;   r8   r-   r.   r     s   .zAsyncServerCursor.closer   rF   r   rG   rH   rI   r   r   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   r   c                  s   t d)Nr   r   r   r-   r-   r.   r     s   
zAsyncServerCursor.executemanyr   c              	     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   rz   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.fetchallAsyncIterator[Row]c              	   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__r|   ry   r{   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   )rR   r   r   r   r   r-   r-   r.   r     s   .zAsyncServerCursor.scroll)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   r   r   )r0   r   r   r   )r   r   r   r   r   r/   r   r   r   r   r   r   r   r   r   r   r-   r-   r8   r.   r   _  s8    	

		


r   r   N)5r   
__future__r   typingr   r   r   r   r   r   warningsr	   r~   r   r   r   rr   abcr   r   r   r   rowsr   r   r   cursorr   _compatr   
generatorsr   _cursor_baser   cursor_asyncr   r   r   connection_asyncr   r(   Formatr*   rW   
ExecStatusrT   r@   TransactionStatusrd   re   r   r   r   r-   r-   r-   r.   <module>   s>      0 

