o
    DDiq                     @  s   d 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 ddlmZmZ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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#G dd deeef Z$dS )z*
psycopg server-side cursor base objects.
    )annotations)Any)warn   )errors)pqsql)ConnectionTypeParamsPQGenQuery)Row)InterpolationTemplate)execute)
BaseCursord   c                      s   e Zd ZdZd Zd4d	d
Zefd5ddZd6 fddZ	e
d6ddZe
d7ddZe
d8ddZe
d9ddZ	d:d;d#d$Zd<d%d&Zd<d'd(Zd=d+d,Zd>d0d1Zd?d2d3Z  ZS )@ServerCursorMixinzDMixin to add ServerCursor behaviour and implementation a BaseCursor.zY_name _scrollable _withhold _described itersize _format
        _iter_rows _page_pos
    namestr
scrollablebool | Nonewithholdboolc                 C  s4   || _ || _|| _d| _t| _t| _d | _d| _	d S )NFr   )
_name_scrollable	_withhold
_describedDEFAULT_ITERSIZEitersizeTEXT_format
_iter_rows	_page_pos)selfr   r   r    r%   T/var/www/Datamplify/venv/lib/python3.10/site-packages/psycopg/_server_cursor_base.py__init__'   s   
zServerCursorMixin.__init___ServerCursorMixin__warnr   returnNonec                 C  s$   | j rd S |t|  dt d S )Nz[ was deleted while still open. Please use 'with' or '.close()' to close the cursor properly)closedobject__repr__ResourceWarning)r$   r(   r%   r%   r&   __del__3   s   zServerCursorMixin.__del__c                   s,   t   d d}|d| j d|S )Nr    )superr-   splitinsertr   join)r$   parts	__class__r%   r&   r-   =   s   
zServerCursorMixin.__repr__c                 C     | j S )zThe name of the cursor.)r   r$   r%   r%   r&   r   C   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   H   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   R   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&   	rownumberY   s   zServerCursorMixin.rownumberNqueryr   paramsParams | NonebinaryPQGen[None]c                 c  s    |  |}| jr|  E dH  d| _d| _| |E dH  | ||}| j|dd t| jj	E dH }|d j
tkrB| |d  |du rK| j| _n|rOtnt| _|  E dH  dS )z0Generator implementing `ServerCursor.execute()`.NFT)force_extended)_make_declare_statementr   
_close_genr"   _start_query_convert_query_execute_sendr   _connpgconnr=   
COMMAND_OK_raise_for_resultformatr!   BINARYr    _describe_gen)r$   rD   rE   rG   pgqresultsr%   r%   r&   _declare_genf   s    

zServerCursorMixin._declare_genc                 c  sR    | j | j| j t| j E d H }| | || _| jd| j	d d| _
d S )Nr   )rT   T)_pgconnsend_describe_portalr   encode	_encodingr   _check_results_results_select_current_resultr!   r   )r$   rX   r%   r%   r&   rV      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 {})rP   rQ   transaction_statusIDLEINTRANSr   r   r   SQLrT   Literalr   _exec_commandntuples
Identifier)r$   tsrD   rA   r%   r%   r&   rL      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   )r+   eInterfaceErrorr   rM   rV   r   rd   rT   re   rh   r   rP   rf   r!   r<   _txset_pgresult	load_rowsrg   	_make_row)r$   rj   rD   rA   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 {}rz   z	 ABSOLUTE )	
ValueErrorr   rd   rT   re   rh   r   rP   rf   )r$   rv   rx   rD   r%   r%   r&   _scroll_gen   s   

zServerCursorMixin._scroll_genc                 C  s   t dt | jg}| jd ur|t | jrdnd |t d | jr0|t d |t d t d|}t|t	rTt	t
|dd d	t
|d
d d	S t|tr_|| j}t|t jsjt |}|| S )NDECLARESCROLLz	NO SCROLLCURSORz	WITH HOLDzFOR r0   declareqrD   )r   rd   rh   r   r   appendr   r4   
isinstancer   r   bytesdecoder]   
Composable)r$   rD   r5   r   r%   r%   r&   rK      s$   



z)ServerCursorMixin._make_declare_statement)r   r   r   r   r   r   )r(   r   r)   r*   )r)   r   )r)   r   )r)   r   )r)   r:   )NN)rD   r   rE   rF   rG   r   r)   rH   )r)   rH   )rj   r:   r)   rk   )rv   rw   rx   r   r)   rH   )rD   r   r)   r   )__name__
__module____qualname____doc__r2   	__slots__r'   r   r/   r-   propertyr   r   r   rC   rY   rV   rL   ru   r}   rK   __classcell__r%   r%   r6   r&   r       s.    

	




r   N)%r   
__future__r   typingr   warningsr   r{   r   ro   r   r   abcr	   r
   r   r   rowsr   _compatr   r   
generatorsr   _cursor_baser   r   Formatr    rU   
ExecStatusrR   r>   TransactionStatusrb   rc   r   r%   r%   r%   r&   <module>   s&    