Ë
    Ûqjö4  ã                  ó  — 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	 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 ddlmZmZ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jb                  ejd                  ejf                  d!œZ4y)&z&
Utility module to manipulate queries
é    )ÚannotationsN)ÚAnyÚCallableÚMappingÚMatchÚ
NamedTuple)ÚSequenceÚTYPE_CHECKING)Ú	lru_cacheé   )Úpq)Úerrors)Ú
Composable)ÚBufferÚQueryÚParams)ÚPyFormat)Ú	TypeAliasÚ	TypeGuard)Úconn_encoding)ÚTransformeri   é2   c                  ó,   — e Zd ZU ded<   ded<   ded<   y)Ú	QueryPartÚbytesÚprez	int | strÚitemr   ÚformatN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© ó    úQ/var/www/html/kelly-backend/venv/lib/python3.12/site-packages/psycopg/_queries.pyr   r      s   … Ø	ƒJØ
ƒOØÔr$   r   c                  ó|   — e Zd ZdZdj	                  «       Zd	d„Zd
d„Zdd„Ze	dd„«       Z
e		 	 	 	 	 	 	 	 dd„«       Zy)ÚPostgresQueryzO
    Helper to convert a Python query and parameters into Postgres format.
    z^
        query params types formats
        _tx _want_formats _parts _encoding _order
        c                óž   — || _         d | _        d| _        d | _        d | _        t        |j                  «      | _        |  d| _        d | _	        y )Nr#   r$   )
Ú_txÚparamsÚtypesÚ_want_formatsÚformatsr   Ú
connectionÚ	_encodingÚqueryÚ_order)ÚselfÚtransformers     r%   Ú__init__zPostgresQuery.__init__-   sK   € ØˆŒà6:ˆŒà&(ˆŒ
ð 59ˆÔØ37ˆŒä& {×'=Ñ'=Ó>ˆŒÙØˆŒ
Ø(,ˆ�r$   c                óÄ  — t        |t        «      r|j                  | j                  «      }n.t        |t        «      r|j                  | j                  «      }n|}|�^t        |«      t        k  rt        |«      t        k  rt        }nt        } ||| j                  «      \  | _        | _        | _        | _        n|| _        dx| _        | _        | j!                  |«       y©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Úencoder/   r   Úas_bytesr)   ÚlenÚMAX_CACHED_STATEMENT_LENGTHÚMAX_CACHED_STATEMENT_PARAMSÚ	_query2pgÚ_query2pg_nocacher0   r,   r1   Ú_partsÚdump©r2   r0   ÚvarsÚbqueryÚfs        r%   ÚconvertzPostgresQuery.convert=   s¶   € ô �eœSÔ!Ø—\‘\ $§.¡.Ó1‰FÜ˜œzÔ*Ø—^‘^ D§H¡HÓ-‰FàˆFàÐô �F“Ô:Ò:Ü˜“IÔ!<Ò<ä(‘ä%�áIJØ˜Ÿ™óJÑFˆTŒZ˜Ô+¨T¬[¸$½+ð  ˆDŒJØ/3Ð3ˆDÔ ¤à�	‰	�$�r$   c                óh  — |�›| j                  | j                  || j                  «      }| j                  €J ‚| j                  j                  || j                  «      | _        | j                  j                  xs d| _        | j                  j                  | _        yd| _        d| _        d| _        y)úŠ
        Process a new set of variables on the query processed by `convert()`.

        This method updates `params` and `types`.
        Nr#   )	Úvalidate_and_reorder_paramsr@   r1   r,   r)   Údump_sequencer*   r+   r-   ©r2   rC   r*   s      r%   rA   zPostgresQuery.dumpb   s�   € ð ÐØ×5Ñ5°d·k±kÀ4ÈÏÉÓUˆFØ×%Ñ%Ð1Ð1Ð1ØŸ(™(×0Ñ0°¸×9KÑ9KÓLˆDŒKØŸ™Ÿ™Ò-¨2ˆDŒJØŸ8™8×+Ñ+ˆD�LàˆDŒKØˆDŒJØˆD�Lr$   c                ó  — t        | «      }|t        u s|t        u rd}|S |t        u rd}|S t	        | t
        «      rt	        | t        t        f«      sd}|S t	        | t        «      rd}|S t        dt        | «      j                  › �«      ‚)NTFz8query parameters should be a sequence or a mapping, got )ÚtypeÚlistÚtupleÚdictr7   r	   r   r8   r   Ú	TypeErrorr   )rC   ÚtÚsequences      r%   Úis_params_sequencez PostgresQuery.is_params_sequences   s¡   € ô �‹JˆØ”‰9˜œU™
