o
    DDiX                     @  s  d 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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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, ddl-m.Z. erddlm/Z/ ddl0m1Z1m2Z2 ej3j4Z4ej3j5Z5ej6j7Z7ej6j8Z8ej6j9Z9ej6j:Z:ej6j;Z;ej6j<Z<ej6j=Z=ej6j>Z>ej6j?Z?ej6j@Z@ejAjBZBG dd deeef ZCdS )z
Psycopg BaseCursor object
    )annotations)TYPE_CHECKINGAnyGenericNoReturn)ReferenceTyperef)partial)IterableSequence   )adapt)errors)pq)ConnectionTypeLoaderParamsPQGenQuery)RowRowMakerColumn)Template)connection_summary)PostgresClientQueryPostgresQuery)Prepare)executefetchsend)capabilities)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%e&dd{d|Z'dddZ(d,dRdddZ)dddZ*ddd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  sT   || _ t| _|j| _t|j| _d| _	d| _
d | _|   t| jt| | j_d S )Nr   F)_connTEXTformatpgconnr)   r   AdaptersMapadapters	_adapters	arraysize_closed_last_query_resetr	   _loaders_changedr   _register_loader_callback)selfr+    r:   M/var/www/Datamplify/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)r9   r=   r:   r:   r;   r6   L   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)   r4   rC   r   
ExecStatusstatusnameid)r9   clsinforS   r:   r:   r;   __repr__X   s   
$zBaseCursor.__repr__c                 C     | j S )z$The connection this cursor is using.)r,   r9   r:   r:   r;   r+   c      zBaseCursor.connectionadapt.AdaptersMapc                 C  rY   N)r2   rZ   r:   r:   r;   r1   h   s   zBaseCursor.adaptersc                 C  rY   )z`True` if the cursor is closed.)r4   rZ   r:   r:   r;   rK   l   r[   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 r:   r   ).0irZ   r:   r;   
<listcomp>   s    z*BaseCursor.description.<locals>.<listcomp>N)rC   nfieldsrS   	TUPLES_OKSINGLE_TUPLETUPLES_CHUNKrange)r9   resr:   rZ   r;   descriptionq   s   


zBaseCursor.descriptionintc                 C  rY   )zk
        Number of records affected by the operation that produced
        the current result set.
        )rF   rZ   r:   r:   r;   rowcount   s   zBaseCursor.rowcount
int | Nonec                 C  s    | j o| j jtk}|r| jS dS )zsIndex of the next row to fetch in the current result set.

        `!None` if there is no result to fetch.
        N)rC   rS   rc   rD   )r9   tuplesr:   r:   r;   	rownumber   s   zBaseCursor.rownumbersizesSequence[Any]c                 C     d S r]   r:   )r9   rn   r:   r:   r;   setinputsizes      zBaseCursor.setinputsizesNsizer   columnc                 C  rp   r]   r:   )r9   rs   rt   r:   r:   r;   setoutputsize   rr   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)rE   lenrB   _select_current_resultrZ   r:   r:   r;   nextset   s   zBaseCursor.nextset
str | Nonec                 C  s"   | j r| j jnd}|r| S dS )z{
        The status tag of the current result set.

        `!None` if the cursor doesn't have a result available.
        N)rC   command_statusdecode)r9   msgr:   r:   r;   statusmessage   s   zBaseCursor.statusmessagec                 C  s   t r]   )NotImplementedErrorrZ   r:   r:   r;   _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_genr5   	_preparedmaintain_gen)r9   r   r   r   r   pgqr:   r:   r;   _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   rF   rG   r   rH   dumpr   r   r5   
_fetch_genr   r   )r9   r   r   r   pipelinefirstr   r   r:   r:   r;   _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   rF   rG   r   rH   r   r   r5   r,   r   r   )r9   r   r   r   r   r   r   r:   r:   r;   _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)   rS   FATAL_ERROReerror_from_result	_encoding_send_query_preparedr   maybe_add_to_cacheresult_queueappendvalidate_check_results_set_results)
r9   r   r   r   preprT   resultkeyqueuedresultsr:   r:   r;   r     s.   




zBaseCursor._maybe_prepare_gentuple[Prepare, bytes]c                 C  s   | j j||S r]   )r,   r   get)r9   r   r   r:   r:   r;   r   ?  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_moder5   r    )r9   r   r   r   rs   r   r:   r:   r;   _stream_send_genD  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)   rS   rd   re   rC   r&   set_pgresultr   r(   rc   
COMMAND_OKr   ProgrammingError_raise_for_result)r9   r   rg   rS   r:   r:   r;   _stream_fetchone_genZ  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)
rK   r   InterfaceErrorr6   r5   r   r"   r&   r,   r   )r9   r   r:   r:   r;   r   u  s   
zBaseCursor._start_query	statementc                 c  s    | j jr
td|  E dH  |st|tr&t| j}|	|| |j
}| |}| j|dd tt| jE dH  }dkrEt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   
isinstancer   r   r&   convertr   r   r   rw   r   r)   r   _check_copy_resultr   )r9   r   r   r   r   r   r:   r:   r;   _start_copy_gen  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-   rH   r,   r   command_queuer   r	   r)   send_query_paramsr   r   formatstypes
send_query)r9   r   r   r   fmtr:   r:   r;   r     s0   



