
    R
h4                       U d Z ddlmZ ddlZddlmZ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mZmZ dd
lmZ ddlmZ ddlmZmZ ddlmZ erddlmZ dZ dZ! G d de
          Z" G d d          Z#ee$e%gdf         Z&de'd<   d+dZ( ee(          Z) G d de#          Z*ee$e%gd f         Z+de'd!<   d,d"Z, ee,          Z- ej.        d#          Z/	 d-d.d)Z0ej1        ej2        ej3        d*Z4dS )/z&
Utility module to manipulate queries
    )annotationsN)TYPE_CHECKINGAnyCallableMappingMatch
NamedTupleSequence)	lru_cache   )errors)pq)BufferParamsQuery)
Composable)PyFormat)	TypeAlias	TypeGuard)conn_encoding)Transformeri   2   c                  .    e Zd ZU ded<   ded<   ded<   dS )	QueryPartbytesprez	int | stritemr   formatN)__name__
__module____qualname____annotations__     [/var/www/html/01_SiteInternet/03_Maps/venv/lib/python3.11/site-packages/psycopg/_queries.pyr   r      s0         JJJOOOr$   r   c                      e Zd ZdZd                                ZddZddZddZe	dd            Z
e	dd            ZdS )PostgresQueryzO
    Helper to convert a Python query and parameters into Postgres format.
    z^
        query params types formats
        _tx _want_formats _parts _encoding _order
        transformerr   c                    || _         d | _        d| _        d | _        d | _        t          |j                  | _        |  d| _        d | _	        d S )Nr#   r$   )
_txparamstypes_want_formatsformatsr   
connection	_encodingquery_order)selfr(   s     r%   __init__zPostgresQuery.__init__,   sR    6:&(
 5937&{'=>>$
(,r$   r1   r   varsParams | NonereturnNonec                   t          |t                    r|                    | j                  }n2t          |t                    r|                    | j                  }n|}|jt          |          t          k    r t          |          t          k    rt          }nt          } ||| j                  \  | _        | _        | _        | _        n|| _        dx| _        | _        |                     |           dS z
        Set up the query and parameters to convert.

        The results of this function can be obtained accessing the object
        attributes (`query`, `params`, `types`, `formats`).
        N)
isinstancestrencoder0   r   as_bytesr*   lenMAX_CACHED_STATEMENT_LENGTHMAX_CACHED_STATEMENT_PARAMS	_query2pg_query2pg_nocacher1   r-   r2   _partsdumpr3   r1   r5   bqueryfs        r%   convertzPostgresQuery.convert<   s     eS!! 	\\$.11FFz** 	^^DH--FFF F:::II!<<<(%IJJ JFTZ+T[$++  DJ/33D		$r$   c                   |u|                      | j        || j                  }| j        J | j                            || j                  | _        | j        j        pd| _        | j        j        | _        dS d| _        d| _        d| _        dS )
        Process a new set of variables on the query processed by `convert()`.

        This method updates `params` and `types`.
        Nr#   )	validate_and_reorder_paramsrD   r2   r-   r*   dump_sequencer+   r,   r.   r3   r5   r+   s      r%   rE   zPostgresQuery.dumpa   s     55dk4UUF%111(009KLLDK-2DJ8+DLLLDKDJDLLLr$   r   TypeGuard[Sequence[Any]]c                F   t          |           }|t          u s	|t          u rd}n||t          u rd}npt	          | t
                    rt	          | t          t          f          sd}n<t	          | t                    rd}n$t          dt          |           j
                   |S )NTFz8query parameters should be a sequence or a mapping, got )typelisttupledictr;   r
   r   r<   r   	TypeErrorr   )r5   tsequences      r%   is_params_sequencez PostgresQuery.is_params_sequencer   s     JJ99U

HH$YYHHh'' 	
4%0N0N 	HHg&& 	HH.T

+. .   r$   partslist[QueryPart]orderlist[str] | NoneSequence[Any]c           
        t                                         rt                    t          |           dz
  k    r8t          j        dt          |           dz
   dt                     d          r/t          | d         j        t                    st          d          S rCt          |           dk    r0t          | d         d         t                    st          d          	 |rfd|D             S d	S # t          $ rF t          j        d
