§
    YŠtj  ã                  óž   — d 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
mZ ddlmZ erdd	lmZ  G d
„ d¦  «        Z G d„ d¦  «        ZdS )z9
psycopg connection pool base class and functionalities.
é    )Úannotations)Ú	monotonic©Úrandom)ÚTYPE_CHECKINGÚAny)ÚCounterÚdequeé   )Ú
PoolClosed)ÚBaseConnectionc                  ó
  — e Zd ZU dZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZded<   d;d"„Zd<d%„Zed=d&„¦   «         Zed=d'„¦   «         Zed>d(„¦   «         Zd?d*„Zd@d,„Zd@d-„ZdAd0„ZdBd2„ZdBd3„ZdBd4„Z e!dCd8„¦   «         Z"dAd9„Z#d:S )DÚBasePoolr   Úpool_minÚpool_maxÚ	pool_sizeÚpool_availableÚrequests_waitingÚrequests_numÚrequests_queuedÚrequests_wait_msÚrequests_errorsÚusage_msÚreturns_badÚconnections_numÚconnections_msÚconnections_errorsÚconnections_lostz
deque[Any]Ú_poolÚmin_sizeÚintÚmax_sizeú
int | NoneÚnameú
str | NoneÚclose_returnsÚboolÚtimeoutÚfloatÚmax_waitingÚmax_lifetimeÚmax_idleÚreconnect_timeoutÚnum_workersc       
        óö  — |                       ||¦  «        \  }}|s t          j        dz   x}t          _        d|› �}|
dk     rt          d¦  «        ‚|| _        || _        || _        || _        || _        || _	        |	| _
        || _        || _        |
| _        || _        t          ¦   «         | _        t#          t$                   ¦   «         | _        d| _        || _        d| _        d| _        d| _        d| _        d S )Nr   zpool-znum_workers must be at least 1ç        FT)Ú_check_sizer   Ú	_num_poolÚ
ValueErrorr$   r&   Ú	_min_sizeÚ	_max_sizer(   r*   r-   r+   r,   r.   Ú_nconnsr
   r   r	   ÚstrÚ_statsÚ_drained_atÚ_nconns_minÚ_growingÚ_openedÚ_closedÚ_open_implicit)Úselfr    r"   r$   r&   r(   r*   r+   r,   r-   r.   Únums               úO/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/psycopg_pool/base.pyÚ__init__zBasePool.__init__+   s  € ð "×-Ò-¨h¸ÑAÔAÑˆ�(àð 	!Ý'/Ô'9¸AÑ'=Ð=ˆC•(Ô$Ø ˜3�=�=ˆDà˜Š?ˆ?ÝÐ=Ñ>Ô>Ð>àˆŒ	Ø*ˆÔØ!ˆŒØ!ˆŒØˆŒØ&ˆÔØ!2ˆÔØ(ˆÔØ ˆŒØ&ˆÔàˆŒÝ‘W”WˆŒ
Ý�c”l‘n”nˆŒØˆÔð $ˆÔð ˆŒàˆŒØˆŒØ#ˆÔÐÐó    Úreturnr7   c           
     ón   — d| j         j        › d| j         j        › d| j        ›dt	          | ¦  «        d›d�	S )Nú<ú.ú z at 0xÚxú>)Ú	__class__Ú
