o
    "4gS                     @  s  d Z ddlmZ ddlmZ ddl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 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# ddl$m%Z%m&Z&m'Z' erddlm(Z( ddl)m*Z*m+Z+ ej,j-Z-ej,j.Z.ej/j0Z0ej/j1Z1ej/j2Z2ej/j3Z3ej/j4Z4ej/j5Z5ej/j6Z6ej/j7Z7ej/j8Z8ej/j9Z9ej:j;Z;G dd deeef Z<dS )z
Psycopg BaseCursor object
    )annotations)partial)AnyGenericIterableNoReturnSequence)TYPE_CHECKING   )pq)adapt)errors)ConnectionTypeQueryParamsPQGen)RowRowMaker)capabilitiesColumn)connection_summary)PostgresQueryPostgresClientQuery)Prepare)executefetchsend)Transformer)PGconnPGresultc                   @  s  e Zd ZU d Zded< ded< ded< eZded	< dddZddddZ	dddZ
edddZedddZedddZedd d!Zedd#d$Zedd&d'Zdd*d+Zddd0d1Zdd3d4Zedd6d7Zdd8d9Z	,dd,d,d:ddBdCZddGdHZddIdJZd,d,d:ddMdNZ	,dddPdQZ	,dd,dRddSdTZddWdXZdddZd[Z	,ddd]d^Zd_d,d`ddbdcZ 	,dddddeZ!ddhdiZ"ddmdnZ#dddrdsZ$ddtduZ%ddxdyZ&d,dRddzd{Z'dd|d}Z(dd~dZ)dddZ*dddZ+edddZ,d,S )
BaseCursorz
        _conn format _adapters arraysize _closed _results pgresult _pos
        _iresult _rowcount _query _tx _last_query _row_factory _make_row
        _pgconn _execmany_returning
        __weakref__
        r   _txRowMaker[Row]	_make_rowr   _pgconnztype[PostgresQuery]
_query_cls
connectionr   c                 C  s@   || _ t| _|j| _t|j| _d| _	d| _
d | _|   d S )Nr
   F)_connTEXTformatpgconnr%   r   AdaptersMapadapters	_adapters	arraysize_closed_last_query_reset)selfr'    r4   ]/var/www/html/authentication-server/venv/lib/python3.10/site-packages/psycopg/_cursor_base.py__init__;   s   zBaseCursor.__init__Treset_queryboolreturnNonec                 C  s:   g | _ d | _d| _d| _d| _|  d | _|rd | _d S d S )Nr   )_resultspgresult_pos_iresult	_rowcount_execmany_returning_query)r3   r7   r4   r4   r5   r2   E   s   
zBaseCursor._resetstrc              	   C  sl   | j j d| j j }t| j}| jrd}n| jr"t| jj	j
}nd}d| d| d| dt| dd		S )
N.closedz	no result<z [z] z at 0xx>)	__class__
__module____qualname__r   r%   r0   r=   r   
ExecStatusstatusnameid)r3   clsinforM   r4   r4   r5   __repr__Q   s   
$zBaseCursor.__repr__c                 C     | j S )z$The connection this cursor is using.)r(   r3   r4   r4   r5   r'   \      zBaseCursor.connectionadapt.AdaptersMapc                 C  rS   N)r.   rT   r4   r4   r5   r-   a   s   zBaseCursor.adaptersc                 C  rS   )z`True` if the cursor is closed.)r0   rT   r4   r4   r5   rE   e   rU   zBaseCursor.closedlist[Column] | Nonec                   sJ    j }|r#|js|jtks|jtks|jtkr# fddt|jD S dS )z
        A list of `Column` objects describing the current resultset.

        `!None` if the current resultset didn't return tuples.
        c                   s   g | ]}t  |qS r4   r   ).0irT   r4   r5   
<listcomp>|   s    z*BaseCursor.description.<locals>.<listcomp>N)r=   nfieldsrM   	TUPLES_OKSINGLE_TUPLETUPLES_CHUNKrange)r3   resr4   rT   r5   descriptionj   s   