d                    t          fd|pd	D                                            w xY w)zO
        Verify the compatibility between a query and a set of params.
        r   zthe query has z placeholders but z parameters were passedr   z2named placeholders require a mapping of parametersz=positional placeholders (%s) require a sequence of parametersc                     g | ]
}|         S r#   r#   ).0r   r5   s     r%   
<listcomp>z=PostgresQuery.validate_and_reorder_params.<locals>.<listcomp>   s    9994DJ999r$   r#   zquery parameter missing: z, c              3  $   K   | ]
}|v|V  d S )Nr#   )r`   ir5   s     r%   	<genexpr>z<PostgresQuery.validate_and_reorder_params.<locals>.<genexpr>   s'      (Q(Qq1D======(Q(Qr$   )r'   rX   r?   eProgrammingErrorr;   r   intrU   r<   KeyErrorjoinsorted)rY   r5   r[   s    ` r%   rL   z)PostgresQuery.validate_and_reorder_params   s    ++D11 	4yyCJJN**(;SZZ!^ ; ;D		; ; ;    VJuQx}c:: V TUUUK  E

Qz%(1+s/K/KS  
 9999599992   (U		&(Q(Q(Q(QEKR(Q(Q(Q"Q"QRRU U  s   0D AEN)r(   r   r1   r   r5   r6   r7   r8   r5   r6   r7   r8   )r5   r   r7   rO   )rY   rZ   r5   r   r[   r\   r7   r]   )r   r    r!   __doc__split	__slots__r4   rI   rE   staticmethodrX   rL   r#   r$   r%   r'   r'   "   s          EGG 
- - - - # # # #J       "    \$       \     r$   r'   ?tuple[bytes, list[PyFormat], list[str] | None, list[QueryPart]]r   	_Query2Pgr1   r   encodingr<   r7   c                b   t          | |          }d}g }g }t          |d         j        t                    r|dd         D ]r}t          |j        t                    sJ |                    |j                   |                    d|j        dz   z             |                    |j                   snBt          |d         j        t                    r!i }g }|dd         D ]}t          |j        t                    sJ |                    |j                   |j        |vrpdt          |          dz   z  }||j        f||j        <   |                    |j                   |                    |           |                    |j                   ||j                 d         |j        k    rt          j
        d|j         d          |                    ||j                 d                    |                    |d         j                   d                    |          |||fS )	a  
    Convert Python query and params into something Postgres understands.

    - Convert Python placeholders (``%s``, ``%(name)s``) into Postgres
      format (``$1``, ``$2``)
    - placeholders can be %s, %t, or %b (auto, text or binary)
    - return ``query`` (bytes), ``formats`` (list of formats) ``order``
      (sequence of names used in the query, in the position they appear)
      ``parts`` (splits of queries and placeholders).
    Nr   s   $%dr   zplaceholder 'z' cannot have different formatsr$   )_split_queryr;   r   rg   appendr   r   r<   r?   re   rf   ri   )	r1   rs   rY   r[   chunksr.   partseenphs	            r%   rC   rC      s!    ))E"EFG%(-%% 2#2#J 	( 	(Ddi-----MM$(###MM&DIM2333NN4;''''		( 
E!HM3	'	' 224#2#J 	2 	2Ddi-----MM$(###y$$s4yy1}-#%t{"3TYTY'''b!!!t{++++	?1%44,R	RRR   d49oa01111 MM%)-   88FWeU22r$   c                  &    e Zd ZdZdZdd	Zdd
ZdS )PostgresClientQueryzI
    PostgresQuery subclass merging query and arguments client-side.
    )templater1   r   r5   r6   r7   r8   c                   t          |t                    r|                    | j                  }n2t          |t                    r|                    | j                  }n|}|dt          |          t          k    r t          |          t          k    rt          }nt          } ||| j                  \  | _        | _        | _        n|| _        d| _        |                     |           dS r:   )r;   r<   r=   r0   r   r>   r*   r?   r@   rA   _query2pg_client_query2pg_client_nocacher~   r2   rD   r1   rE   rF   s        r%   rI   zPostgresClientQuery.convert   s     eS!! 	\\$.11FFz** 	^^DH--FFFF:::II!<<<%5,89&$.8Q8Q5T]DKDJDK		$r$   c                     |W                       j        | j                  }t           fd|D                        _         j         j        z   _        dS d _        dS )rK   Nc              3  T   K   | ]"}|j                             |          ndV  #d S )Ns   NULL)r*   
