U
    ڲg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rd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ddddddZdd	 fd
dZedd	ddZ	edd	ddZ
edd	ddZedd	ddZd,dddddddZdd	ddZdd	ddZdd d!d"d#Zd$ddd%d&d'Zdd(d)d*d+Z  ZS )-ServerCursorMixinzDMixin to add ServerCursor behaviour and implementation a BaseCursor.z7_name _scrollable _withhold _described itersize _formatstrbool | Nonebool)name
scrollablewithholdc                 C  s(   || _ || _|| _d| _t| _t| _d S )NF)_name_scrollable	_withhold
_describedDEFAULT_ITERSIZEitersizeTEXT_format)selfr!   r"   r#    r-   9/tmp/pip-unpacked-wheel-b_ea6rx_/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.   r4   9   s    zServerCursorMixin.__repr__c                 C  s   | j S )zThe name of the cursor.)r$   r,   r-   r-   r.   r!   ?   s    zServerCursorMixin.namec                 C  s   | j S )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  s   | j S )zY
        If the cursor can be used after the creating transaction has committed.
        )r&   r;   r-   r-   r.   r#   N   s    zServerCursorMixin.withholdz
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_OKZcommand_status_pos)r,   resZtuplesr-   r-   r.   	rownumberU   s    zServerCursorMixin.rownumberNr   Params | NonezPQGen[None])queryparamsbinaryr1   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kr| j| _n|rtnt| _|  E dH  dS )z0Generator implementing `ServerCursor.execute()`.NFT)Zforce_extended)_make_declare_statementr'   
_close_gen_start_queryZ_convert_queryZ_execute_sendr   _connpgconnr>   
COMMAND_OKZ_raise_for_resultformatr+   BINARYr*   _describe_gen)r,   rD   rE   rF   Zpgqresultsr-   r-   r.   _declare_genb   s    

zServerCursorMixin._declare_genc                 c  sP   | j | j| j t| j E d H }| | || _| jd| j	d d| _
d S )Nr   )rN   T)_pgconnZsend_describe_portalr$   encode	_encodingr   Z_check_resultsZ_resultsZ_select_current_resultr+   r'   )r,   rQ   r-   r-   r.   rP      s    
zServerCursorMixin._describe_genc                 c  s   | j jj}|tkr|tkrd S | js0|tkr0d S | jsztd	t
| j}| j |E d H }|d k	slt|jdkrzd S td	t| j}| j |E d H  d S )Nz3SELECT 1 FROM pg_catalog.pg_cursors WHERE name = {}r   zCLOSE {})rK   rL   Ztransaction_statusIDLEINTRANSr&   r'   r   SQLrN   Literalr$   _exec_commandAssertionErrorntuples
Identifier)r,   tsrD   rA   r-   r-   r.   rI      s"    


zServerCursorMixin._close_genzPQGen[list[Row]])numr1   c                 c  s   | j rtd| js2|  E d H  |  E d H  td|d krNtdnt	|t
| j}| jj|| jdE d H }|d k	st|| _| jj|dd | jd|j| jS )Nzthe cursor is closedzFETCH FORWARD {} FROM {}ALL)Zresult_formatF)Zset_loadersr   )closedeZInterfaceErrorr'   rJ   rP   r   rX   rN   rY   r]   r$   rK   rZ   r+   r[   r=   Z_txZset_pgresultZ	load_rowsr\   Z	_make_row)r,   r_   rD   rA   r-   r-   r.   
_fetch_gen   s    


zServerCursorMixin._fetch_genintvaluemoder1   c                 c  sb   |dkrt d| dtdt|dkr2d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 {}ri   z	 ABSOLUTE )	
ValueErrorr   rX   rN   rY   r]   r$   rK   rZ   )r,   rf   rg   rD   r-   r-   r.   _scroll_gen   s    

zServerCursorMixin._scroll_genzsql.Composed)rD   r1   c                 C  s   t |tr|| j}t |tjs,t|}tdt| jg}| j	d k	rf|
t| j	r^dnd |
td | jr|
td |
td |
| td|S )NZDECLAREZSCROLLz	NO SCROLLZCURSORz	WITH HOLDZFORr2   )
isinstancebytesdecoderU   r   Z
ComposablerX   r]   r$   r%   appendr&   r7   )r,   rD   r8   r-   r-   r.   rH      s    




