Ë
    Ûqjà  ã                  ó&  — U d Z ddlmZ ddlmZ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 dd	lmZmZ dd
lmZ e	rddlmZ ddlmZ dZded<   ej6                  j8                  Zej6                  j:                  Z G d„ de«      Z G d„ d«      Zy)z!
Support for prepared statements
é    )Úannotations)ÚIntEnumÚauto)ÚAnyÚSequenceÚTYPE_CHECKING)ÚOrderedDicté   )Úpq)ÚPQGen)ÚDequeÚ	TypeAlias)ÚPostgresQuery)ÚPGresult)ÚBaseConnectionztuple[bytes, tuple[int, ...]]r   ÚKeyc                  ó6   — e Zd Z e«       Z e«       Z e«       Zy)ÚPrepareN)Ú__name__Ú
__module__Ú__qualname__r   ÚNOÚYESÚSHOULD© ó    úS/var/www/html/kelly-backend/venv/lib/python3.12/site-packages/psycopg/_preparing.pyr   r      s   „ Ù	‹€BÙ
‹&€CÙ‹V�Fr   r   c                  óÀ   — e Zd ZU dZded<   dZded<   dd„Zedd„«       Z	 d	 	 	 	 	 dd
„Z	dd„Z
edd„«       Zdd„Z	 	 	 	 	 	 	 	 dd„Z	 	 	 	 	 	 	 	 	 	 dd„Zdd„Zdd„Zy	)ÚPrepareManageré   z
int | NoneÚprepare_thresholdéd   ÚintÚprepared_maxc                ór   — t        «       | _        t        «       | _        d| _        t	        d   «       | _        y )Nr   zbytes | None)r	   Ú_countsÚ_namesÚ_prepared_idxr   Ú	_to_flush©Úselfs    r   Ú__init__zPrepareManager.__init__)   s/   € ä.9«mˆŒô 0;«}ˆŒð ˆÔä˜~Ñ.Ó0ˆ�r   c                ó2   — | j                   | j                  fS ©N)ÚqueryÚtypes)r/   s    r   ÚkeyzPrepareManager.key5   s   € à—‘˜UŸ[™[Ð)Ð)r   Nc                óÌ  — |du s| j                   €t        j                  dfS | j                  |«      }| j                  j                  |«      }|rt        j                  |fS | j                  j                  |d«      }|| j                   k\  s|rDd| j                  › �j                  «       }| xj                  dz  c_        t        j                  |fS t        j                  dfS )zP
        Check if a query is prepared, tell back whether to prepare it.
        Fr   r   Ú_pg3_r
   )r!   r   r   r1   r'   Úgetr   r&   r(   Úencoder   )r+   r/   Úpreparer1   ÚnameÚcounts         r   r4   zPrepareManager.get9   sÈ   € ð �eÑ˜t×5Ñ5Ð=ä—:‘:˜s�?Ð"à�h‰h�u‹oˆØ�{‰{�‰˜sÓ#ˆÙä—;‘; Ð$Ð$à—‘× Ñ   aÓ(ˆØ�D×*Ñ*Ò*©gà˜4×-Ñ-Ð.Ð/×6Ñ6Ó8ˆDØ×Ò !Ñ#ÕÜ—>‘> 4Ð'Ð'ô —:‘:˜s�?Ð"r   c                óæ   — | j                   s|t        j                  k(  rR|D ]M  }|j                  t        k7  rŒ|j
                  }|sŒ&|j                  d«      s|dk(  sŒ=| j                  «       c S  y)zÏCheck if we need to discard our entire state: it should happen on
        rollback or on dropping objects, because the same object may get
        recreated and postgres would fail internal lookups.
        s   DROP s   ROLLBACKF)r'   r   r   ÚstatusÚ