ØˆHð ˆð ”$‰YØˆHð ˆô ˜œhÔ'´
¸4Ä%ÌÀÔ0NØˆHð ˆô ˜œgÔ&ØˆHð ˆô	 ðÜ˜T›
×+Ñ+Ð,ð.óð r$   c                óJ  ‡— t         j                  ‰«      rwt        ‰«      t        | «      dz
  k7  r1t        j                  dt        | «      dz
  › dt        ‰«      › d�«      ‚‰r(t        | d   j                  t        «      st        d«      ‚‰S ‰r/t        | «      dkD  r!t        | d   d   t        «      st        d«      ‚	 |r|D �cg c]  }‰|   ‘Œ	 c}S yc c}w # t        $ r> t        j                  d	d
j                  t        ˆfd„|xs 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 parametersr#   zquery parameter missing: z, c              3  ó,   •K  — | ]  }|‰vsŒ|–— Œ y ­w)Nr#   )Ú.0ÚirC   s     €r%   Ú	<genexpr>z<PostgresQuery.validate_and_reorder_params.<locals>.<genexpr>¦   s   øè ø€ Ð(Q±K¨qÀ1ÈDÂ=¬±Kùs   ƒ	�)r'   rT   r;   ÚeÚProgrammingErrorr7   r   ÚintrQ   r8   ÚKeyErrorÚjoinÚsorted)ÚpartsrC   Úorderr   s    `  r%   rI   z)PostgresQuery.validate_and_reorder_params†   s/  ø€ ô ×+Ñ+¨DÔ1Ü�4‹yœC ›J¨™NÒ*Ü×(Ñ(Ø$¤S¨£Z°!¡^Ð$4ð 5Ü˜D›	�{Ð"9ð;óð ñ œJ u¨Q¡x§}¡}´cÔ:ÜÐ TÓUÐUØˆKñ œ˜E›
 Qš¬z¸%À¹(À1¹+ÄsÔ/KÜØSóð ð
ÙÙ38Ó9±5¨4˜D ›J°5Ñ9Ð9àùò :øô ò Ü×(Ñ(ðØŸ	™	¤&Ó(Q°E²K¸R°KÓ(QÓ"QÓRÐSðUóð ðús   Ã C ÃCÃC ÃC ÃAD"N)r3   r   ©r0   r   rC   úParams | NoneÚreturnÚNone©rC   rc   rd   re   )rC   r   rd   zTypeGuard[Sequence[Any]])r`   úlist[QueryPart]rC   r   ra   zlist[str] | Nonerd   zSequence[Any])r   r    r!   Ú__doc__ÚsplitÚ	__slots__r4   rF   rA   ÚstaticmethodrT   rI   r#   r$   r%   r'   r'   #   sr   „ ñð÷ ‰E‹Gð ó
-ó #óJ ð" òó ðð$ ð Øð Ø&,ð Ø5Eð à	ò ó ñ r$   r'   ú?tuple[bytes, list[PyFormat], list[str] | None, list[QueryPart]]r   Ú	_Query2Pgc                óX  — t        | |«      }d}g }g }t        |d   j                  t        «      r|dd D ]u  }t        |j                  t        «      sJ ‚|j	                  |j
                  «       |j	                  d|j                  dz   z  «       |j	                  |j                  «       Œw �nJt        |d   j                  t        «      �r,i }g }|dd D �]  }t        |j                  t        «      sJ ‚|j	                  |j
                  «       |j                  |vrtdt        |«      dz   z  }||j                  f||j                  <   |j	                  |j                  «       |j	                  |«       |j	                  |j                  «       Œ½||j                     d   |j                  k7  r#t        j                  d|j                  › d�«      ‚|j	                  ||j                     d   «       �Œ" |j	                  |d   j
                  «       dj                  |«      |||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_queryr7   r   r\   Úappendr   r   r8   r;   rZ   r[   r^   )	r0   Úencodingr`   ra   Úchunksr-   ÚpartÚseenÚphs	            r%   r?   r?   °   sÆ  € ô ˜ Ó)€EØ"€EØ€FØ€Gä�%˜‘(—-‘-¤Ô%Ø˜#˜2“JˆDÜ˜dŸi™i¬Ô-Ð-Ð-Ø�M‰M˜$Ÿ(™(Ô#Ø�M‰M˜& D§I¡I°¡MÑ2Ô3Ø�N‰N˜4Ÿ;™;Õ'ò	 ô 
�E˜!‘H—M‘M¤3Õ	'Ø24ˆØˆØ˜#˜2”JˆDÜ˜dŸi™i¬Ô-Ð-Ð-Ø�M‰M˜$Ÿ(™(Ô#Ø�y‰y Ñ$Øœs 4›y¨1™}Ñ-�Ø#% t§{¡{Ð"3��T—Y‘Y‘Ø—‘˜TŸY™YÔ'Ø—‘˜bÔ!Ø—‘˜tŸ{™{Õ+à˜Ÿ	™	‘? 1Ñ%¨¯©Ò4Ü×,Ñ,Ø'¨¯	©	 {Ð2QÐRóð ð —‘˜d 4§9¡9™o¨aÑ0Ö1ð ð" ‡M�M�%˜‘)—-‘-Ô à�8‰8�FÓ˜W e¨UÐ2Ð2r$   c                  ó$   — e Zd ZdZdZdd„Zdd„Zy)ÚPostgresClientQueryzI
    PostgresQuery subclass merging query and arguments client-side.
    )Útemplatec                óª  — t        |t        «      r|j                  | j                  «      }n.t        |t        «      r|j                  | j                  «      }n|}|�Xt        |«      t        k  rt        |«      t        k  rt        }nt        } ||| j                  «      \  | _        | _        | _        n|| _        d| _        | j!                  |«       yr6   )r7   r8   r9   r/   r   r:   r)   r;   r<   r=   Ú_query2pg_clientÚ_query2pg_client_nocachery   r1   r@   r0   rA   rB   s        r%   rF   zPostgresClientQuery.convertñ   s¡   € ô �eœSÔ!Ø—\‘\ $§.¡.Ó1‰FÜ˜œzÔ*Ø—^‘^ D§H¡HÓ-‰FàˆFàÐä�F“Ô:Ò:Ü˜“IÔ!<Ò<ä%5‘ä,�á89¸&À$Ç.Á.Ó8QÑ5ˆTŒ]˜DœK¨­àˆDŒJØˆDŒKà�	‰	�$�r$   c                óÖ   ‡ — |�_‰ j                  ‰ j                  |‰ j                  «      }t        ˆ fd„|D «       «      ‰ _        ‰ j
                  ‰ j                  z  ‰ _        yd‰ _        y)rH   Nc              3  ó\   •K  — | ]#  }|�‰j                   j                  |«      nd–— Œ% y ­w)Ns   NULL)r)   Ú