z)ServerCursorMixin._make_declare_statement)NN)__name__
__module____qualname____doc__r5   	__slots__r/   r4   propertyr!   r"   r#   rB   rR   rP   rI   rc   rl   rH   __classcell__r-   r-   r9   r.   r   '   s(   	  
r   c                      s"  e Zd ZdZdZeddddddd	d
ddZedddddddd	dddZddddddddd	dddZddddZdd fddZd:ddddddddd d!Zd"d#dd$d	dd%d&d'Z	d(dd)d*Z
d;d,d-d.d/d0Zd-dd1d2Zd3dd4d5Zd<d,ddd7d8d9Z  ZS )=ServerCursorpsycopgr-   NFr"   r#   zConnection[Row]r   r   r    
connectionr!   r"   r#   c                C  s   d S Nr-   r,   r|   r!   r"   r#   r-   r-   r.   r/      s    zServerCursor.__init__Connection[Any]zRowFactory[Row]r|   r!   row_factoryr"   r#   c                C  s   d S r}   r-   r,   r|   r!   r   r"   r#   r-   r-   r.   r/      s    	r   r"   r#   zRowFactory[Row] | Nonec                C  s*   t j| ||p|jd t| ||| d S N)r   )r   r/   r   r   r   r-   r-   r.   r/      s    	  Noner0   c                 C  s   | j std|  dt d S Nzthe server-side cursor z[ was deleted while still open. Please use 'with' or '.close()' to close the cursor properlyra   r	   ResourceWarningr;   r-   r-   r.   __del__   s
    
zServerCursor.__del__c              	     sN   | j j< | jrW 5 Q R  dS | j js6| j |   t   W 5 Q R X dS )zI
        Close the current cursor and free associated resources.
        NrK   lockra   waitrI   r3   closer;   r9   r-   r.   r     s    
zServerCursor.closerF   r   rC   r   r   rD   rE   rF   kwargsr1   c             
   K  s   |rt dt|d  | jjr,tdz.| jj | j| 	||| W 5 Q R X W n. tj
k
r } z|dW 5 d}~X Y nX | S )zC
        Open a cursor to execute a query to the database.
        keyword not supported: r   2server-side cursors not supported in pipeline modeN	TypeErrorlistrS   Zpipeline_statusrb   NotSupportedErrorrK   r   r   rR   Z_NO_TRACEBACKwith_tracebackr,   rD   rE   rF   r   exr-   r-   r.   r     s    
$zServerCursor.executeT	returningIterable[Params]rD   
params_seqr   r1   c                C  s   t ddS )z/Method not implemented for server-side cursors.0executemany not supported on server-side cursorsNrb   r   r,   rD   r   r   r-   r-   r.   executemany*  s    zServerCursor.executemany
Row | Nonec              	   C  sH   | j j | j | d}W 5 Q R X |r@|  jd7  _|d S d S d S Nr
   r   rK   r   r   rc   r@   r,   recsr-   r-   r.   fetchone4  s    
zServerCursor.fetchoner   rd   	list[Row]sizer1   c              	   C  sF   |s
| j }| jj | j| |}W 5 Q R X |  jt|7  _|S r}   Z	arraysizerK   r   r   rc   r@   lenr,   r   r   r-   r-   r.   	fetchmany=  s    
zServerCursor.fetchmanyc              	   C  s<   | j j | j | d }W 5 Q R X |  jt|7  _|S r}   rK   r   r   rc   r@   r   r   r-   r-   r.   fetchallE  s    
zServerCursor.fetchallzIterator[Row]c              	   c  s\   | j j | j | | j}W 5 Q R X |D ]}|  jd7  _|V  q,t|| jk r qXq d S Nr
   rK   r   r   rc   r)   r@   r   r,   r   Zrecr-   r-   r.   __iter__K  s    