__module__Ú__name__r$   Úid©r?   s    rA   Ú__repr__zBasePool.__repr__c   sX   € ð1�”Ô)ð 1ð 1¨D¬NÔ,Cð 1ð 1Ø”	ð1ð 1Ý#% d¡8¤8Ð0ð1ð 1ð 1ð	
rC   c                ó   — | j         S ©N)r4   rO   s    rA   r    zBasePool.min_sizei   ó
   € àŒ~ÐrC   c                ó   — | j         S rR   )r5   rO   s    rA   r"   zBasePool.max_sizem   rS   rC   c                ó   — | j         S )z`!True` if the pool is closed.)r=   rO   s    rA   ÚclosedzBasePool.closedq   s   € ð Œ|ÐrC   útuple[int, int]c                ó¤   — |€|}|dk     rt          d¦  «        ‚||k     rt          d¦  «        ‚||cxk    rdk    rn nt          d¦  «        ‚||fS )Nr   zmin_size cannot be negativez/max_size must be greater or equal than min_sizez0if min_size is 0 max_size must be greater than 0)r3   )r?   r    r"   s      rA   r1   zBasePool._check_sizev   s{   € ØÐØˆHà�aŠ<ˆ<ÝÐ:Ñ;Ô;Ð;Ø�hÒÐÝÐNÑOÔOÐOØ�xÐ$Ð$Ò$Ð$ 1Ò$Ð$Ð$Ð$Ð$ÝÐOÑPÔPÐPà˜Ð!Ð!rC   ÚNonec                óD   — | j         r| j        rt          d¦  «        ‚d S d S )Nz8pool has already been opened/closed and cannot be reused)r=   r<   r   rO   s    rA   Ú_check_openzBasePool._check_openƒ   s>   € ØŒ<ð 	Y˜DœLð 	YÝÐWÑXÔXÐXð	Yð 	Yð 	Yð 	YrC   c                ó‚   — | j         r7| j        rt          d| j        ›d�¦  «        ‚t          d| j        ›d�¦  «        ‚d S )Nz	the pool z is already closedz is not open yet)r=   r<   r   r$   rO   s    rA   Ú_check_open_getconnzBasePool._check_open_getconn‡   s\   € ØŒ<ð 	LØŒ|ð LÝ Ð!L¨T¬YÐ!LÐ!LÐ!LÑMÔMÐMå Ð!J¨T¬YÐ!JÐ!JÐ!JÑKÔKÐKð		Lð 	LrC   ÚconnúBaseConnection[Any]c                óˆ   — t          |dd ¦  «        x}| u rd S |rd|j        ›�}nd}t          d| j        ›d|› d|› �¦  «        ‚)Nr   zit comes from pool zit doesn't come from any poolz can't return connection to pool z, z: )Úgetattrr$   r3   )r?   r^   ÚpoolÚmsgs       rA   Ú_check_pool_putconnzBasePool._check_pool_putconnŽ   sp   € Ý˜D '¨4Ñ0Ô0Ð0ˆD°TÐ9Ð9ØˆFàð 	2Ø5¨¬	Ð5Ð5ˆCˆCà1ˆCÝØK¨t¬yÐKÐK¸cÐKÐKÀTÐKÐKñ
ô 
ð 	
rC   údict[str, int]c                ó|   — t          | j        ¦  «        }|                     |                      ¦   «         ¦  «         |S )z<
        Return current stats about the pool usage.
        )Údictr8   ÚupdateÚ_get_measures)r?   Úrvs     rA   Ú	get_statszBasePool.get_statsš   s6   € õ �$”+ÑÔˆØ
�	Š	�$×$Ò$Ñ&Ô&Ñ'Ô'Ð'Øˆ	rC   c                ó¨   — | j         t          ¦   «         c}| _         t          |¦  «        }|                     |                      ¦   «         ¦  «         |S )zy
        Return current stats about the pool usage.

        After the call, all the counters are reset to zero.
        )r8   r	   rg   rh   ri   )r?   Ústatsrj   s      rA   Ú	pop_statszBasePool.pop_stats¢   sF   € ð "œ[­'©)¬)ÐˆˆtŒ{Ý�%‰[Œ[ˆØ
�	Š	�$×$Ò$Ñ&Ô&Ñ'Ô'Ð'Øˆ	rC   c           
     ó€   — | j         | j        | j        | j        | j        | j        | j        t          | j        ¦  «        iS )zG
        Return immediate measures of the pool (not counters).
        )	Ú	_POOL_MINr4   Ú	_POOL_MAXr5   Ú
_POOL_SIZEr6   Ú_POOL_AVAILABLEÚlenr   rO   s    rA   ri   zBasePool._get_measures­   s9   € ð
 ŒN˜DœNØŒN˜DœNØŒO˜Tœ\ØÔ ¥# d¤j¡/¤/ð	