COMMAND_OKÚcommand_statusÚ
startswithÚclear)r+   ÚprepÚresultsÚresultÚcmdstats        r   Ú_should_discardzPrepareManager._should_discardS   sb   € ð
 �;Š;˜$¤'§.¡.Ò0Û!�Ø—=‘=¤JÒ.ØØ ×/Ñ/�Ú × 2Ñ 2°8Ô <ÀÈ;Ó@VØŸ:™:›<Ò'ð "ð r   c                ól   — t        | «      dk7  ry| d   j                  }t        |cxk7  r	t        k7  ry yy)zCReturn False if 'results' are invalid for prepared statement cache.r
   Fr   T)Úlenr:   r;   Ú	TUPLES_OK)r@   r:   s     r   Ú_check_resultszPrepareManager._check_resultsa   s<   € ô ˆw‹<˜1Òàà˜‘×"Ñ"ˆÜ˜Ô,¤9Ò,àð -ñ r   c                ó:  — t        | j                  «      | j                  kD  r| j                  j                  d¬«       t        | j                  «      | j                  kD  r;| j                  j                  d¬«      d   }| j
                  j                  |«       yy)z Evict an old value from the cache.

        If it was prepared, deallocate it. Do it only once: if the cache was
        resized, deallocate gradually.
        F)Úlastr
   N)rE   r&   r$   Úpopitemr'   r)   Úappend)r+   r7   s     r   Ú_rotatezPrepareManager._rotateo   sz   € ô ˆt�|‰|Ó˜t×0Ñ0Ò0Ø�L‰L× Ñ  eÐ Ô,äˆt�{‰{Ó˜d×/Ñ/Ò/Ø—;‘;×&Ñ&¨EÐ&Ó2°1Ñ5ˆDØ�N‰N×!Ñ! $Õ'ð 0r   c                óÚ  — | j                   €y| j                  |«      }|| j                  v rb|t        j                  u r| j                  |= || j
                  |<   y| j                  |xx   dz  cc<   | j                  j                  |«       y|| j
                  v r| j
                  j                  |«       y|t        j                  u r|| j
                  |<   |S d| j                  |<   |S )zÒHandle 'query' for possible addition to the cache.

        If a new entry has been added, return its key. Return None otherwise
        (meaning the query is already in cache or cache is not enabled).
        Nr
   )r!   r1   r&   r   r   r'   Úmove_to_end)r+   r/   r?   r7   r1   s        r   Úmaybe_add_to_cachez!PrepareManager.maybe_add_to_cache|   sÛ   € ð ×!Ñ!Ð)Øà�h‰h�u‹oˆØ�$—,‘,ÑØ”w—~‘~Ñ%Ø—L‘L Ð%Ø#'�—‘˜CÑ ð ð —‘˜SÓ! QÑ&Ó!Ø—‘×(Ñ(¨Ô-Øà�D—K‘KÑØ�K‰K×#Ñ# CÔ(Øð ”w—~‘~Ñ%Ø#'�—‘˜CÑ ð ˆJð %&�—‘˜SÑ!ØˆJr   c                óÞ   — | j                  ||«      ry| j                  |«      s9| j                  j                  |d«       | j                  j                  |d«       y| j                  «        y)z’Validate cached entry with 'key' by checking query 'results'.

        Possibly record a command to perform maintenance on database side.
        N)rC   rG   r'   Úpopr&   rL   )r+   r1   r?   r7   r@   s        r   ÚvalidatezPrepareManager.validate�   sT   € ð ×Ñ  gÔ.Øà×"Ñ" 7Ô+Ø�K‰K�O‰O˜C Ô&Ø�L‰L×Ñ˜S $Õ'à�L‰L�Nr   c                óð   — | j                   j                  «        | j                  rP| j                  j                  «        | j                  j                  «        | j                  j	                  d«       yy)z—Clear the cache of the maintenance commands.

        Clear the internal state and prepare a command to clear the state of
        the server.
        NTF)r&   r>   r'   r)   rK   r*   s    r   r>   zPrepareManager.clear±   sS   € ð 	�‰×ÑÔØ�;Š;Ø�K‰K×ÑÔØ�N‰N× Ñ Ô"Ø�N‰N×!Ñ! $Ô'Øàr   c              #  óª   K  — | j                   rA| j                   j                  «       }|j                  |«      E d{  –—†  | j                   rŒ@yy7 Œ­w)zÑ
        Generator to send the commands to perform periodic maintenance

        Deallocate unneeded command in the server, or flush the prepared
        statements server state entirely if necessary.
        N)r)   ÚpopleftÚ_deallocate)r+   Úconnr7   s      r   Úmaintain_genzPrepareManager.maintain_genÀ   sA   è ø€ ð �nŠnØ—>‘>×)Ñ)Ó+ˆDØ×'Ñ'¨Ó-×-Ð-ð �n�nà-ús   ‚;A½A¾AÁA)ÚreturnÚNone)r/   r   rY   r   r.   )r/   r   r6   zbool | NonerY   ztuple[Prepare, bytes])r?   r   r@   úSequence[PGresult]rY   Úbool)r@   r[   rY   r\   )r/   r   r?   r   r7   ÚbytesrY   z
Key | None)
r1   r   r?   r   r7   r]   r@   r[   rY   rZ   )rY   r\   )rW   zBaseConnection[Any]rY   zPQGen[None])r   r   r   r!   Ú__annotations__r$   r,   Ústaticmethodr1   r4   rC   rG   rL   rO   rR   r>   rX   r   r   r   r   r   "   sØ   … à$%Ð�zÓ%ð €L�#Óó
1ð ò*ó ð*ð <@ð#Ø"ð#Ø-8ð#à	ó#ó4ð òó ðó(ðØ"ðØ*1ðØ9>ðà	óðBàðð ðð ð	ð
 $ðð 
óó(ô	.r   r   N) Ú__doc__Ú
__future__r   Úenumr   r   Útypingr   r   r   Úcollectionsr	   Ú r   Úabcr   Ú_compatr   r   Ú_queriesr   Úpq.abcr   Ú_connection_baser   r   r^   Ú
ExecStatusr;   rF   r   r   r   r   r   Ú<module>rl      sp   ðòõ #ç ß /Ñ /Ý #å Ý ß %Ý #áÝ Ý0à0€€YÓ 0à�]‰]×%Ñ%€
Ø�M‰M×#Ñ#€	ôˆgô ÷g.ò g.r   