zBaseCursor._execute_sendc                 C  s   |  | j}||| |S r]   )r*   r&   r   )r9   r   r   r   r:   r:   r;   r     s   zBaseCursor._convert_queryr   list[PGresult]c                 C  sL   |st d|D ]}|j }tkr#|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   InternalErrorrS   rc   r   EMPTY_QUERY	COPY_BOTHr   )r9   r   rg   rS   r:   r:   r;   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: )rS   r   r   r   r   PIPELINE_ABORTEDPipelineAbortedCOPY_INCOPY_OUTr   r   r   r   rR   rT   r9   r   rS   r:   r:   r;   r     s   
zBaseCursor._raise_for_resultr`   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   NrA   )rE   rB   rC   r&   r   rD   rS   rc   ntuplesrF   r   command_tuplesr   r(   )r9   r`   r.   rg   nrowsr:   r:   r;   rx     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   )rG   rB   rx   extendrF   r   )r9   r   first_batchrg   r:   r:   r;   r     s   
zBaseCursor._set_resultswself#ReferenceType[BaseCursor[Any, Any]]oidloadertype[Loader]c                 C  sJ   |  }sdS t ||_|j}|jt|jk r#||j ||_dS dS )zCallback called when self.adapters.set_loaders is called.

        Allow to change the loaders after the results have been returned already.
        N)r   r"   r&   rD   rE   rw   rB   rx   )rV   r   r   r   r9   posr:   r:   r;   r7   "  s   

zBaseCursor._loaders_changedrT   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   )r9   rT   r   r:   r:   r;   r   4  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   )r9   rT   r   r   r   r:   r:   r;   r   B  s    


zBaseCursor._send_query_preparedc                 C  s   | j rtd| j }std|j }tkr|S |tkr'tj|| j	d|t
kr0td|jr=d|j  d}nzt|j}W n tyS   | d}Y nw d| d}td	| )
Nr   zno result availabler   r   z (command status: )z
 - unknownz (result status: z)the last operation didn't produce records)rK   r   r   rC   r   rS   rc   r   r   r   r   r   r{   r|   r   rR   rT   r   )r9   rg   rS   detailstatus_namer:   r:   r;   _check_result_for_fetchY  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 )rS   r   r   r   r   r   r   r   r   rR   rT   r   r:   r:   r;   r   s  s   
zBaseCursor._check_copy_resultvaluemodec                 C  sj   |   }|dkr| j| }n|dkr|}ntd| dd|  kr+|jk s0td td|| _d S )Nrelativeabsolutez
bad mode: z'. It should be 'relative' or 'absolute'r   zposition out of bound)r   rD   r   r   
IndexError)r9   r   r   rg   newposr:   r:   r;   _scroll  s   
zBaseCursor._scrollc                 C  s   | j dd d| _dS )z3Non-blocking part of closing. Common to sync/async.F)r=   TN)r6   r4   rZ   r:   r:   r;   _close  s   
zBaseCursor._closec                 C  s   | j jS r]   )r)   r   rZ   r:   r:   r;   r     s   zBaseCursor._encoding)r+   r   )T)r=   r>   r?   r@   )r?   rI   )r?   r   )r?   r\   )r?   r>   )r?   r^   )r?   ri   )r?   rk   )rn   ro   r?   r@   r]   )rs   r   rt   rk   r?   r@   )r?   rv   )r?   rz   )r?   r'   )
r   r   r   r   r   rv   r   rv   r?   r   )r   r   r   r   r   r>   r?   r   )r   r   r   rv   r   rv   r?   r   )r   r   r   rv   r?   r   )
r   r   r   r   r   rv   rs   ri   r?   r   )r   r>   r?   r   )r   r   r?   r   )r   r   r   r   r?   r   )r   r   r   r>   r   rv   r?   r@   )r   r   r   r   r?   r   )r   r   r?   r@   )r   r$   r?   r   )r`   ri   r.   r   r?   r@   )r   r   r   ri   r   r   r?   r@   )rT   r   r   r   r?   r@   )rT   r   r   r   r   rv   r?   r@   )r?   r$   )r   r$   r?   r@   )r   ri   r   rI   r?   r@   )r?   r@   )/__name__rP   rQ   split	__slots____annotations__r   r*   r<   r6   rX   propertyr+   r1   rK   rh   rj   rm   rq   ru   ry   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rx   r   classmethodr7   r   r   r   r   r   r   r   r:   r:   r:   r;   r%   0   s   
 




	

#-
.







r%   N)D__doc__
__future__r   typingr   r   r   r   weakrefr   r   	functoolsr	   collections.abcr
   r    r   r   r   r   abcr   r   r   r   r   rowsr   r   _columnr   _compatr   pq.miscr   _queriesr   r   
_preparingr   
generatorsr   r   r    _capabilitiesr!   r"   pq.abcr#   r$   Formatr-   r   rR   r   r   rc   r   r   r   r   rd   re   r   TransactionStatusACTIVEr%   r:   r:   r:   r;   <module>   sF    