zBaseCursor.descriptionintc                 C  rS   )z6Number of records affected by the precedent operation.)r@   rT   r4   r4   r5   rowcount   rU   zBaseCursor.rowcount
int | Nonec                 C  s    | j o| j jt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)r=   rM   r]   r>   )r3   tuplesr4   r4   r5   	rownumber   s   zBaseCursor.rownumbersizesSequence[Any]c                 C     d S rW   r4   )r3   rh   r4   r4   r5   setinputsizes      zBaseCursor.setinputsizesNsizer   columnc                 C  rj   rW   r4   )r3   rm   rn   r4   r4   r5   setoutputsize   rl   zBaseCursor.setoutputsizebool | Nonec                 C  s,   | j t| jd k r| | j d  dS dS )a  
        Move to the result set of the next query executed through `executemany()`
        or to the next result set if `execute()` returned more than one.

        Return `!True` if a new result is available, which will be the one
        methods `!fetch*()` will operate on.
        r
   TN)r?   lenr<   _select_current_resultrT   r4   r4   r5   nextset   s   zBaseCursor.nextset
str | Nonec                 C  s"   | j r| j jnd}|r| S dS )z
        The command status tag from the last SQL command executed.

        `!None` if the cursor doesn't have a result available.
        N)r=   command_statusdecode)r3   msgr4   r4   r5   statusmessage   s   zBaseCursor.statusmessagec                 C  s   t rW   )NotImplementedErrorrT   r4   r4   r5   _make_row_maker   s   zBaseCursor._make_row_makerpreparebinaryqueryr   paramsParams | Noner|   r}   PQGen[None]c                c  sn    |  |E dH  | ||}| j|||dE dH  | jjr'| jj E dH  || _| jj| jE dH  dS )z*Generator implementing `Cursor.execute()`.Nr{   )	_start_query_convert_query_maybe_prepare_genr(   	_pipeline_communicate_genr1   	_preparedmaintain_gen)r3   r~   r   r|   r}   pgqr4   r4   r5   _execute_gen   s   	zBaseCursor._execute_gen
params_seqIterable[Params]	returningc                 c  s    | j j}|s	J | |E dH  |sd| _| jdu sJ || _d}|D ]&}|r4| ||}|| _d}n|| | j|ddE dH  |	 E dH  q$|| _
|rY|jddE dH  | j j| j E dH  dS )zY
        Generator implementing `Cursor.executemany()` with pipelines available.
        Nr   TFr|   )flush)r(   r   r   r@   rA   r   rB   dumpr   r   r1   
_fetch_genr   r   )r3   r~   r   r   pipelinefirstr   r   r4   r4   r5   _executemany_gen_pipeline   s*   
z$BaseCursor._executemany_gen_pipelinec                 c  s    |  |E dH  |sd| _| jdu sJ || _d}|D ]}|r,| ||}|| _d}n|| | j|ddE dH  q|| _| jj	
| jE dH  dS )z]
        Generator implementing `Cursor.executemany()` with pipelines not available.
        Nr   TFr   )r   r@   rA   r   rB   r   r   r1   r(   r   r   )r3   r~   r   r   r   r   r   r4   r4   r5   _executemany_gen_no_pipeline   s    
z'BaseCursor._executemany_gen_no_pipeliner   r   c          
      c  s   |  ||\}}|tju r| j||d n-|tju r;| || | jjs;t| j	E d H \}|j
tkr;tj|| jd| j|||d | jj|||}| jjrgd }|d ur[|||f}| jjj| |f d S t| j	E d H }	|d ur}| jj||||	 | |	 | |	 d S )Nr}   encoding)_get_preparedr   NO_execute_sendSHOULD_send_preparer(   r   r   r%   rM   FATAL_ERROReerror_from_result	_encoding_send_query_preparedr   maybe_add_to_cacheresult_queueappendvalidate_check_results_set_results)
r3   r   r|   r}   preprN   resultkeyqueuedresultsr4   r4   r5   r   	  s.   




zBaseCursor._maybe_prepare_gentuple[Prepare, bytes]c                 C  s   | j j||S rW   )r(   r   get)r3   r   r|   r4   r4   r5   r   5  s   zBaseCursor._get_preparedr   c                c  s    |  |E dH  | ||}| j||dd |dk rtd|dkr)| j  ntjdd | j| || _	t
| jE dH  dS )z2Generator to send the query for `Cursor.stream()`.NT)r}   force_extendedr
   zsize must be >= 1)check)r   r   r   
