
    j?Z                       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rddlm/Z/ ddl0m1Z1m2Z2 ej3        j4        Z4ej3        j5        Z5ej6        j7        Z7ej6        j8        Z8ej6        j9        Z9ej6        j:        Z:ej6        j;        Z;ej6        j<        Z<ej6        j=        Z=ej6        j>        Z>ej6        j?        Z?ej6        j@        Z@ejA        jB        ZB G 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                  \   e Zd ZU d                                Zded<   ded<   ded<   eZded	<   djdZdkdldZ	dmdZ
ednd            Zedod            Zedpd            Zedqd            Zedrd            Zedsd            Zdtd!Zdudvd&Zdwd(Zedxd*            Zdyd+Z	 dud"d"d,dzd4Zd{d8Zd{d9Zd"d"d,d|d<Z	 dud}d>Z	 dud"d?d~d@ZddCZduddEZ	 duddGZdHd"dIddKZ 	 duddLZ!ddOZ"ddSZ#duddWZ$ddXZ%e&dd^            Z'ddaZ(d"d?ddbZ)ddcZ*dddZ+ddgZ,ddhZ-edmdi            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 _statusmessage
        __weakref__
        r#   _txRowMaker[Row]	_make_rowr$   _pgconnztype[PostgresQuery]
_query_cls
connectionr   c                *   || _         t          | _        |j        | _        t          j        |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-   s     ^/workspace/show-city-briefing-agent/.venv/lib/python3.11/site-packages/psycopg/_cursor_base.py__init__zBaseCursor.__init__=   s|    
!(*:+>??)- 4;!3t994
 4
000    Treset_queryboolreturnNonec                    g | _         d | _        d| _        d| _        d| _        d | _        |  d | _        |r	d | _        d S d S Nr   )_resultspgresult_pos_iresult	_rowcount_statusmessage_execmany_returning_query)r<   r@   s     r=   r9   zBaseCursor._resetL   sX    (*)-	,0)04  	DKKK	 	r?   strc           
        | j         j         d| j         j         }t          | j                  }| j        rd}n-| j        r$t          j        | 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+   r7   rH   r   
ExecStatusstatusnameid)r<   clsinforZ   s       r=   __repr__zBaseCursor.__repr__Y   s    *JJT^-HJJ!$,//< 	!FF] 	!]4=#788=FF F=3==&==D==4=====r?   c                    | j         S )z$The connection this cursor is using.)r/   r<   s    r=   r-   zBaseCursor.connectiond   s     zr?   adapt.AdaptersMapc                    | j         S N)r5   ra   s    r=   r4   zBaseCursor.adaptersi   s
    ~r?   c                    | j         S )z`True` if the cursor is closed.)r7   ra   s    r=   rR   zBaseCursor.closedm   s     |r?   list[Column] | Nonec                      j         }|rW|j        s0|j        t          k    s |j        t          k    s|j        t
          k    r  f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                0    g | ]}t          |          S  r   ).0ir<   s     r=   
