
    2iX                       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jf                  jh                  Z4ejf                  jj                  Z5ejl                  jn                  Z7ejl                  jp                  Z8ejl                  jr                  Z9ejl                  jt                  Z:ejl                  jv                  Z;ejl                  jx                  Z<ejl                  jz                  Z=ejl                  j|                  Z>ejl                  j~                  Z?ejl                  j                  Z@ej                  j                  ZB G d deeef         ZCy)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j                         Zded<   ded<   ded<   eZded	<   d4d
Zd5d6dZ	d7dZ
ed8d       Zed9d       Zed:d       Zed;d       Zed<d       Zed=d       Zd>dZd?d@dZdAdZedBd       ZdCdZ	 d?ddd	 	 	 	 	 	 	 	 	 dDdZ	 	 	 	 	 	 	 	 dEdZ	 	 	 	 	 	 	 	 dEdZddd	 	 	 	 	 	 	 dFdZ	 d?	 	 	 	 	 dGdZ	 d?dd	 	 	 	 	 	 	 	 	 dHd ZdId!Zd?dJd"Z	 d?	 	 	 	 	 dKd#Zd$dd%	 	 	 	 	 	 	 dLd&Z 	 d?	 	 	 	 	 dMd'Z!dNd(Z"dOd)Z#d?dPd*Z$dNd+Z%e&	 	 	 	 	 	 	 	 dQd,       Z'dRd-Z(dd	 	 	 	 	 	 	 dSd.Z)dTd/Z*dUd0Z+dVd1Z,dWd2Z-ed7d3       Z.y)X
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_clsc                8   || _         t        | _        |j                  | _        t        j                  |j                        | _        d| _	        d| _
        d | _        | j                          t        | j                  t        |             | j                  _        y )Nr   F)_connTEXTformatpgconnr*   r   AdaptersMapadapters	_adapters	arraysize_closed_last_query_resetr
   _loaders_changedr	   _register_loader_callback)self
connections     S/var/www/html/secretsanta/venv/lib/python3.12/site-packages/psycopg/_cursor_base.py__init__zBaseCursor.__init__=   sv    
!((**:+>+>?)- 4;!!3t94
0    c                p    g | _         d | _        d| _        d| _        d| _        |  d | _        |rd | _        y y )Nr   )_resultspgresult_pos_iresult	_rowcount_execmany_returning_query)r:   reset_querys     r<   r7   zBaseCursor._resetL   s?    (*)-	04 DK r>   c           
     ^   | j                   j                   d| j                   j                   }t        | j                        }| j
                  rd}nB| j                  r4t        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*   r5   rB   r   