as_literal)r`   pr3   s     r%   rd   z+PostgresClientQuery.dump.<locals>.<genexpr>  sM          IJ!-##A&&&W           r$   )rL   rD   r2   rS   r+   r~   r1   rN   s   `  r%   rE   zPostgresClientQuery.dump  s~     55dk4UUF        NT       DK 4DJJJDKKKr$   Nrk   rl   )r   r    r!   rm   ro   rI   rE   r#   r$   r%   r}   r}      sM          I   <     r$   r}   /tuple[bytes, list[str] | None, list[QueryPart]]_Query2PgClientc                v   t          | |d          }d}g }t          |d         j        t                    rY|dd         D ]M}t          |j        t                    sJ |                    |j                   |                    d           Nnt          |d         j        t                    ri }g }|dd         D ]}t          |j        t                    sJ |                    |j                   |j        |vrCd}||j        f||j        <   |                    |j                   |                    |           |                    ||j                 d                    |                    |j                   |                    |d         j                   d                    |          ||fS )zX
    Convert Python query and params into a template to perform client-side binding
    F)collapse_double_percentNr   ru   s   %sr$   )	rv   r;   r   rg   rw   r   r<   r   ri   )r1   rs   rY   r[   rx   ry   rz   r{   s           r%   r   r   #  s    %HHHE"EF%(-%% (#2#J 	! 	!Ddi-----MM$(###MM%    	!
 
E!HM3	'	' (24#2#J 
	( 
	(Ddi-----MM$(###y$$#%t{"3TYTY'''b!!!!d49oa0111TY'''' MM%)-   88FUE))r$   s"  (?x)
        %                       # a literal %
        (?:
            (?:
                \( ([^)]+) \)   # or a name in (braces)
                .               # followed by a format
            )
            |
            (?:.)               # or any char, really
        )
        asciiTr   boolrZ   c                   g }d}d }t                               |           D ]W}| ||                    d          d                  }|                    ||f           |                    d          d         }X|r |                    | |d          d f           n|                    | d f           g }d}d }	|t	          |          k     r||         \  }}|0|                    t          |dt          j                             n|                    d          }
|
dk    r&|rd}
||dz            \  }}||
z   |z   |f||dz   <   ||= |
dk    rdt          j
        d| |                    d          d         d                                          d                             |           d          |
dk    rt          j
        d	          |
d
d          dvr>t          j
        d|                    d                              |           d          |                    d          r(|                    d                              |          n|}|	st          |          }	n%|	t          |          urt          j
        d          t          |
d
d                   }|                    t          |||                     |dz  }|t	          |          k     |S )Nr   r   s   %%   %s   %(zincomplete placeholder: ''s   % zfincomplete placeholder: '%'; if you want to use '%' as an operator you can double it up, i.e. use '%%'ru   s   sbtz8only '%s', '%b', '%t' are allowed as placeholders, got 'z1positional and named placeholders cannot be mixed)_re_placeholderfinditerspanrw   r?   r   r   AUTOgroupre   rf   rn   decoderQ   
_ph_to_fmt)r1   rs   r   rY   curmr   rvrc   phtyper{   pre1m1r   r   s                  r%   rv   rv   Z  s    68E
C 	A%%e,,  C!&&))A,&'c1XffQiil $eCDDk4())))eT]###	B 	
AF
c%jj..qQ9IIiQ66777WWQZZ;;& QU|HD""HtOR0E!a%La;;$I166!99Q<==)//11!4;;HEEI I I   5[[$@   WF""$4WWQZZ&&x004 4 4   /0ggajj?qwwqzz  ***a 	$ZZFF4::%%$C   BrssG$
		)Cv..///	Q_ c%jj..b Ir$   )   s   t   b)r1   r   rs   r<   r7   rq   )r1   r   rs   r<   r7   r   )r   T)r1   r   rs   r<   r   r   r7   rZ   )5rm   
__future__r   retypingr   r   r   r   r   r	   r
   	functoolsr    r   re   r   abcr   r   r   sqlr   _enumsr   _compatr   r   
_encodingsr   r   r@   rA   r   r'   r   r<   rr   r"   rC   rB   r}   r   r   r   compiler   rv   r   TEXTBINARYr   r#   r$   r%   <module>r      s     # " " " " " 				 U U U U U U U U U U U U U U U U U U                   & & & & & & & & & &             ) ) ) ) ) ) ) ) % % % % % % !      "       
   D D D D D D D DP  
CLSS	    
/3 /3 /3 /3n I'((	2 2 2 2 2- 2 2 2j &
CLCC    
"* "* "* "*J 9566  "*
   LPG G G G GV -
-
/ 


r$   