<listcomp>z*BaseCursor.description.<locals>.<listcomp>   s!    @@@F4OO@@@r?   N)rH   nfieldsrZ   	TUPLES_OKSINGLE_TUPLETUPLES_CHUNKrange)r<   ress   ` r=   descriptionzBaseCursor.descriptionr   sp     m
  	K	zY&&z\))z\))@@@@U3;-?-?@@@@4r?   intc                    | j         S )zk
        Number of records affected by the operation that produced
        the current result set.
        )rK   ra   s    r=   rowcountzBaseCursor.rowcount   s     ~r?   
int | Nonec                P    | j         o| j         j        t          k    }|r| j        ndS )zsIndex of the next row to fetch in the current result set.

        `!None` if there is no result to fetch.
        N)rH   rZ   rn   rI   )r<   tupless     r=   	rownumberzBaseCursor.rownumber   s+     D4=#79#D",tyy,r?   sizesSequence[Any]c                    d S rd   ri   )r<   r{   s     r=   setinputsizeszBaseCursor.setinputsizes       r?   Nsizer   columnc                    d S rd   ri   )r<   r   r   s      r=   setoutputsizezBaseCursor.setoutputsize   r   r?   bool | Nonec                    | j         t          | j                  dz
  k     r|                     | j         dz              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)rJ   lenrG   _select_current_resultra   s    r=   nextsetzBaseCursor.nextset   sE     =3t}--111''(9:::44r?   
str | Nonec                F    | j         r| j                                         ndS )z{
        The status tag of the current result set.

        `!None` if the cursor doesn't have a result available.
        N)rL   decodera   s    r=   statusmessagezBaseCursor.statusmessage   s&     04/BLt"))+++Lr?   c                    t           rd   )NotImplementedErrorra   s    r=   _make_row_makerzBaseCursor._make_row_maker   s    !!r?   preparebinaryqueryr   paramsParams | Noner   r   PQGen[None]c             #  j  K   |                      |          E d{V  |                     ||          }|                     |||          E d{V  | j        j        r$| j        j                                        E d{V  || _        | j        j                            | j                  E d{V  dS )z*Generator implementing `Cursor.execute()`.Nr   )	_start_query_convert_query_maybe_prepare_genr/   	_pipeline_communicate_genr8   	_preparedmaintain_gen)r<   r   r   r   r   pgqs         r=   _execute_genzBaseCursor._execute_gen   s       $$U+++++++++!!%00**3*OOOOOOOOO: 	?z+<<>>>>>>>>> :'44TZ@@@@@@@@@@@r?   
params_seqIterable[Params]	returningc              #    K   | j         j        }|sJ |                     |          E d{V  |sd| _        | j        J || _        d}|D ]p}|r |                     ||          }|| _        d}n|                    |           |                     |d          E d{V  |	                                E d{V  q|| _
        |r|                    d          E d{V  | j         j                            | j                   E d{V  dS )zY
        Generator implementing `Cursor.executemany()` with pipelines available.
        Nr   TFr   )flush)r/   r   r   rK   rM   r   rN   dumpr   r   r8   
_fetch_genr   r   )r<   r   r   r   pipelinefirstr   r   s           r=   _executemany_gen_pipelinez$BaseCursor._executemany_gen_pipeline   sv      :'$$U+++++++++ 	DN'///#,   		3 		3F !))%88!   ..sD.AAAAAAAAA002222222222  	7***666666666:'44TZ@@@@@@@@@@@r?   c              #    K   |                      |          E d{V  |sd| _        | j        J || _        d}|D ]V}|r |                     ||          }|| _        d}n|                    |           |                     |d          E d{V  W|| _        | j        j	        
                    | j                  E d{V  dS )z]
        Generator implementing `Cursor.executemany()` with pipelines not available.
        Nr   TFr   )r   rK   rM   r   rN   r   r   r8   r/   r   r   )r<   r   r   r   r   r   r   s          r=   _executemany_gen_no_pipelinez'BaseCursor._executemany_gen_no_pipeline   s      $$U+++++++++ 	DN'///#,   	B 	BF !))%88!   ..sD.AAAAAAAAAA :'44TZ@@@@@@@@@@@r?   r   r   c             #  8  K   |                      ||          \  }}|t          j        u r|                     ||           n|t          j        u rl|                     ||           | j        j        sJt          | j	                  E d {V }|D ]-}|j
        t          k    rt          j        || j                  .|                     |||           | j        j                            |||          }| j        j        r1d }	||||f}	| j        j        j                            | |	f           d S t          | j	                  E d {V }|"| j        j                            ||||           |                     |           |                     |           d S )Nr   encoding)_get_preparedr   NO_execute_sendSHOULD_send_preparer/   r   r   r+   rZ   FATAL_ERROReerror_from_result	_encoding_send_query_preparedr   maybe_add_to_cacheresult_queueappendvalidate_check_results_set_results)
r<   r   r   r   prepr[   resultsresultkeyqueueds
             r=   r   zBaseCursor._maybe_prepare_gen  s      ''W55
d7:s62222 w~%%""4---z+ W)0)>)>>>>>>>G") W W!=K77"#"5ft~"V"V"VV 8 %%dC%???
 j"55c4FF: 	FtT*J -44dF^DDDF %T\22222222?J ))#tT7CCCG$$$'"""""r?   tuple[Prepare, bytes]c                B    | j         j                            ||          S rd   )r/   r   get)r<   r   r   s      r=   r   zBaseCursor._get_prepared@  s     z#''W555r?   r   c             #    K   |                      |          E d{V  |                     ||          }|                     ||d           |dk     rt          d          |dk    r| j                                         n/t          j        d           | j                            |           || _	        t          | j                  E d{V  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_moder8   r!   )r<   r   r   r   r   r   s         r=   _stream_send_genzBaseCursor._stream_send_genE  s       $$U+++++++++!!%003vdCCC!880111QYYL,,....+$7777L..t444 %%%%%%%%%%%r?   r   PQGen[PGresult | None]c              #    K   t          | j                  E d {V }|d S |j        }|t          k    s|t          k    r@|| _        | j                            ||           |r|                                 | _	        |S |t          k    s|t          k    r?|rt          | j                  E d {V }||t          k    rt          j        d          d S |                     |          S )N)set_loadersz1the operation in stream() didn't produce a result)r    r+   rZ   ro   rp   rH   r(   set_pgresultr   r*   rn   
COMMAND_OKr   ProgrammingError_raise_for_result)r<   r   rr   rZ   s       r=   _stream_fetchone_genzBaseCursor._stream_fetchone_gen[  s     */*=*=======;4\!!V|%;%;DMH!!#5!999 8!%!5!5!7!7Jy  Fj$8$8 5!&t|!4!4444444  5""(G   4 ))#...r?   Query | Nonec              #    K   | j         rt          j        d          |                                  | j        r	| j        |ur d| _        t          j        |           | _        | j        	                                E d{V  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)
rR   r   InterfaceErrorr9   r8   r   r#   r(   r/   r   )r<   r   s     r=   r   zBaseCursor._start_queryv  s       ; 	;"#9::: 	/D$4E$A$A#D(..DH:**,,,,,,,,,,,r?   	statementc              #  H  K   | j         j        rt          j        d          |                                 E d{V  |st          |t                    r1t          | j                  }|	                    ||           |j
        }|                     |          }|                     |d           t          t          | j                  E d{V x}          dk    rt          j        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   r   r   r+   r   _check_copy_resultr   )r<   r   r   r   r   r   s         r=   _start_copy_genzBaseCursor._start_copy_gen  s5      : 	N%&LMMM$$&&&&&&&&&  	"Z	844 	"%dh//CKK	6***	I##I..5///gdl&;&;;;;;;;<w==BB$%QRRR
+++'"""""r?   F)r   r   r   c          
        || j         }n|rt          nt          }|| _        | j        j        rW| j        j        j                            t          | j	        j
        |j        |j        |j        |j        |                     dS |s|j        s|t          k    r5| j	        
                    |j        |j        |j        |j        |           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)r1   BINARYr0   rN   r/   r   command_queuer   r
   r+   send_query_paramsr   r   formatstypes
send_query)r<   r   r   r   fmts        r=   r   zBaseCursor._execute_send  s    >+CC",&&C: 	1 J .55L2KL"'- %"%  	 	 	 	 	  	1u| 	1sf}}L**#m!K! +      L##EK00000r?   c                f    |                      | j                  }|                    ||           |S rd   )r,   r(   r   )r<   r   r   r   s       r=   r   zBaseCursor._convert_query  s0     oodh''E6"""
r?   r   list[PGresult]c                    |st          j        d          |D ]J}|j        x}t          k    r6|t          k    r+|t
          k    r |t          k    r|                     |           Kd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   InternalErrorrZ   rn   r   EMPTY_QUERY	COPY_BOTHr   )r<   r   rr   rZ   s       r=   r   zBaseCursor._check_results  s      	B/"@AAA 	, 	,C:%)33j((k))i''&&s+++	, 	,r?   r   r%   r   c                `   |j         x}t          k    rt          j        || j                  |t
          k    rt          j        d          |t          k    s|t          k    s|t          k    rt          j
        d          t          j        dt          j        |          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: )rZ   r   r   r   r   PIPELINE_ABORTEDPipelineAbortedCOPY_INCOPY_OUTr   r   r   r   rY   r[   r<   r   rZ   s      r=   r   zBaseCursor._raise_for_result  s     m#F33%ft~FFFF'''#$6777w&H"4"4)8K8K$J   /W2=;P;P;UWW  r?   rk   r1   pq.Format | Nonec                ^   || _         | j        |         x}| _        | j                            ||           d| _        |j        t          k    r| j        j        | _	        n'|j        t          k    r| j        j        }||nd| _	        |j        | _        |                                 | _        dS )zL
        Select one of the results in the cursor as the active one.
        )r1   r   NrF   )rJ   rG   rH   r(   r   rI   rZ   rn   ntuplesrK   r   command_tuplescommand_statusrL   r   r*   )r<   rk   r1   rr   nrowss        r=   r   z!BaseCursor._select_current_result  s     "mA..dm
 	c&111	:""!]2DNN
 Z8##M0E&+&7UURDN!0--//r?   c                F   | j         #|| j        d d <   |                     d           d S | j         r=| j         }| j                            |           |r|                     d           d S d S |r.|d         j        | _        |D ]}| xj        |j        pdz  c_        d S d S rE   )rM   rG   r   extendr  rL   rK   r   )r<   r   first_batchrr   s       r=   r   zBaseCursor._set_results  s    #+&DM!!!''*****% 	>"m+KM  ))) /++A...../ /  >&-bk&@#" > >CNNc&8&=A=NNN> >> >r?   wself#ReferenceType[BaseCursor[Any, Any]]oidloadertype[Loader]c                     |            x}sdS t          j        |          |_        |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(   rI   rJ   r   rG   r   )r]   r  r  r	  r<   poss         r=   r:   zBaseCursor._loaders_changed'  sv      	F $T**i=3t}----''666DIII .-r?   r[   bytesc                J   | j         j        ro| j         j        j                            t	          | j        j        ||j        |j                             | j         j        j	                            d            d S | j                            ||j        |j                   d S )N)r   )