ExecStatusstatusnameid)r:   clsinforS   s       r<   __repr__zBaseCursor.__repr__X   s    **+1T^^-H-H,IJ!$,,/<<F]]]]4==#7#78==F F3%r&D64|1==r>   c                    | j                   S )z$The connection this cursor is using.)r-   r:   s    r<   r;   zBaseCursor.connectionc   s     zzr>   c                    | j                   S N)r3   rZ   s    r<   r2   zBaseCursor.adaptersh   s    ~~r>   c                    | j                   S )z`True` if the cursor is closed.)r5   rZ   s    r<   rK   zBaseCursor.closedl   s     ||r>   c                   | j                   }|rr|j                  s9|j                  t        k(  s&|j                  t        k(  s|j                  t
        k(  r-t        |j                        D cg c]  }t        | |       c}S yc c}w )z
        A list of `Column` objects describing the current resultset.

        `!None` if the current resultset didn't return tuples.
        N)rB   nfieldsrS   	TUPLES_OKSINGLE_TUPLETUPLES_CHUNKranger   )r:   resis      r<   descriptionzBaseCursor.descriptionq   sf     mm
 KKzzY&zz\)zz\)-23;;-?@F4O@@ As   +Bc                    | j                   S )zk
        Number of records affected by the operation that produced
        the current result set.
        )rE   rZ   s    r<   rowcountzBaseCursor.rowcount   s     ~~r>   c                x    | j                   xr | 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)rB   rS   r`   rC   )r:   tupless     r<   	rownumberzBaseCursor.rownumber   s2     D4==#7#79#D"tyy,,r>   c                     y r\    )r:   sizess     r<   setinputsizeszBaseCursor.setinputsizes       r>   Nc                     y r\   rm   )r:   sizecolumns      r<   setoutputsizezBaseCursor.setoutputsize   rp   r>   c                    | j                   t        | j                        dz
  k  r| j                  | j                   dz          yy)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)rD   lenrA   _select_current_resultrZ   s    r<   nextsetzBaseCursor.nextset   s;     ==3t}}-11''(9:r>   c                r    | j                   r| j                   j                  nd}|r|j                         S dS )z{
        The status tag of the current result set.

        `!None` if the cursor doesn't have a result available.
        N)rB   command_statusdecode)r:   msgs     r<   statusmessagezBaseCursor.statusmessage   s.     /3mmdmm**"szz|,,r>   c                    t         r\   )NotImplementedErrorrZ   s    r<   _make_row_makerzBaseCursor._make_row_maker   s    !!r>   preparebinaryc             #    K   | j                  |      E d{    | j                  ||      }| j                  |||      E d{    | j                  j                  r,| j                  j                  j                         E d{    || _        | j                  j                  j                  | j                        E d{    y7 7 7 G7 w)z*Generator implementing `Cursor.execute()`.Nr   )	_start_query_convert_query_maybe_prepare_genr-   	_pipeline_communicate_genr6   	_preparedmaintain_gen)r:   queryparamsr   r   pgqs         r<   _execute_genzBaseCursor._execute_gen   s      $$U+++!!%0**3*OOO::zz++<<>>> ::''44TZZ@@@ 	,O> 	AsF   CC-CCACC=CCCCCCc              #  L  K   | j                   j                  }|sJ | j                  |      E d{    |sd| _        | j                  J || _        d}|D ]d  }|r| j                  ||      }|| _        d}nj                  |       | j                  |d      E d{    |j                         E d{    f || _
        |r|j                  d      E d{    | j                   j                  j                  | j                         E d{    y7 7 {7 e7 B7 w)zY
        Generator implementing `Cursor.executemany()` with pipelines available.
        Nr   TFr   )flush)r-   r   r   rE   rF   r   rG   dumpr   r   r6   
_fetch_genr   r   )r:   r   
params_seq	returningpipelinefirstr   r   s           r<   _executemany_gen_pipelinez$BaseCursor._executemany_gen_pipeline   s"     ::''x$$U+++DN''///#,   		3F))%8! ..sD.AAA00222		3 !***666::''44TZZ@@@1 	,  B2
 7@sX   /D$DA.D$ D!D$8D9$D$D 6D$D"D$D$D$ D$"D$c              #    K   | j                  |      E d{    |sd| _        | j                  J || _        d}|D ]L  }|r| j                  ||      }|| _        d}nj                  |       | j                  |d      E d{    N || _        | j                  j                  j                  | j                        E d{    y7 7 G7 	w)z]
        Generator implementing `Cursor.executemany()` with pipelines not available.
        Nr   TFr   )r   rE   rF   r   rG   r   r   r6   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F))%8! ..sD.AAA	B !::''44TZZ@@@' 	,  B 	As4   CCA.CC?CCCCCc             #    K   | j                  ||      \  }}|t        j                  u r| j                  ||       n|t        j                  u r{| j                  ||       | j                  j                  sSt        | j                        E d {   \  }|j                  t        k(  r!t        j                  || j                        | j                  |||       | j                  j                   j#                  |||      }| j                  j                  r;d }||||f}| j                  j                  j$                  j'                  | |f       y t        | j                        E d {   }	|(| j                  j                   j)                  ||||	       | j+                  |	       | j-                  |	       y 7 17 Tw)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)
r:   r   r   r   preprT   resultkeyqueuedresultss
             r<   r   zBaseCursor._maybe_prepare_gen  sy     ''W5
d7::s62 w~~%""4-zz+++24<<+@ @IV}}311&4>>RR%%dC%?
 jj""55c4F::FtT*JJ  --44dF^D %T\\22?JJ  ))#tT7CG$'"3 !A& 3s&   BGGCG/G0AGGc                N    | j                   j                  j                  ||      S r\   )r-   r   get)r:   r   r   s      r<   r   zBaseCursor._get_prepared?  s!     zz##''W55r>   r   c             #    K   | j                  |      E d{    | j                  ||      }| j                  ||d       |dk  rt        d      |dk(  r| j                  j                          n1t        j                  d       | j                  j                  |       || _	        t        | j                        E d{    y7 7 w)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_moder6   r    )r:   r   r   r   rr   r   s         r<   _stream_send_genzBaseCursor._stream_send_genD  s      $$U+++!!%03vdC!8011QYLL,,.++$7LL..t4 %%% 	, 	&s"   CCB*CC
C
Cc              #    K   t        | j                        E d {   }|y |j                  }|t        k(  s	|t        k(  r=|| _        | j                  j                  ||       |r| j                         | _	        |S |t        k(  s	|t        k(  rA|r t        | j                        E d {   }|r |t        k7  rt        j                  d      y | j                  |      S 7 7 9w)N)set_loadersz1the operation in stream() didn't produce a result)r   r*   rS   ra   rb   rB   r'   set_pgresultr   r)   r`   
COMMAND_OKr   ProgrammingError_raise_for_result)r:   r   rd   rS   s       r<   _stream_fetchone_genzBaseCursor._stream_fetchone_genZ  s     */*==;\!V|%;DMHH!!#5!9!%!5!5!7Jy Fj$8!&t||!44 "((G   ))#..1  > 5s(   C&C"BC&*C$+C&21C&$C&c              #  ,  K   | j                   rt        j                  d      | j                          | j                  r| j                  |ur!d| _        t        j                  |       | _        | j                  j                         E d{    y7 w)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   InterfaceErrorr7   r6   r   r"   r'   r-   r   )r:   r   s     r<   r   zBaseCursor._start_queryu  sp      ;;""#9::D$4$4E$A#D((.DH::**,,,s   B
BBBc              #  6  K   | j                   j                  rt        j                  d      | j	                         E d{    |st        |t              r3t        | j                        }|j                  ||       |j                  }| j                  |      }| j                  |d       t        t        | j                        E d{   x}      dk7  rt        j                   d      | j#                  |d          | j%                  |       y7 7 Jw)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   rv   r   r*   r   _check_copy_resultr   )r:   	statementr   r   r   r   s         r<   _start_copy_genzBaseCursor._start_copy_gen  s      ::%%&LMM$$&&& Z	84%dhh/CKK	6*		I##I.5/gdll&;;<w=B$$%QRR
+'" 	' <s%   ?DDB
DDA	DDF)r   r   c          
     x   || j                   }n|rt        nt        }|| _        | j                  j
                  r{| j                  j
                  j                  j                  t        | j                  j                  |j                  |j                  |j                  |j                  |             y|s|j                  s	|t        k(  rI| j                  j                  |j                  |j                  |j                  |j                  |       y| j                  j                  |j                         y)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.   rG   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     >++C"&C:: JJ  ..55LL22KKLL"'-- %"%	 u||sf}LL**#mm!KK! +  LL##EKK0r>   c                `    | j                  | j                        }|j                  ||       |S r\   )r+   r'   r   )r:   r   r   r   s       r<   r   zBaseCursor._convert_query  s)     oodhh'E6"
r>   c                    |st        j                  d      |D ]G  }|j                  x}t        k7  s|t        k7  s#|t
        k7  s-|t        k7  s7| j                  |       I y)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   r`   r   EMPTY_QUERY	COPY_BOTHr   )r:   r   rd   rS   s       r<   r   zBaseCursor._check_results  s]     //"@AA 	,C::%)3j(k)i'&&s+	,r>   c                t   |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: )rS   r   r   r   r   PIPELINE_ABORTEDPipelineAbortedCOPY_INCOPY_OUTr   r   r   r   rR   rT   r:   r   rS   s      r<   r   zBaseCursor._raise_for_result  s     mm#F3%%ft~~FF''##$677w&H"4)8K$$J  //:2==;P;U;U:VW r>   c                v   || _         | j                  |   x}| _        | j                  j	                  ||       d| _        |j                  t        k(  r| j                  j                  | _	        n4|j                  t        k7  r!| j                  j                  }||nd| _	        | j                         | _        y)zL
        Select one of the results in the cursor as the active one.
        )r/   r   Nr@   )rD   rA   rB   r'   r   rC   rS   r`   ntuplesrE   r   command_tuplesr   r)   )r:   re   r/   rd   nrowss        r<   rw   z!BaseCursor._select_current_result  s     "mmA..dm
 	c&1	::"!]]22DN
 ZZ8#MM00E&+&7URDN--/r>   c                D   | j                   !|| j                  d d  | j                  d       y | j                   r=| j                   }| j                  j                  |       |r| j                  d       y y |D ]%  }| xj                  |j
                  xs dz  c_        ' y )Nr   )rF   rA   rw   extendrE   r   )r:   r   first_batchrd   s       r<   r   zBaseCursor._set_results  s    ##+&DMM!''*%%"mm+KMM  )++A. 
  :#"4"4"99:r>   c                     |       x}syt        j                  |      |_        |j                  }|j                  t        |j                        k  r#|j                  |j                         ||_        yy)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'   rC   rD   rv   rA   rw   )rV   wselfoidloaderr:   poss         r<   r8   zBaseCursor._loaders_changed"  sb      $$T*ii==3t}}--''6DI .r>   c                   | j                   j                  r| j                   j                  j                  j                  t	        | j
                  j                  ||j                  |j                               | j                   j                  j                  j                  d        y | j
                  j                  ||j                  |j                         y )N)r   )
r-   r   r   r   r
   r*   send_preparer   r   r   )r:   rT   r   s      r<   r   zBaseCursor._send_prepare4  s    ::JJ  ..55LL--KK %	 JJ  --44T:LL%%dEKKU[[%Qr>   c          	        || j                   }n|rt        nt        }| j                  j                  rf| j                  j                  j
                  j                  t        | j                  j                  ||j                  |j                  |             y | j                  j                  ||j                  |j                  |       y )N)r   r   )r/   r   r.   r-   r   r   r   r
   r*   send_query_preparedr   r   )r:   rT   r   r   r   s        r<   r   zBaseCursor._send_query_preparedB  s     >++C"&C::JJ  ..55LL44JJ"%++"% LL,,cjj3 - r>   c                B   | 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                  j                          d}n&	 t        j                  |      j                   }d| d}t        j                  d	|       # t"        $ r | d}Y .w xY w)
Nr   zno result availabler   r   z (command status: )z
 - unknownz (result status: z)the last operation didn't produce records)rK   r   r   rB   r   rS   r`   r   r   r   r   r   rz   r{   r   rR   rT   r   )r:   rd   rS   detailstatus_names        r<   _check_result_for_fetchz"BaseCursor._check_result_for_fetchY  s   ;;""#9::}}$$$$%:;;jj FY.J{"%%cDNNCC''##$677!!-c.@.@.G.G.I-J!L8"$--"7"<"<K -[M;$$;F8D  " 8%+HJ"7K8s   D DDc                    |j                   }|t        k(  s	|t        k(  ry|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 )rS   r   r   r   r   r   r   r   r   rR   rT   r   s      r<   r   zBaseCursor._check_copy_results  sq     W( 2{"%%ft~~FF$$//1}}V/D/I/I.JL r>   c                    | j                         }|dk(  r| j                  |z   }n|dk(  r|}nt        d| d      d|cxk  r|j                  k  st	        d       t	        d      || _        y )Nrelativeabsolutez
bad mode: z'. It should be 'relative' or 'absolute'r   zposition out of bound)r   rC   r   r   
IndexError)r:   valuemoderd   newposs        r<   _scrollzBaseCursor._scroll  s}    **,:YY&FZFz$/VWXXF(S[[(455 )455	r>   c                6    | j                  d       d| _        y)z3Non-blocking part of closing. Common to sync/async.F)rH   TN)r7   r5   rZ   s    r<   _closezBaseCursor._close  s     	&r>   c                .    | j                   j                  S r\   )r*   r   rZ   s    r<   r   zBaseCursor._encoding  s    ||%%%r>   )r;   r   )T)rH   boolreturnNone)r	  str)r	  r   )r	  zadapt.AdaptersMap)r	  r  )r	  zlist[Column] | None)r	  int)r	  
int | None)rn   zSequence[Any]r	  r
  r\   )rr   r   rs   r  r	  r
  )r	  bool | None)r	  z
str | None)r	  r(   )
r   r   r   Params | Noner   r  r   r  r	  PQGen[None])r   r   r   zIterable[Params]r   r  r	  r  )r   r   r   r  r   r  r	  r  )r   r   r   r  r	  ztuple[Prepare, bytes])
r   r   r   r  r   r  rr   r  r	  r  )r   r  r	  zPQGen[PGresult | None])r   zQuery | Noner	  r  )r   r   r   r  r	  r  )r   r   r   r  r   r  r	  r
  )r   r   r   r  r	  r   )r   zlist[PGresult]r	  r
  )r   r$   r	  r   )re   r  r/   zpq.Format | Noner	  r
  )r   z#ReferenceType[BaseCursor[Any, Any]]r   r  r   ztype[Loader]r	  r
  )rT   bytesr   r   r	  r
  )rT   r  r   r   r   r  r	  r
  )r	  r$   )r   r$   r	  r
  )r  r  r  r  r	  r
  )r	  r
  )/__name__rP   rQ   split	__slots____annotations__r   r+   r=   r7   rX   propertyr;   r2   rK   rf   rh   rk   ro   rt   rx   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rw   r   classmethodr8   r   r   r   r   r  r  r   rm   r>   r<   r&   r&   0   sC   
 EG  
O&3J#3

	>        *   - - - -" !%A
  $"AA A
 A A 
A$!A!A(8!AEI!A	!AFAA(8AEIA	A>  $"*#*# 	*#
 *# 
*#Z :>6 6+66	6 !%&
 #&& &
 & & 
&,/6-  9=##(5#	#>  %"+1+1 	+1
 +1 
+1\ 59$1	,&"04:" 7>AKW	 "R IM -:E	.4
 & &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$   Formatr.   r   rR   r   r   r`   r   r   r   r   ra   rb   r   TransactionStatusACTIVEr&   rm   r>   r<   <module>r,     s-   # 8 8 &  .    = =    ' 8  , , ' (	yy~~			mm'']]%%
MM##	==!!
--

MM##	mm''}}))}}))==11 				$	$g	&,- g	&r>   