zServerCursor.__iter__rh   re   c              	   C  sJ   | j j | j | || W 5 Q R X |dkr@|  j|7  _n|| _d S )Nrh   )rK   r   r   rl   r@   r,   rf   rg   r-   r-   r.   scrollU  s
    
zServerCursor.scroll)N)r   )rh   )rq   rr   rs   ru   r   r/   r   r   r   r   r   r   r   r   r   rw   r-   r-   r9   r.   rx      s6   	 
	
rx   r   c                      s"  e Zd ZdZdZeddddddd	d
ddZedddddddd	dddZddddddddd	dddZddddZdd fddZd:ddddddddd d!Zd"d#dd$d	dd%d&d'Z	d(dd)d*Z
d;d,d-d.d/d0Zd-dd1d2Zd3dd4d5Zd<d,ddd7d8d9Z  ZS )=AsyncServerCursorry   r-   NFrz   zAsyncConnection[Row]r   r   r    r{   c                C  s   d S r}   r-   r~   r-   r-   r.   r/   e  s    zAsyncServerCursor.__init__AsyncConnection[Any]zAsyncRowFactory[Row]r   c                C  s   d S r}   r-   r   r-   r-   r.   r/   o  s    	r   zAsyncRowFactory[Row] | Nonec                C  s*   t j| ||p|jd t| ||| d S r   )r   r/   r   r   r   r-   r-   r.   r/   z  s    	  r   r0   c                 C  s   | j std|  dt d S r   r   r;   r-   r-   r.   r     s
    
zAsyncServerCursor.__del__c              
     sn   | j j4 I d H N | jr,W 5 Q I d H R  d S | j jsJ| j |  I d H  t  I d H  W 5 Q I d H R X d S r}   r   r;   r9   r-   r.   r     s    zAsyncServerCursor.closer   r   rC   r   r   r   c             
     s   |rt dt|d  | jjr,tdzB| jj4 I d H " | j| 	|||I d H  W 5 Q I d H R X W n. tj
k
r } z|d W 5 d }~X Y nX | S )Nr   r   r   r   r   r-   r-   r.   r     s    0zAsyncServerCursor.executeTr   r   r   c                  s   t dd S )Nr   r   r   r-   r-   r.   r     s    zAsyncServerCursor.executemanyr   c              
     s\   | j j4 I d H  | j | dI d H }W 5 Q I d H R X |rT|  jd7  _|d S d S d S r   r   r   r-   r-   r.   r     s    (zAsyncServerCursor.fetchoner   rd   r   r   c              
     sZ   |s
| j }| jj4 I d H  | j| |I d H }W 5 Q I d H R X |  jt|7  _|S r}   r   r   r-   r-   r.   r     s    (zAsyncServerCursor.fetchmanyc              
     sP   | j j4 I d H  | j | d I d H }W 5 Q I d H R X |  jt|7  _|S r}   r   r   r-   r-   r.   r     s    (zAsyncServerCursor.fetchallzAsyncIterator[Row]c              
   C sp   | j j4 I d H   | j | | jI d H }W 5 Q I d H R X |D ]}|  jd7  _|V  q@t|| jk r qlq d S r   r   r   r-   r-   r.   	__aiter__  s    *zAsyncServerCursor.__aiter__rh   re   c              
     s@   | j j4 I d H   | j | ||I d H  W 5 Q I d H R X d S r}   )rK   r   r   rl   r   r-   r-   r.   r     s    zAsyncServerCursor.scroll)N)r   )rh   )rq   rr   rs   ru   r   r/   r   r   r   r   r   r   r   r   r   rw   r-   r-   r9   r.   r   _  s6   	 		
r   r   N)5rt   
__future__r   typingr   r   r   r   r   r   warningsr	   rj   r   r   r   rb   abcr   r   r   r   Zrowsr   r   r   cursorr   _compatr   
generatorsr   Z_cursor_baser   Zcursor_asyncr   r|   r   Zconnection_asyncr   r(   ZFormatr*   rO   Z
ExecStatusrM   r?   ZTransactionStatusrV   rW   r   rx   r   r-   r-   r-   r.   <module>   s>     0 


 