r/   r   r   r   r
   r+   send_preparer   r   r   )r<   r[   r   s      r=   r   zBaseCursor._send_prepare9  s    : 	RJ .55L-K %	     J -44T:::::L%%dEKU[%QQQQQr?   c          	     :   || j         }n|rt          nt          }| j        j        rL| j        j        j                            t          | j        j	        ||j
        |j        |                     d S | j        	                    ||j
        |j        |           d S )N)r   r   )r1   r   r0   r/   r   r   r   r
   r+   send_query_preparedr   r   )r<   r[   r   r   r   s        r=   r   zBaseCursor._send_query_preparedG  s     >+CC",&&C: 	J .55L4J"%+"%       L,,cj3 -     r?   c                   | j         rt          j        d          | j        x}st          j        d          |j        x}t          k    r|S |t          k    rt          j        || j	                  |t          k    rt          j        d          |j        rd|j                                         d}n6	 t          j        |          j        }n# t"          $ r | d}Y nw xY wd| d}t          j        d	|           )
Nr   zno result availabler   r   z (command status: )z
 - unknownz (result status: z)the last operation didn't produce records)rR   r   r   rH   r   rZ   rn   r   r   r   r   r   r  r   r   rY   r[   r   )r<   rr   rZ   detailstatus_names        r=   _check_result_for_fetchz"BaseCursor._check_result_for_fetch^  s9   ; 	;"#9:::}$ 	<$%:;;;j FY..J{""%cDNCCCC'''#$6777! <Lc.@.G.G.I.ILLL8"$-"7"7"<KK! 8 8 8%+"7"7"7KKK8;[;;;$DFDD  s   8C C$#C$c                    |j         }|t          k    s|t          k    rdS |t          k    rt	          j        || j                  t	          j        dt          j	        |          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 )rZ   r   r   r   r   r   r   r   r   rY   r[   r   s      r=   r   zBaseCursor._check_copy_resultx  s     W( 2 2F{""%ft~FFFF$L/1}V/D/D/IL L  r?   valuemodec                    |                                  }|dk    r| j        |z   }n|dk    r|}nt          d| d          d|cxk    r|j        k     sn t	          d          || _        d S )Nrelativeabsolutez