ValueErrorr%   set_single_row_moder   has_stream_chunkedset_chunked_rows_moder1   r   )r3   r~   r   r}   rm   r   r4   r4   r5   _stream_send_gen:  s   	zBaseCursor._stream_send_genr   PQGen[PGresult | None]c                 c  s    t | jE d H }|d u rd S |j}|tks|tkr.|| _| jj||d |r,|  | _	|S |t
ks6|tkrM|rBt | jE d H }|s8|t
krKtdd S | |S )N)set_loadersz1the operation in stream() didn't produce a result)r   r%   rM   r^   r_   r=   r"   set_pgresultrz   r$   r]   
COMMAND_OKr   ProgrammingError_raise_for_result)r3   r   ra   rM   r4   r4   r5   _stream_fetchone_genP  s*   

zBaseCursor._stream_fetchone_genQuery | Nonec                 c  sP    | j r	td|   | jr| j|urd| _t| | _| j	 E dH  dS )zGenerator to start the processing of a query.

        It is implemented as generator because it may send additional queries,
        such as `begin`.
        the cursor is closedN)
rE   r   InterfaceErrorr2   r1   r   r   r"   r(   r   )r3   r~   r4   r4   r5   r   k  s   
zBaseCursor._start_query	statementc                 c  s    | j jr
td|  E dH  |r!t| j}||| |j}| 	|}| j
|dd t| jE dH }t|dkr@td| |d  | | dS )z<Generator implementing sending a command for `Cursor.copy().z$COPY cannot be used in pipeline modeNFr   r
   z*COPY cannot be mixed with other operationsr   )r(   r   r   NotSupportedErrorr   r   r"   convertr~   r   r   r   r%   rq   r   _check_copy_resultr   )r3   r   r   r   r~   r   r4   r4   r5   _start_copy_genz  s   



zBaseCursor._start_copy_genF)r   r}   r   c             
   C  s   |du r| j }n|rtnt}|| _| jjr-| jjjt| j	j
|j|j|j|j|d dS |s6|js6|tkrG| j	j
|j|j|j|j|d dS | j	|j dS )z
        Implement part of execute() before waiting common to sync and async.

        This is not a generator, but a normal non-blocking function.
        N)param_formatsparam_typesresult_format)r*   BINARYr)   rB   r(   r   command_queuer   r   r%   send_query_paramsr~   r   formatstypes
send_query)r3   r~   r   r}   fmtr4   r4   r5   r     s0   



zBaseCursor._execute_sendc                 C  s   |  | j}||| |S rW   )r&   r"   r   )r3   r~   r   r   r4   r4   r5   r     s   zBaseCursor._convert_queryr   list[PGresult]c                 C  sD   |st d|D ]}|j}|tkr|tkr|tkr| | q	dS )z
        Verify that the results of a query are valid.

        Verify that the query returned at least one result and that they all
        represent a valid result from the database.
        zgot no result from the queryN)r   InternalErrorrM   r]   r   EMPTY_QUERYr   )r3   r   ra   rM   r4   r4   r5   r     s   

zBaseCursor._check_resultsr   r    r   c                 C  sj   |j }|tkrtj|| jd|tkrtd|tks$|tks$|t	kr)t
dtdt|j )zV
        Raise an appropriate error message for an unexpected database result
        r   pipeline abortedz8COPY cannot be used with this method; use copy() insteadz%unexpected result status from query: )rM   r   r   r   r   PIPELINE_ABORTEDPipelineAbortedCOPY_INCOPY_OUT	COPY_BOTHr   r   r   rL   rN   r3   r   rM   r4   r4   r5   r     s   
zBaseCursor._raise_for_resultrZ   r*   pq.Format | Nonec                 C  st   || _ | j|  }| _| jj||d d| _|jtkr!| jj| _	n|jt
kr3| jj}|dur0|nd| _	|  | _dS )zL
        Select one of the results in the cursor as the active one.
        )r*   r   Nr;   )r?   r<   r=   r"   r   r>   rM   r]   ntuplesr@   r   command_tuplesrz   r$   )r3   rZ   r*   ra   nrowsr4   r4   r5   rr     s   

z!BaseCursor._select_current_resultc                 C  sx   | j d u r|| jd d < | d d S | j r+| j }| j| |r)| d d S d S |D ]}|  j|jp6d7  _q-d S )Nr   )rA   r<   rr   extendr@   r   )r3   r   first_batchra   r4   r4   r5   r     s   
zBaseCursor._set_resultsrN   bytesc                 C  sZ   | j jr | j jjt| jj||j|jd | j jj	d  d S | jj||j|jd d S )N)r   )
r(   r   r   r   r   r%   send_preparer~   r   r   )r3   rN   r~   r4   r4   r5   r     s   
zBaseCursor._send_preparec             	   C  sj   |d u r| j }n|rtnt}| jjr'| jjjt| jj	||j
|j|d d S | jj	||j
|j|d d S )N)r   r   )r*   r   r)   r(   r   r   r   r   r%   send_query_preparedr   r   )r3   rN   r   r}   r   r4   r4   r5   r   &  s    


zBaseCursor._send_query_preparedc                 C  sj   | j rtd| j}|std|j}|tkrd S |tkr'tj|| j	d|t
kr0tdtd)Nr   zno result availabler   r   z*the last operation didn't produce a result)rE   r   r   r=   r   rM   r]   r   r   r   r   r   )r3   ra   rM   r4   r4   r5   _check_result_for_fetch=  s   



z"BaseCursor._check_result_for_fetchc                 C  sJ   |j }|tks|tkrdS |tkrtj|| jdtdt	|j
 )zV
        Check that the value returned in a copy() operation is a legit COPY.
        Nr   zZcopy() should be used only with COPY ... TO STDOUT or COPY ... FROM STDIN statements, got )rM   r   r   r   r   r   r   r   r   rL   rN   r   r4   r4   r5   r   N  s   
zBaseCursor._check_copy_resultvaluemodec                 C  sv   |    | js	J |dkr| j| }n|dkr|}ntd| dd|  kr1| jjk s6td td|| _d S )Nrelativeabsolutez
bad mode: z'. It should be 'relative' or 'absolute'r   zposition out of bound)r   r=   r>   r   r   
IndexError)r3   r   r   newposr4   r4   r5   _scroll]  s   

zBaseCursor._scrollc                 C  s   | j dd d| _dS )z3Non-blocking part of closing. Common to sync/async.F)r7   TN)r2   r0   rT   r4   r4   r5   _closej  s   
zBaseCursor._closec                 C  s   | j jS rW   )r%   r   rT   r4   r4   r5   r   q  s   zBaseCursor._encoding)r'   r   )T)r7   r8   r9   r:   )r9   rC   )r9   r   )r9   rV   )r9   r8   )r9   rX   )r9   rc   )r9   re   )rh   ri   r9   r:   rW   )rm   r   rn   re   r9   r:   )r9   rp   )r9   rt   )r9   r#   )
r~   r   r   r   r|   rp   r}   rp   r9   r   )r~   r   r   r   r   r8   r9   r   )r   r   r|   rp   r}   rp   r9   r   )r   r   r|   rp   r9   r   )
r~   r   r   r   r}   rp   rm   rc   r9   r   )r   r8   r9   r   )r~   r   r9   r   )r   r   r   r   r9   r   )r~   r   r   r8   r}   rp   r9   r:   )r~   r   r   r   r9   r   )r   r   r9   r:   )r   r    r9   r   )rZ   rc   r*   r   r9   r:   )rN   r   r~   r   r9   r:   )rN   r   r   r   r}   rp   r9   r:   )r9   r:   )r   r    r9   r:   )r   rc   r   rC   r9   r:   )-__name__rJ   rK   split	__slots____annotations__r   r&   r6   r2   rR   propertyr'   r-   rE   rb   rd   rg   rk   ro   rs   rx   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   rr   r   r   r   r   r   r   r   r   r4   r4   r4   r5   r!   .   s   
 





	

#-
 .







r!   N)=__doc__
__future__r   	functoolsr   typingr   r   r   r   r   r	    r   r   r   r   abcr   r   r   r   rowsr   r   _capabilitiesr   _columnr   pq.miscr   _queriesr   r   
_preparingr   
generatorsr   r   r   r   pq.abcr   r    Formatr)   r   rL   r   r   r]   r   r   r   r   r^   r_   r   TransactionStatusACTIVEr!   r4   r4   r4   r5   <module>   sB    