as_literal)rW   Úpr2   s     €r%   rY   z+PostgresClientQuery.dump.<locals>.<genexpr>  s-   øè ø€ ð  ÙNTÈ¨!¨-�—‘×#Ñ# AÔ&¸WÓDÉfùs   ƒ),)rI   r@   r1   rO   r*   ry   r0   rK   s   `  r%   rA   zPostgresClientQuery.dump  s]   ø€ ð ÐØ×5Ñ5°d·k±kÀ4ÈÏÉÓUˆFÜó  ÙNTó ó ˆDŒKð Ÿ™¨¯©Ñ4ˆD�JàˆD�Kr$   Nrb   rf   )r   r    r!   rh   rj   rF   rA   r#   r$   r%   rx   rx   ê   s   „ ñð €Ióô<r$   rx   ú/tuple[bytes, list[str] | None, list[QueryPart]]Ú_Query2PgClientc                óV  — t        | |d¬«      }d}g }t        |d   j                  t        «      rS|dd D ]J  }t        |j                  t        «      sJ ‚|j	                  |j
                  «       |j	                  d«       ŒL nöt        |d   j                  t        «      rÙi }g }|dd D ]Í  }t        |j                  t        «      sJ ‚|j	                  |j
                  «       |j                  |vrJd}||j                  f||j                  <   |j	                  |j                  «       |j	                  |«       Œ’|j	                  ||j                     d   «       |j	                  |j                  «       ŒÏ |j	                  |d   j
                  «       dj                  |«      ||fS )zX
    Convert Python query and params into a template to perform client-side binding
    F)Úcollapse_double_percentNr   ro   s   %sr$   )	rp   r7   r   r\   rq   r   r8   r   r^   )r0   rr   r`   ra   rs   rt   ru   rv   s           r%   r|   r|   $  sX  € ô ˜ À%ÔH€EØ"€EØ€Fä�%˜‘(—-‘-¤Ô%Ø˜#˜2“JˆDÜ˜dŸi™i¬Ô-Ð-Ð-Ø�M‰M˜$Ÿ(™(Ô#Ø�M‰M˜%Õ ñ ô
 
�E˜!‘H—M‘M¤3Ô	'Ø24ˆØˆØ˜#˜2“JˆDÜ˜dŸi™i¬Ô-Ð-Ð-Ø�M‰M˜$Ÿ(™(Ô#Ø�y‰y Ñ$Ø�Ø#% t§{¡{Ð"3��T—Y‘Y‘Ø—‘˜TŸY™YÔ'Ø—‘˜bÕ!à—‘˜d 4§9¡9™o¨aÑ0Ô1Ø—‘˜TŸY™YÕ'ð ð ‡M�M�%˜‘)—-‘-Ô à�8‰8�FÓ˜U EÐ)Ð)r$   s"  (?x)
        %                       # a literal %
        (?:
            (?:
                \( ([^)]+) \)   # or a name in (braces)
                .               # followed by a format
            )
            |
            (?:.)               # or any char, really
        )
        c                óº  — g }d}d }t         j                  | «      D ]@  }| ||j                  d«      d    }|j                  ||f«       |j                  d«      d   }ŒB |r|j                  | |d  d f«       n|j                  | d f«       g }d}d }	|t	        |«      k  �r»||   \  }}|€-|j                  t        |dt        j                  «      «       	 |S |j                  d«      }
|
dk(  r#|rd}
||dz      \  }}||
z   |z   |f||dz   <   ||= Œ|
dk(  rNt        j                  d| |j                  d«      d   d  j                  «       d   j                  |«      › d�«      ‚|
dk(  rt        j                  d	«      ‚|
d
d  dvr7t        j                  d|j                  d«      j                  |«      › d�«      ‚|j                  d«      r |j                  d«      j                  |«      n|}|	st        |«      }	n"|	t        |«      urt        j                  d«      ‚t        |
d
d     }|j                  t        |||«      «       |dz  }|t	        |«      k  r�Œ»|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 '%%'ro   s   sbtz8only '%s', '%b', '%t' are allowed as placeholders, got 'z1positional and named placeholders cannot be mixed)Ú_re_placeholderÚfinditerÚspanrq   r;   r   r   ÚAUTOÚgrouprZ   r[   ri   ÚdecoderM   Ú
_ph_to_fmt)r0   rr   r„   r`   ÚcurÚmr   ÚrvrX   Úphtyperv   Úpre1Úm1r   r   s                  r%   rp   rp   [  s’  € ð 68€EØ
€Cð 	€AÜ×%Ñ% eÖ,ˆØ�C˜!Ÿ&™& ›) A™,Ð'ˆØ�‰�c˜1�XÔØ�f‰f�Q‹i˜‰l‰ð -ñ 	Ø�‰�e˜C˜D�k 4Ð(Õ)à�‰�e˜T�]Ô#à	€Bð 	
€AØ€FØ
Œc�%‹j‹.Ø�q‘‰ˆˆQØˆ9à�I‰I”i  Q¬¯©Ó6Ô7ØðX €IðU �W‰W�Q‹ZˆØ�Š;á&Ø�Ø˜Q ™U‘|‰HˆD�"Ø "™H t™O¨RÐ0ˆE�!�a‘%‰LØ�a�Øà�Š;Ü×$Ñ$ðØ˜1Ÿ6™6 !›9 Q™<˜=Ð)×/Ñ/Ó1°!Ñ4×;Ñ;¸HÓEÐFÀaðIóð ð �5Š[ä×$Ñ$ð@óð ð ��ˆW˜FÑ"Ü×$Ñ$ðØ—W‘W˜Q“Z×&Ñ& xÓ0Ð1°ð4óð ð /0¯g©g°a¬jˆq�w‰w�q‹z× Ñ  Ô*¸aˆáÜ˜$“Z‰FØœ4 ›:Ñ%Ü×$Ñ$ØCóð ô ˜B˜r˜s˜GÑ$ˆØ
�	‰	”)˜C  vÓ.Ô/Ø	ˆQ‰ˆð_ Œc�%‹jŒ.ðb €Ir$   )ó   só   tó   b)r0   r   rr   r8   rd   rl   )r0   r   rr   r8   rd   r�   )ÚasciiT)r0   r   rr   r8   r„   Úboolrd   rg   )5rh   Ú
__future__r   ÚreÚtypingr   r   r   r   r   r	   r
   Ú	functoolsr   Ú r   r   rZ   Úsqlr   Úabcr   r   r   Ú_enumsr   Ú_compatr   r   Ú
_encodingsr   r   r<   r=   r   r'   r   r8   rm   r"   r?   r>   rx   r‚   r|   r{   Úcompilerˆ   rp   r‹   ÚTEXTÚBINARYrŽ   r#   r$   r%   Ú<module>r§      sl  ðòõ #ã 	ß <Õ <ß *Ý å Ý Ý ß &Ñ &Ý ß )Ý %áÝ à"Ð Ø Ð ô�
ô ÷Dñ DðP  Ø
ˆC€LÐSÐSñ€	ˆ9ó ð
/3Øð/3Øð/3àDó/3ñn Ð'Ó(€	ô2˜-ô 2ðj &Ø
ˆC€LÐCÐCñ€�ó ð
"*Øð"*Øð"*à4ó"*ñJ Ð5Ó6Ð ð �"—*‘*ð
ó€ð  LPðGØðGØðGØDHðGàóGðV �-‰-Ø
�-‰-Ø
�/‰/ñ�
r$   