bad mode: z'. It should be 'relative' or 'absolute'r   zposition out of bound)r  rI   r   r   
IndexError)r<   r  r  rr   newposs        r=   _scrollzBaseCursor._scroll  s    **,,:Y&FFZFFW$WWWXXXF((((S[((((4555			r?   c                @    |                      d           d| _        dS )z3Non-blocking part of closing. Common to sync/async.F)r@   TN)r9   r7   ra   s    r=   _closezBaseCursor._close  s#     	&&&r?   c                    | j         j        S rd   )r+   r   ra   s    r=   r   zBaseCursor._encoding  s    |%%r?   )r-   r   )T)r@   rA   rB   rC   )rB   rO   )rB   r   )rB   rb   )rB   rA   )rB   rf   )rB   rt   )rB   rw   )r{   r|   rB   rC   rd   )r   r   r   rw   rB   rC   )rB   r   )rB   r   )rB   r)   )
r   r   r   r   r   r   r   r   rB   r   )r   r   r   r   r   rA   rB   r   )r   r   r   r   r   r   rB   r   )r   r   r   r   rB   r   )
r   r   r   r   r   r   r   rt   rB   r   )r   rA   rB   r   )r   r   rB   r   )r   r   r   r   rB   r   )r   r   r   rA   r   r   rB   rC   )r   r   r   r   rB   r   )r   r   rB   rC   )r   r%   rB   r   )rk   rt   r1   r   rB   rC   )r  r  r  rt   r	  r
  rB   rC   )r[   r  r   r   rB   rC   )r[   r  r   r   r   r   rB   rC   )rB   r%   )r   r%   rB   rC   )r  rt   r  rO   rB   rC   )rB   rC   )/__name__rW   rX   split	__slots____annotations__r   r,   r>   r9   r_   propertyr-   r4   rR   rs   rv   rz   r~   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   classmethodr:   r   r   r  r   r  r!  r   ri   r?   r=   r'   r'   0   se        
 EGG  OOO&3J3333
 
 
 
    	> 	> 	> 	>    X    X    X    X*    X - - - X-           M M M XM" " " " !%A
  $"A A A A A A$!A !A !A !AFA A A A>  $"+# +# +# +# +# +#\ :>6 6 6 6 6 !%&
 #& & & & & &,/ / / /6- - - - -  9=# # # # #>  %"+1 +1 +1 +1 +1 +1\ 59    , , , ,&   "0 0 0 0 06> > > >(    ["R R R R IM     .   4   
 
 
 
    & & & X& & &r?   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%   Formatr0   r   rY   r   r   rn   r   r   r   r   ro   rp   r   TransactionStatusACTIVEr'   ri   r?   r=   <module>r=     s    # " " " " " 8 8 8 8 8 8 8 8 8 8 8 8 & & & & & & & &       . . . . . . . .                   = = = = = = = = = = = = = =                     ' ' ' ' ' ' 8 8 8 8 8 8 8 8       , , , , , , , , , , ' ' ' ' ' ' )      ((((((((	y~		m']%
M#	=!
-
M#	m'})})=1 			$l	& l	& l	& l	& l	&,- l	& l	& l	& l	& l	&r?   