ð 	
rC   ÚvalueÚmin_pcÚmax_pcc                ó<   — |d||z
  t          ¦   «         z  z   |z   z  S )zV
        Add a random value to *value* between *min_pc* and *max_pc* percent.
        ç      ð?r   )Úclsru   rv   rw   s       rA   Ú_jitterzBasePool._jitter¸   s&   € ð
 ˜ ¨¡µ6±8´8Ñ;Ñ<¸vÑEÑFÐFrC   c                óx   — t          ¦   «         x|_        }||                      | j        dd¦  «        z   |_        dS )zeSet an expiry date on a connection.

        Add some randomness to avoid mass reconnection.
        gš™™™™™©¿r0   N)r   Ú_created_atr{   r+   Ú
_expire_at)r?   r^   Úts      rA   Ú_set_connection_expiry_datez$BasePool._set_connection_expiry_date¿   s8   € õ
  )™{œ{Ð*ˆÔ˜1Ø˜dŸlšl¨4Ô+<¸eÀSÑIÔIÑIˆŒˆˆrC   N)r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   r!   r+   r)   r,   r)   r-   r)   r.   r!   )rD   r7   )rD   r!   )rD   r'   )r    r!   r"   r#   rD   rW   )rD   rY   )r^   r_   rD   rY   )rD   re   )ru   r)   rv   r)   rw   r)   rD   r)   )$rM   rL   Ú__qualname__r2   rp   rq   rr   rs   Ú_REQUESTS_WAITINGÚ_REQUESTS_NUMÚ_REQUESTS_QUEUEDÚ_REQUESTS_WAIT_MSÚ_REQUESTS_ERRORSÚ	_USAGE_MSÚ_RETURNS_BADÚ_CONNECTIONS_NUMÚ_CONNECTIONS_MSÚ_CONNECTIONS_ERRORSÚ_CONNECTIONS_LOSTÚ__annotations__rB   rP   Úpropertyr    r"   rV   r1   r[   r]   rd   rk   rn   ri   Úclassmethodr{   r€   © rC   rA   r   r      sÖ  € € € € € € à€Ið €IØ€IØ€JØ&€OØ*ÐØ"€MØ(ÐØ*ÐØ(ÐØ€IØ €LØ(ÐØ&€OØ.ÐØ*ÐàÐÐÑð6$ð 6$ð 6$ð 6$ðp
ð 
ð 
ð 
ð ðð ð ñ „Xðð ðð ð ñ „Xðð ðð ð ñ „Xðð"ð "ð "ð "ðYð Yð Yð YðLð Lð Lð Lð

ð 

ð 

ð 

ðð ð ð ð	ð 	ð 	ð 	ð	
ð 	
ð 	
ð 	
ð ðGð Gð Gñ „[ðGðJð Jð Jð Jð Jð JrC   r   c                  ó6   — e Zd ZdZdZdZdZdd„Zdd„Zdd„Z	dS )ÚAttemptWithBackoffzR
    Keep the state of a repeated operation attempt with exponential backoff.
    ry   gš™™™™™¹?g       @r(   r)   c               ó0   — || _         d| _        d| _        d S )Nr0   )r(   ÚdelayÚ
give_up_at)r?   r(   s     rA   rB   zAttemptWithBackoff.__init__Ñ   s   € ØˆŒØˆŒ
ØˆŒˆˆrC   ÚnowrD   rY   c                ó,  — | j         dk    rA|| j        z   | _        t                               | j        | j         | j        ¦  «        | _         n| xj         | j        z  c_         | j         |z   | j        k    rt          d| j        |z
  ¦  «        | _         dS dS )z7Calculate how long to wait for a new connection attemptr0   N)	r”   r(   r•   r   r{   ÚINITIAL_DELAYÚDELAY_JITTERÚDELAY_BACKOFFÚmax©r?   r–   s     rA   Úupdate_delayzAttemptWithBackoff.update_delayÖ   s–   € àŒ:˜ÒÐØ! D¤LÑ0ˆDŒOÝ!×)Ò)ØÔ" TÔ%6Ð$6¸Ô8Iñô ˆDŒJˆJð ˆJŒJ˜$Ô,Ñ,ˆJŒJàŒ:˜Ñ˜dœoÒ-Ð-Ý˜S $¤/°CÑ"7Ñ8Ô8ˆDŒJˆJˆJð .Ð-rC   r'   c                ó.   — | j         dk    o
|| j         k    S )z8Return True if we are tired of trying this attempt. Meh.r0   )r•   rœ   s     rA   Útime_to_give_upz"AttemptWithBackoff.time_to_give_upã   s   € àŒ Ò$Ð?¨°´Ò)?Ð?rC   N)r(   r)   )r–   r)   rD   rY   )r–   r)   rD   r'   )
rM   rL   r�   Ú__doc__r˜   r™   rš   rB   r�   rŸ   r�   rC   rA   r’   r’   È   sq   € € € € € ðð ð €MØ€LØ€Mðð ð ð ð
9ð 9ð 9ð 9ð@ð @ð @ð @ð @ð @rC   r’   N)r    Ú
__future__r   Útimer   r   Útypingr   r   Úcollectionsr	   r
   Úerrorsr   Úpsycopg._connection_baser   r   r’   r�   rC   rA   ú<module>r§      s  ððð ð #Ð "Ð "Ð "Ð "Ð "à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ø &Ð &Ð &Ð &Ð &Ð &Ð &Ð &à Ð Ð Ð Ð Ð àð 8Ø7Ð7Ð7Ð7Ð7Ð7ðqJð qJð qJð qJð qJñ qJô qJð qJðh@ð @ð @ð @ð @ñ @ô @ð @ð @ð @rC   