§
    YŠtj’  ã                  óh  — d Z ddlmZ ddlZddlZddlmZ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 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 m!Z!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,m-Z-m.Z. ddl/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5 ddl/m6Z6m7Z7m8Z8 e9Z: ej;        d¦  «        Z< G d„ dee         e%¦  «        Z= G d„ dee         ¦  «        Z> G d„ de¦  «        Z? G d„ de?¦  «        Z@ G d „ d!e?¦  «        ZA G d"„ d#e?¦  «        ZB G d$„ d%e?¦  «        ZC G d&„ d'e?¦  «        ZDdS )(z0
Psycopg connection pool module (sync version).
é    )ÚannotationsN)ÚABCÚabstractmethod)Ú	monotonic)ÚTracebackType)ÚAnyÚGenericÚcast)Úref)Úcontextmanager)Údeque)ÚIterator)Ú
Connection)Úerrors)ÚTransactionStatusé   )ÚCTÚConnectFailedCBÚConnectionCBÚConninfoParamÚKwargsParam)ÚAttemptWithBackoffÚBasePool)Ú	Scheduler)Ú
PoolClosedÚPoolTimeoutÚTooManyRequests)ÚPSYCOPG_VERSIONÚPoolConnectionÚSelf)Ú	ConditionÚEventÚLockÚQueueÚWorkerÚcurrent_thread_name)ÚgatherÚsleepÚspawnzpsycopg.poolc                  óø  ‡ — e Zd ZU ded<   	 dq eee         e¦  «        dddddddddddd	d
ddddœdrˆ fd+„Zdsd.„Z	dsˆ fd/„Z
dtdud0„Zedvdwd3„¦   «         Zdvdxd5„Zdyd7„Zdzd8„Zd{d:„Zd|d<„Zdsd=„Zd|d>„Zdsd?„Zd}dA„Zd~dB„Zdd€dD„ZdsdE„ZdsdF„ZdsdG„Zd�dudI„Zd‚dK„ZdƒdM„Zd„dT„Zdvd…dU„Z dsdV„Z!e"d|dW„¦   «         Z#dsdX„Z$d†d[„Z%d‡d]„Z&e'dˆd`„¦   «         Z(dvdxda„Z)d‰dc„Z*dŠde„Z+	 d‹dŒdi„Z,d}dj„Z-d|dk„Z.d|dl„Z/d|dm„Z0dsdn„Z1d�ˆ fdp„Z2ˆ xZ3S )ŽÚConnectionPoolz	deque[CT]Ú_poolÚ Né   Fç      >@r   g      ¬@g     À‚@g     Àr@é   )Úconnection_classÚkwargsÚmin_sizeÚmax_sizeÚopenÚ	configureÚcheckÚresetÚnameÚclose_returnsÚtimeoutÚmax_waitingÚmax_lifetimeÚmax_idleÚreconnect_timeoutÚreconnect_failedÚnum_workersÚconninfor   r1   útype[CT]r2   úKwargsParam | Noner3   Úintr4   ú
int | Noner5   úbool | Noner6   úConnectionCB[CT] | Noner7   r8   r9   ú
str | Noner:   Úboolr;   Úfloatr<   r=   r>   r?   r@   úConnectFailedCB | NonerA   c               óJ  •— |rIt           dk     r>|t          u r&t          t          t                   t
          ¦  «        }nt          d¦  «        ‚|| _        || _        || _	        || _
        || _        |	| _        || _        |  |  |  t          t          t                            ¦   «         | _        d | _        d | _        g | _        t)          ¦   «                              |||
|||||||¬¦
  «
         t-          ¦   «         | _        |€	dx}| _        |r|                      ¦   «          d S d S )N)r0   r0   zÓUsing 'close_returns=True' and a non-standard 'connection_class' requires psycopg 3.3 or newer. Please check the docs at https://www.psycopg.org/psycopg3/docs/advanced/pool.html#pool-sqlalchemy for a workaround.)
r3   r4   r9   r:   r;   r<   r=   r>   r?   rA   T)r   r   r
   Útyper   r   Ú	TypeErrorrB   r2   r1   Ú_checkÚ
_configureÚ_resetÚ_reconnect_failedr   ÚWaitingClientÚ_waitingÚ_pool_full_eventÚ_sched_runnerÚ_workersÚsuperÚ__init__r#   Ú_lockÚ_open_implicitÚ_open)ÚselfrB   r1   r2   r3   r4   r5   r6   r7   r8   r9   r:   r;   r<   r=   r>   r?   r@   rA   Ú	__class__s                      €úO/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/psycopg_pool/pool.pyrZ   zConnectionPool.__init__+   sK  ø€ ð, ð 	�_¨vÒ5Ð5Ø¥:Ð-Ð-Ý#'­­R¬µ.Ñ#AÔ#AÐ Ð åð jñô ð ð !ˆŒØˆŒØ 0ˆÔØˆŒØ#ˆŒØˆŒà!1ˆÔð 	ÐØÐØÐ+å�m­BÔ/Ô0Ñ2Ô2ˆŒð /3ˆÔà,0ˆÔØ&(ˆŒå‰Œ×ÒØØØØ'ØØ#Ø%ØØ/Ø#ð 	ñ 	
ô 	
ð 	
õ ‘V”VˆŒ
àˆ<Ø)-Ð-ˆD�4Ô&àð 	Ø�JŠJ‰LŒLˆLˆLˆLð	ð 	ó    ÚreturnÚNonec                ór   — t          | dd¦  «        rd S |                      ¦   «         }d}t          |d|dœŽ d S )NÚ_closedTzNyou can try to call 'close()' explicitly or to use the pool as context managerç      @)r;   Útimeout_hint)ÚgetattrÚ_signal_stop_workerr'   )r^   ÚworkersÚhints      r`   Ú__del__zConnectionPool.__del__v   sN   € õ �4˜ DÑ)Ô)ð 	ØˆFà×*Ò*Ñ,Ô,ˆØ_ˆÝ� °4Ð8Ð8Ð8Ð8Ð8Ð8ra   c                óò   •— t          ¦   «                              ¦   «          | j        rNd| _        t          j        dt          | ¦  «        j        › dt          | ¦  «        j        › d�t          ¦  «         d S d S )NFzthe default for the z” 'open' parameter will become 'False' in a future release. Please use open={True|False} explicitly, or use the pool as context manager using: `with z(...) as pool: ...`)rY   Ú_check_open_getconnr\   ÚwarningsÚwarnrN   Ú__name__ÚDeprecationWarning)r^   r_   s    €r`   rn   z"ConnectionPool._check_open_getconn€   s©   ø€ Ý‰Œ×#Ò#Ñ%Ô%Ð%àÔð 	Ø"'ˆDÔåŒMð {¥t¨D¡z¤zÔ':ð  {ð  {õ  SWð  X\ñ  S]ô  S]ô  Sfð  {ð  {ð  {Ý"ñô ð ð ð ð	ð 	ra   c                óZ  — |                       ¦   «          | j        5  | j        rJ ‚t          | j        ¦  «        | j        k    r	 ddd¦  «         dS t          ¦   «         | _        ddd¦  «         n# 1 swxY w Y   t                               d| j	        ¦  «         | j         
                    |¦  «        s'|                      ¦   «          t          d|› d�¦  «        ‚| j        5  | j        sJ ‚d| _        ddd¦  «         n# 1 swxY w Y   t                               d| j	        ¦  «         dS )a-  
        Wait for the pool to be full (with `min_size` connections) after creation.

        Close the pool, and raise `PoolTimeout`, if not ready within *timeout*
        sec.

        Calling this method is not mandatory: you can try and use the pool
        immediately after its creation. The first client will be served as soon
        as a connection is ready. You can use this method if you prefer your
        program to terminate in case the environment is not configured
        properly, rather than trying to stay up the hardest it can.
        Nz"waiting for pool %r initializationz%pool initialization incomplete after ú seczpool %r is ready to use)rn   r[   rV   Úlenr,   Ú	_min_sizer"   ÚloggerÚinfor9   ÚwaitÚcloser   )r^   r;   s     r`   ry   zConnectionPool.wait‹   s½  € ð 	× Ò Ñ"Ô"Ð"àŒZð 	,ð 	,ØÔ,Ð,Ð,Ð,Ý�4”:‰Œ $¤.Ò0Ð0Øð	,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,õ %*¡G¤GˆDÔ!ð		,ð 	,ð 	,ñ 	,ô 	,ð 	,ð 	,ð 	,ð 	,ð 	,ð 	,øøøð 	,ð 	,ð 	,ð 	,õ 	�ŠÐ8¸$¼)ÑDÔDÐDØÔ$×)Ò)¨'Ñ2Ô2ð 	UØ�JŠJ‰LŒLˆLÝÐSÀgÐSÐSÐSÑTÔTÐTàŒZð 	)ð 	)ØÔ(Ð(Ð(Ð(Ø$(ˆDÔ!ð	)ð 	)ð 	)ñ 	)ô 	)ð 	)ð 	)ð 	)ð 	)ð 	)ð 	)øøøð 	)ð 	)ð 	)ð 	)õ 	�ŠÐ-¨t¬yÑ9Ô9Ð9Ð9Ð9s)   œ(A0ÁA0Á0A4Á7A4Ã#D Ä DÄDúfloat | NoneúIterator[CT]c           
   #  óÚ  K  — |                       |¬¦  «        }	 t          ¦   «         }|5  |V — ddd¦  «         n# 1 swxY w Y   |                      |¦  «         t          ¦   «         }| j        | j        xx         t          d||z
  z  ¦  «        z  cc<   dS # |                      |¦  «         t          ¦   «         }| j        | j        xx         t          d||z
  z  ¦  «        z  cc<   w xY w)a&  Context manager to obtain a connection from the pool.

        Return the connection immediately if available, otherwise wait up to
        *timeout* or `self.timeout` seconds and throw `PoolTimeout` if a
        connection is not available in time.

        Upon context exit, return the connection to the pool. Apply the normal
        :ref:`connection context behaviour <with-connection>` (commit/rollback
        the transaction in case of success/error). If the connection is no more
        in working state, replace it with a new one.
        ©r;   Nç     @�@)Úgetconnr   ÚputconnÚ_statsÚ	_USAGE_MSrE   )r^   r;   ÚconnÚt0Út1s        r`   Ú
connectionzConnectionPool.connection«   s=  è è € ð �|Š| Gˆ|Ñ,Ô,ˆð	CÝ‘”ˆBØð ð Ø�
�
�
ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð �LŠL˜ÑÔÐÝ‘”ˆBØŒK˜œÐ'Ð'Ô'­3¨v¸¸b¹Ñ/AÑ+BÔ+BÑBÐ'Ð'Ñ'Ð'Ð'øð �LŠL˜ÑÔÐÝ‘”ˆBØŒK˜œÐ'Ð'Ô'­3¨v¸¸b¹Ñ/AÑ+BÔ+BÑBÐ'Ð'Ñ'Ð'Ð'Ð'Ð's)   šB ª;¯B »?¿B Á?ÁB ÂAC*r   c                óD  — |€| j         }t          ¦   «         |z   }t                               d| j        ¦  «         | j        | j        xx         dz  cc<   |                      ¦   «          	 |                      |¦  «        S # t          $ r t          d|d›d�¦  «        d‚w xY w)a„  Obtain a connection from the pool.

        You should preferably use `connection()`. Use this function only if
        it is not possible to use the connection as context manager.

        After using this function you *must* call a corresponding `putconn()`:
        failing to do so will deplete the pool. A depleted pool is a sad pool:
        you don't want a depleted pool.
        Nzconnection requested from %rr   ú couldn't get a connection after ú.2frt   )
r;   r   rw   rx   r9   r‚   Ú_REQUESTS_NUMrn   Ú_getconn_with_check_loopr   )r^   r;   Údeadlines      r`   r€   zConnectionPool.getconnÂ   sÄ   € ð ˆ?Ø”lˆGÝ‘;”; Ñ(ˆå�ŠÐ2°D´IÑ>Ô>Ð>ØŒ�DÔ&Ð'Ð'Ô'¨1Ñ,Ð'Ð'Ñ'à× Ò Ñ"Ô"Ð"ð	Ø×0Ò0°Ñ:Ô:Ð:øõ ð 	ð 	ð 	ÝØD°7ÐDÐDÐDÐDñô àðð	øøøs   Á*A? Á? Br�   c                óð  — d }	 |                       |t          ¦   «         z
  ¦  «        }	 |                      |¦  «         t                               d| j        ¦  «         |S # t          $ r |                      |d¬¦  «         Y nw xY wt          ¦   «         }|st          ||z
  ¬¦  «        }n| 	                    |¦  «         | 
                    |¦  «        rt          ¦   «         ‚t          |j        ¦  «         Œô)NTzconnection given by %r©Úfrom_getconnr~   )Ú_getconn_uncheckedr   Ú_check_connectionrw   rx   r9   ÚCLIENT_EXCEPTIONSÚ_putconnr   Úupdate_delayÚtime_to_give_upr   r(   Údelay)r^   r�   Úattemptr„   Únows        r`   rŒ   z'ConnectionPool._getconn_with_check_loopÞ   s
  € Ø-1ˆð	%Ø×*Ò*¨8µi±k´kÑ+AÑBÔBˆDðØ×&Ò& tÑ,Ô,Ð,õ —’Ð4°d´iÑ@Ô@Ð@Ø�øõ	 %ð 7ð 7ð 7Ø—’˜d°�Ñ6Ô6Ð6Ð6Ð6ð7øøøõ ‘+”+ˆCØð *Ý,°XÀ±^ÐDÑDÔD��à×$Ò$ SÑ)Ô)Ð)à×&Ò& sÑ+Ô+ð %Ý!‘m”mÐ#å�g”mÑ$Ô$Ð$ð+	%s   ©A  Á !BÂBc           
     ó*  — | j         5  |                      |¦  «        x}sdt          ¦   «         }t          ¦   «         }| j                             |¦  «         | j        | j        xx         dz  cc<   |                      ¦   «          d d d ¦  «         n# 1 swxY w Y   |sï	 | 	                    |¬¦  «        }nZ# t          $ rM |j        r*|                      t          | |j        d¬¦  «        ¦  «         | j        | j        xx         dz  cc<   ‚ w xY w	 t          ¦   «         }| j        | j        xx         t!          d||z
  z  ¦  «        z  cc<   n@# t          ¦   «         }| j        | j        xx         t!          d||z
  z  ¦  «        z  cc<   w xY w| |_        |S )Nr   r~   Tr�   r   )r[   Ú_get_ready_connectionr   rT   rU   Úappendr‚   Ú_REQUESTS_QUEUEDÚ_maybe_grow_poolry   r“   r„   Úrun_taskÚReturnConnectionÚ_REQUESTS_ERRORSÚ_REQUESTS_WAIT_MSrE   r,   )r^   r;   r„   r…   Úposr†   s         r`   r‘   z!ConnectionPool._getconn_uncheckedø   s  € ð ŒZð 		(ð 		(Ø ×6Ò6°wÑ?Ô?Ð?�Dð (å‘[”[�Ý)6©¬�Ø”×$Ò$ SÑ)Ô)Ð)Ø”˜DÔ1Ð2Ð2Ô2°aÑ7Ð2Ð2Ñ2ð ×%Ò%Ñ'Ô'Ð'ð		(ð 		(ð 		(ñ 		(ô 		(ð 		(ð 		(ð 		(ð 		(ð 		(ð 		(øøøð 		(ð 		(ð 		(ð 		(ð ð 
	Oð	OØ—x’x¨�xÑ0Ô0��øÝ$ð ð ð Ø”8ð WØ—M’MÕ"2°4¸¼ÐPTÐ"UÑ"UÔ"UÑVÔVÐVØ”˜DÔ1Ð2Ð2Ô2°aÑ7Ð2Ð2Ñ2Øð	øøøð õ ‘[”[�Ø”˜DÔ2Ð3Ð3Ô3µs¸6ÀRÈ"ÁWÑ;MÑ7NÔ7NÑNÐ3Ð3Ñ3Ð3øõ ‘[”[�Ø”˜DÔ2Ð3Ð3Ô3µs¸6ÀRÈ"ÁWÑ;MÑ7NÔ7NÑNÐ3Ð3Ñ3Ð3Ð3Ð3Ð3ð
 ˆŒ
Øˆs1   ˆA<BÂBÂBÂB5 Â4E Â5ADÄE Å=F	ú	CT | Nonec                óº  — |�|dk    rt          ¦   «         ‚d}| j        rP| j                             ¦   «         }t          | j        ¦  «        | j        k     rt          | j        ¦  «        | _        nk| j        rdt          | j        ¦  «        | j        k    rG| j        | j        xx         dz  cc<   t          d| j
        ›dt          | j        ¦  «        › d�¦  «        ‚|S )z0Return a connection, if the client deserves one.Ng        r   ú	the pool z has already z requests waiting)r   r,   Úpopleftru   Ú_nconns_minr<   rU   r‚   r¡   r   r9   )r^   r;   r„   s      r`   r›   z$ConnectionPool._get_ready_connection  sá   € àÐ 7¨c¢> >Ý‘-”-ÐàˆØŒ:ð 		à”:×%Ò%Ñ'Ô'ˆDÝ�4”:‰Œ Ô!1Ò1Ð1Ý#& t¤z¡?¤?�Ô øØÔð 	¥# d¤mÑ"4Ô"4¸Ô8HÒ"HÐ"HØŒK˜Ô-Ð.Ð.Ô.°!Ñ3Ð.Ð.Ñ.Ý!Ø[˜DœIÐ[Ð[µc¸$¼-Ñ6HÔ6HÐ[Ð[Ð[ñô ð ð ˆra   r„   c                ó    — | j         sd S 	 |                       |¦  «         d S # t          $ r!}t                               d|¦  «         ‚ d }~ww xY w)Nzconnection failed check: %s)rP   r“   rw   rx   )r^   r„   Úes      r`   r’   z ConnectionPool._check_connection,  se   € ØŒ{ð 	ØˆFð	Ø�KŠK˜ÑÔÐÐÐøÝ ð 	ð 	ð 	Ý�KŠKÐ5°qÑ9Ô9Ð9Øøøøøð	øøøs   ‹" ¢
A¬AÁAc                óú   — | j         | j        k    s| j        rd S | xj         dz  c_         t                               d| j        | j         ¦  «         d| _        |                      t          | d¬¦  «        ¦  «         d S )Nr   úgrowing pool %r to %sT©Úgrowing)Ú_nconnsÚ	_max_sizeÚ_growingrw   rx   r9   rŸ   ÚAddConnection©r^   s    r`   rž   zConnectionPool._maybe_grow_pool5  sv   € ð Œ<˜4œ>Ò)Ð)¨T¬]Ð)ØˆFØˆŒ˜ÑˆŒÝ�ŠÐ+¨T¬Y¸¼ÑEÔEÐEØˆŒØ�Š•m D°$Ð7Ñ7Ô7Ñ8Ô8Ð8Ð8Ð8ra   c                óÌ   — |                       |¦  «         t                               d| j        ¦  «         |                      |¦  «        rdS |                      |d¬¦  «         dS )zÞReturn a connection to the loving hands of its pool.

        Use this function only paired with a `getconn()`. You don't need to use
        it if you use the much more comfortable `connection()` context manager.
        zreturning connection to %rNFr�   )Ú_check_pool_putconnrw   rx   r9   Ú_maybe_close_connectionr”   ©r^   r„   s     r`   r�   zConnectionPool.putconn?  sf   € ð 	× Ò  Ñ&Ô&Ð&å�ŠÐ0°$´)Ñ<Ô<Ð<Ø×'Ò'¨Ñ-Ô-ð 	ØˆFà�Š�d¨ˆÑ/Ô/Ð/Ð/Ð/ra   c                ó<  — | j         5  t          | j        ¦  «        }| j                             ¦   «          t	          ¦   «         | _        ddd¦  «         n# 1 swxY w Y   |D ]9}|                      |¦  «         |                      t          | ¦  «        ¦  «         Œ:dS )ak  
        Remove all the connections from the pool and create new ones.

        If a connection is currently out of the pool it will be closed when
        returned to the pool and replaced with a new one.

        This method is useful to force a connection re-configuration, for
        example when the adapters map changes after the pool was created.
        N)	r[   Úlistr,   Úclearr   Ú_drained_atÚ_close_connectionrŸ   r²   ©r^   Úconnsr„   s      r`   ÚdrainzConnectionPool.drainN  sÜ   € ð ŒZð 	+ð 	+Ý˜œÑ$Ô$ˆEØŒJ×ÒÑÔÐÝ(™{œ{ˆDÔð	+ð 	+ð 	+ñ 	+ô 	+ð 	+ð 	+ð 	+ð 	+ð 	+ð 	+øøøð 	+ð 	+ð 	+ð 	+ð ð 	/ð 	/ˆDØ×"Ò" 4Ñ(Ô(Ð(Ø�MŠM�-¨Ñ-Ô-Ñ.Ô.Ð.Ð.ð	/ð 	/s   ˆAAÁAÁAr�   c                ó�   — | j         r'|                      t          | ||¬¦  «        ¦  «         d S |                      ||¬¦  «         d S ©Nr�   )rR   rŸ   r    Ú_return_connection©r^   r„   r�   s      r`   r”   zConnectionPool._putconnb  sT   € àŒ;ð 	EØ�MŠMÕ*¨4°ÀLÐQÑQÔQÑRÔRÐRÐRÐRà×#Ò# D°|Ð#ÑDÔDÐDÐDÐDra   c                óB   — | j         sdS |                      |¦  «         dS )zgClose a returned connection if necessary.

        Return `!True if the connection was closed.
        FT)re   r¼   r·   s     r`   r¶   z&ConnectionPool._maybe_close_connectioni  s,   € ð Œ|ð 	Ø�5à×Ò˜tÑ$Ô$Ð$Øˆtra   ry   c                ó    — | j         5  |                      ¦   «          ddd¦  «         n# 1 swxY w Y   |r|                      |¬¦  «         dS dS )a`  Open the pool by starting connecting and and accepting clients.

        If *wait* is `!False`, return immediately and let the background worker
        fill the pool if `min_size` > 0. Otherwise wait up to *timeout* seconds
        for the requested number of connections to be ready (see `wait()` for
        details).

        It is safe to call `!open()` again on a pool already open (because the
        method was already called, or because the pool context was entered, or
        because the pool was initialized with *open* = `!True`) but you cannot
        currently re-open a closed pool.
        Nr~   )r[   r]   ry   )r^   ry   r;   s      r`   r5   zConnectionPool.openv  sœ   € ð ŒZð 	ð 	Ø�JŠJ‰LŒLˆLð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð ð 	'Ø�IŠI˜gˆIÑ&Ô&Ð&Ð&Ð&ð	'ð 	's   ˆ)©-°-c                óø   — | j         sd S |                      ¦   «          t          ¦   «         | _        t	          ¦   «         | _        d| _         d| _        |                      ¦   «          |                      ¦   «          d S )NFT)	re   Ú_check_openr$   Ú_tasksr   Ú_schedÚ_openedÚ_start_workersÚ_start_initial_tasksr³   s    r`   r]   zConnectionPool._openŠ  ss   € ØŒ|ð 	ØˆFà×ÒÑÔÐõ ‘g”gˆŒÝ‘k”kˆŒàˆŒØˆŒà×ÒÑÔÐØ×!Ò!Ñ#Ô#Ð#Ð#Ð#ra   c                ó  — t          | j        j        | j        › d�¬¦  «        | _        | j        rJ ‚t          | j        ¦  «        D ]C}t          | j        | j	        f| j        › d|› �¬¦  «        }| j         
                    |¦  «         ŒDd S )Nz
-scheduler)r9   z-worker-)Úargsr9   )r)   rÉ   Úrunr9   rW   rX   ÚrangerA   ÚworkerrÈ   rœ   )r^   ÚiÚts      r`   rË   zConnectionPool._start_workers›  sœ   € Ý" 4¤;¤?¸D¼IÐ9QÐ9QÐ9QÐRÑRÔRˆÔØ”=Ð Ð Ð Ý�tÔ'Ñ(Ô(ð 	$ð 	$ˆAÝ�d”k¨¬¨ÀÄ	Ð=VÐ=VÐSTÐ=VÐ=VÐWÑWÔWˆAØŒM× Ò  Ñ#Ô#Ð#Ð#ð	$ð 	$ra   c                óä   — t          | j        ¦  «        D ]$}|                      t          | ¦  «        ¦  «         Œ%|                      t	          | t          | ¦  «        | j        ¦  «        ¦  «         d S ©N)rÐ   r¯   rŸ   r²   ÚScheduleÚ
ShrinkPoolr>   )r^   rÒ   s     r`   rÌ   z#ConnectionPool._start_initial_tasks¢  sh   € å�t”|Ñ$Ô$ð 	/ð 	/ˆAØ�MŠM�-¨Ñ-Ô-Ñ.Ô.Ð.Ð.ð 	�Š•h˜t¥Z°Ñ%5Ô%5°t´}ÑEÔEÑFÔFÐFÐFÐFra   rf   c                ó,  — | j         rdS | j        5  d| _         t                               d| j        ¦  «         t          | j        ¦  «        }| j                             ¦   «          t          | j        ¦  «        }| j                             ¦   «          |  	                    ¦   «         }ddd¦  «         n# 1 swxY w Y   t          |d|iŽ |D ]}|                      |¦  «         Œ|D ]-}|                     t          d| j        ›d�¦  «        ¦  «         Œ.dS )aÆ  Close the pool and make it unavailable to new clients.

        All the waiting and future clients will fail to acquire a connection
        with a `PoolClosed` exception. Currently used connections will not be
        closed until returned to the pool.

        Wait *timeout* seconds for threads to terminate their job, if positive.
        If the timeout expires the pool is closed anyway, although it may raise
        some warnings on exit.
        NTzpool %r closedr;   r¦   z
 is closed)re   r[   rw   Údebugr9   r¹   rU   rº   r,   ri   r'   r¼   Úfailr   )r^   r;   ÚwaitingÚconnectionsrj   r„   r£   s          r`   rz   zConnectionPool.close«  sp  € ð Œ<ð 	ØˆFàŒZð 	1ð 	1ØˆDŒLÝ�LŠLÐ)¨4¬9Ñ5Ô5Ð5õ ˜4œ=Ñ)Ô)ˆGØŒM×ÒÑ!Ô!Ð!Ý˜tœzÑ*Ô*ˆKØŒJ×ÒÑÔÐð ×.Ò.Ñ0Ô0ˆGð	1ð 	1ð 	1ñ 	1ô 	1ð 	1ð 	1ð 	1ð 	1ð 	1ð 	1øøøð 	1ð 	1ð 	1ð 	1õ" 	�Ð) Ð)Ð)Ð)ð  ð 	)ð 	)ˆDØ×"Ò" 4Ñ(Ô(Ð(Ð(ð ð 	Fð 	FˆCØ�HŠH•ZÐ C¨D¬IÐ CÐ CÐ CÑDÔDÑEÔEÐEÐEð	Fð 	Fs   ‘BB3Â3B7Â:B7úlist[Worker]c                ó  — | j                              dd ¦  «         | j        d d …         g c}| _        |D ]$}|                      t	          | ¦  «        ¦  «         Œ%| j        r!|                     | j        ¦  «         d | _        |S )Nr   )rÉ   ÚenterrX   rŸ   Ú
StopWorkerrW   rœ   )r^   rj   Ú_s      r`   ri   z"ConnectionPool._signal_stop_workerÔ  sŽ   € àŒ×Ò˜!˜TÑ"Ô"Ð"ð #'¤-°°°Ô"2°BÐˆ�”Øð 	,ð 	,ˆAØ�MŠM�* TÑ*Ô*Ñ+Ô+Ð+Ð+àÔð 	&Ø�NŠN˜4Ô-Ñ.Ô.Ð.Ø!%ˆDÔàˆra   r    c                ó<   — d| _         |                      ¦   «          | S ©NF)r\   r5   r³   s    r`   Ú	__enter__zConnectionPool.__enter__ã  s   € Ø#ˆÔØ�	Š	‰ŒˆØˆra   Úexc_typeútype[BaseException] | NoneÚexc_valúBaseException | NoneÚexc_tbúTracebackType | Nonec                ó.   — |                       ¦   «          d S rÕ   )rz   )r^   rå   rç   ré   s       r`   Ú__exit__zConnectionPool.__exit__è  s   € ð 	�
Š
‰Œˆˆˆra   c                óŽ  — |                       ||¦  «        \  }}t          d|| j        z
  ¦  «        }t                               d| j        ||¦  «         | j        5  || _        || _        | xj        |z  c_        ddd¦  «         n# 1 swxY w Y   t          |¦  «        D ]$}|  
                    t          | ¦  «        ¦  «         Œ%dS )z+Change the size of the pool during runtime.r   z&resizing %r to min_size=%s max_size=%sN)Ú_check_sizeÚmaxrv   rw   rx   r9   r[   r°   r¯   rÐ   rŸ   r²   )r^   r3   r4   ÚngrowrÒ   s        r`   ÚresizezConnectionPool.resizeð  s  € à!×-Ò-¨h¸ÑAÔAÑˆ�(å�A�x $¤.Ñ0Ñ1Ô1ˆå�ŠØ4°d´iÀÈ8ñ	
ô 	
ð 	
ð ŒZð 	"ð 	"Ø%ˆDŒNØ%ˆDŒNØˆLŒL˜EÑ!ˆLŒLð	"ð 	"ð 	"ñ 	"ô 	"ð 	"ð 	"ð 	"ð 	"ð 	"ð 	"øøøð 	"ð 	"ð 	"ð 	"õ
 �u‘”ð 	/ð 	/ˆAØ�MŠM�-¨Ñ-Ô-Ñ.Ô.Ð.Ð.ð	/ð 	/s   ÁBÂB
ÂB
c                óø  — | j         5  t          | j        ¦  «        }| j                             ¦   «          |                      ¦   «          ddd¦  «         n# 1 swxY w Y   |�r|                     ¦   «         }|j        t          ¦   «         k    rSt           	                    d|¦  «         |  
                    |¦  «         |                      t          | ¦  «        ¦  «         Œ�	 |                      |¦  «         |                      |¦  «         ng# t          $ rZ | j        | j        xx         dz  cc<   t                               d|¦  «         |                      t          | ¦  «        ¦  «         Y nw xY w|�°dS dS )z»Verify the state of the connections currently in the pool.

        Test each connection: if it works return it to the pool, otherwise
        dispose of it and create a new one.
        Nz discarding expired connection %sr   z discarding broken connection: %s)r[   r¹   r,   rº   rž   ÚpopÚ
_expire_atr   rw   rx   r¼   rŸ   r²   Úcheck_connectionÚ_add_to_poolr“   r‚   Ú_CONNECTIONS_LOSTÚwarningr½   s      r`   r7   zConnectionPool.check  sË  € ð ŒZð 	$ð 	$Ý˜œÑ$Ô$ˆEØŒJ×ÒÑÔÐð
 ×!Ò!Ñ#Ô#Ð#ð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð ñ 	(Ø—9’9‘;”;ˆDð Œ¥)¡+¤+Ò-Ð-Ý—’Ð>ÀÑEÔEÐEØ×&Ò& tÑ,Ô,Ð,Ø—’�m¨DÑ1Ô1Ñ2Ô2Ð2Øð(Ø×%Ò% dÑ+Ô+Ð+ð ×!Ò! $Ñ'Ô'Ð'Ð'øõ %ð 3ð 3ð 3Ø”˜DÔ2Ð3Ð3Ô3°qÑ8Ð3Ð3Ñ3Ý—’ÐAÀ4ÑHÔHÐHØ—’�m¨DÑ1Ô1Ñ2Ô2Ð2Ð2Ð2ð3øøøð ñ 	(ð 	(ð 	(ð 	(ð 	(s%   ˆAAÁAÁAÃ#D ÄA!E2Å1E2c                ó¢   — | j         r|                      d¦  «         dS d| _         	 |                      d¦  «         d| _         dS # d| _         w xY w)a>  
        A simple check to verify that a connection is still working.

        Return quietly if the connection is still working, otherwise raise
        an exception.

        Used internally by `check()`, but also available for client usage,
        for instance as `!check` callback when a pool is created.
        r-   TFN)Ú
autocommitÚexecute)r„   s    r`   rõ   zConnectionPool.check_connection$  sb   € ð Œ?ð 	(Ø�LŠL˜ÑÔÐÐÐà"ˆDŒOð(Ø—’˜RÑ Ô Ð à"'�”��ø %�”Ð'Ð'Ð'Ð's   §A Á	Ac                óB   — | j         sdS |                       | ¦  «         dS )zV
        Called when reconnection failed for longer than `reconnect_timeout`.
        N)rS   r³   s    r`   r@   zConnectionPool.reconnect_failed8  s.   € ð Ô%ð 	ØˆFà×Ò˜tÑ$Ô$Ð$Ð$Ð$ra   ÚtaskÚMaintenanceTaskc                ó:   — | j                              |¦  «         dS )z#Run a maintenance task in a worker.N)rÈ   Ú
put_nowait)r^   rý   s     r`   rŸ   zConnectionPool.run_taskA  s   € àŒ×Ò˜tÑ$Ô$Ð$Ð$Ð$ra   r—   c                óF   — | j                              ||j        ¦  «         dS )z1Run a maintenance task in a worker in the future.N)rÉ   rß   Útick)r^   rý   r—   s      r`   Úschedule_taskzConnectionPool.schedule_taskE  s"   € àŒ×Ò˜% ¤Ñ+Ô+Ð+Ð+Ð+ra   ÚqúQueue[MaintenanceTask]c                óR  — 	 t          |                     ¦   «         x}t          ¦  «        r)t                               dt          ¦   «         ¦  «         dS 	 |                     ¦   «          n># t          $ r1}t                               d||j	        j
        |¦  «         Y d}~nd}~ww xY wŒ§)zÒRunner to execute pending maintenance task.

        The function is designed to run as a task.

        Block on the queue *q*, run a task received. Finish running if a
        StopWorker is received.
        Tzterminating working task %sNztask run %s failed: %s: %s)Ú
isinstanceÚgetrà   rw   rÙ   r&   rÏ   r“   rø   r_   rq   )Úclsr  rý   Úexs       r`   rÑ   zConnectionPool.workerI  s»   € ð	Ý 1§5¢5¡7¤7˜?˜4­ZÑ8Ô8ð Ý—’Ð:Õ<OÑ<QÔ<QÑRÔRÐRØ�ðØ—’‘
”
�
�
øÝ$ð ð ð Ý—’Ø0°$¸¼Ô8MÈrñô ð ð ð ð ð ð øøøøðøøøð	s   ÁA* Á*
B%Á4'B Â B%c                ó  — | j         | j        xx         dz  cc<   |                      ¦   «         }|                      ¦   «         }|r4|                     ¦   «         }t          t          |¦  «        d¦  «        |d<   t          ¦   «         }	  | j        j	        |fi |¤Ž}t          ¦   «         }| j         | j
        xx         t          d||z
  z  ¦  «        z  cc<   n)# t          $ r | j         | j        xx         dz  cc<   ‚ w xY w| |_        | j        re|                      |¦  «         |j        j        x}t$          j        k    r4t%          |¦  «        j        }t+          j        d|› d| j        › d�¦  «        ‚|                      |¦  «         |S )z0Return a new connection configured for the pool.r   Úconnect_timeoutr   úconnection left in status z by configure function ú: discarded)r‚   Ú_CONNECTIONS_NUMÚ_resolve_conninfoÚ_resolve_kwargsÚcopyrï   Úroundr   r1   ÚconnectÚ_CONNECTIONS_MSrE   r“   Ú_CONNECTIONS_ERRORSr,   rQ   ÚpgconnÚtransaction_statusr   ÚIDLEr9   rª   ÚProgrammingErrorÚ_set_connection_expiry_date)	r^   r;   rB   r2   r…   r„   r†   ÚstatusÚsnames	            r`   Ú_connectzConnectionPool._connect_  s¸  € àŒ�DÔ)Ð*Ð*Ô*¨aÑ/Ð*Ð*Ñ*Ø×)Ò)Ñ+Ô+ˆØ×%Ò%Ñ'Ô'ˆØð 	?Ø—[’[‘]”]ˆFÝ(+­E°'©N¬N¸AÑ(>Ô(>ˆFÐ$Ñ%Ý‰[Œ[ˆð	IØ0�4Ô(Ô0°ÐDÐD¸VÐDÐDˆDõ
 ‘”ˆBØŒK˜Ô,Ð-Ð-Ô-µ°V¸rÀB¹wÑ5GÑ1HÔ1HÑHÐ-Ð-Ñ-Ð-øõ !ð 	ð 	ð 	ØŒK˜Ô0Ð1Ð1Ô1°QÑ6Ð1Ð1Ñ1Øð	øøøð ˆŒ
àŒ?ð 	Ø�OŠO˜DÑ!Ô!Ð!Øœ+Ô8Ð8�Õ=NÔ=SÒSÐSÝ)¨&Ñ1Ô1Ô6�ÝÔ(Øk°ÐkÐkÈtÌÐkÐkÐkñô ð ð
 	×(Ò(¨Ñ.Ô.Ð.Øˆs   ÂC Ã&C=Ústrc                ód   — t          | j        ¦  «        r|                      ¦   «         S | j        pdS )zCResolve conninfo (static string, sync callable, or async callable).r-   )ÚcallablerB   r³   s    r`   r  z ConnectionPool._resolve_conninfo  s/   € å�D”MÑ"Ô"ð 	#Ø—=’=‘?”?Ð"àŒ}Ð" Ð"ra   údict[str, Any]c                ór   — | j         si S t          | j         ¦  «        r|                       ¦   «         S | j         S )z?Resolve kwargs (static dict, sync callable, or async callable).)r2   r!  r³   s    r`   r  zConnectionPool._resolve_kwargs†  s9   € àŒ{ð 	ØˆIå�D”KÑ Ô ð 	!Ø—;’;‘=”=Ð àŒ{Ðra   r˜   úAttemptWithBackoff | Noner®   c                óF  — t          ¦   «         }|st          | j        ¬¦  «        }	 |                      ¦   «         }�n# t          $ rû}t
                               d| j        |¦  «         |                     |¦  «        rzt
                               d| j        | j        ¦  «         | j	        5  | xj
        dz  c_
        |r| j        rd| _        ddd¦  «         n# 1 swxY w Y   |                      ¦   «          n@|                     |¦  «         |                      t          | ||¬¦  «        |j        ¦  «         Y d}~dS d}~ww xY wt
                               d¦  «         |                      |¦  «         |r«| j	        5  | j
        | j        k     s| j
        | j        k     rb| j        r[| xj
        dz  c_
        t
                               d	| j        | j
        ¦  «         |                      t          | d
¬¦  «        ¦  «         nd| _        ddd¦  «         dS # 1 swxY w Y   dS dS )zïTry to connect and add the connection to the pool.

        If failed, reschedule a new attempt in the future for a few times, then
        give up, decrease the pool connections number and call
        `self.reconnect_failed()`.

        r~   zerror connecting in %r: %sz3reconnection attempt in pool %r failed after %s secr   FNr­   z!adding new connection to the poolr¬   T)r   r   r?   r  r“   rw   rø   r9   r–   r[   r¯   r±   r@   r•   r  r²   r—   rx   rö   rv   r°   rU   rŸ   )r^   r˜   r®   r™   r„   r
  s         r`   Ú_add_connectionzConnectionPool._add_connection�  sÀ  € õ ‰kŒkˆØð 	IÝ(°Ô1GÐHÑHÔHˆGð	Ø—=’=‘?”?ˆD‰DøÝ ð 	ð 	ð 	Ý�NŠNÐ7¸¼ÀBÑGÔGÐGØ×&Ò& sÑ+Ô+ð Ý—’ØIØ”IØÔ*ñô ð ð
 ”Zð .ð .Ø�L”L AÑ%�L”Làð . 4¤=ð .Ø(-˜œð	.ð .ð .ñ .ô .ð .ð .ð .ð .ð .ð .øøøð .ð .ð .ð .ð
 ×%Ò%Ñ'Ô'Ð'Ð'à×$Ò$ SÑ)Ô)Ð)Ø×"Ò"Ý! $¨¸ÐAÑAÔAÀ7Ä=ñô ð ð ˆFˆFˆFˆFˆFøøøøð'	øøøõ* 	�ŠÐ7Ñ8Ô8Ð8Ø×Ò˜$ÑÔÐØð 	*Ø”ð 
*ð 
*ð ”< $¤.Ò0Ð0Ø”L 4¤>Ò1Ð1°d´mÐ1à�L”L AÑ%�L”LÝ—K’KÐ 7¸¼ÀDÄLÑQÔQÐQØ—M’M¥-°¸dÐ"CÑ"CÔ"CÑDÔDÐDÐDà$)�D”Mð
*ð 
*ð 
*ñ 
*ô 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð 
*øøøð 
*ð 
*ð 
*ð 
*ð 
*ð 
*ð	*ð 	*sN   §= ½
EÁA#D=Â*!CÃD=ÃC	ÃD=ÃC	ÃAD=Ä=EÅ=B
HÈHÈHc                ó  — |                       |¦  «         |rs|j        j        t          j        k    rX| j        | j        xx         dz  cc<   t                               d¦  «         |  	                    t          | ¦  «        ¦  «         dS ns|j        j        t          j        k    rY| j        | j        xx         dz  cc<   t                               d|¦  «         |  	                    t          | ¦  «        ¦  «         dS |j        | j        k    s|j        t!          ¦   «         k    rSt                               d¦  «         |                      |¦  «         |  	                    t          | ¦  «        ¦  «         dS |                      |¦  «         dS )z>
        Return a connection to the pool after usage.
        r   z#not serving connection found brokenNz discarding closed connection: %szdiscarding expired connection)Ú_reset_connectionr  r  r   ÚUNKNOWNr‚   r÷   rw   rx   rŸ   r²   Ú_RETURNS_BADrø   Ú_created_atr»   rô   r   r¼   rö   rÃ   s      r`   rÂ   z!ConnectionPool._return_connectionÄ  s{  € ð 	×Ò˜tÑ$Ô$Ð$Øð 	ØŒ{Ô-Õ1BÔ1JÒJÐJØ”˜DÔ2Ð3Ð3Ô3°qÑ8Ð3Ð3Ñ3å—’ÐAÑBÔBÐBØ—’�m¨DÑ1Ô1Ñ2Ô2Ð2Ø�ð Kð Œ[Ô+Õ/@Ô/HÒHÐHØŒK˜Ô)Ð*Ð*Ô*¨aÑ/Ð*Ð*Ñ*å�NŠNÐ=¸tÑDÔDÐDØ�MŠM�-¨Ñ-Ô-Ñ.Ô.Ð.ØˆFð Ô˜tÔ/Ò/Ð/°4´?ÅiÁkÄkÒ3QÐ3QÝ�KŠKÐ7Ñ8Ô8Ð8Ø×"Ò" 4Ñ(Ô(Ð(Ø�MŠM�-¨Ñ-Ô-Ñ.Ô.Ð.ØˆFà×Ò˜$ÑÔÐÐÐra   c                ó  — d|_         | j        r|                      |¦  «         dS | j        5  | j        r#|                      |¦  «         	 ddd¦  «         dS | j        r4| j                             ¦   «                              |¦  «        rn^| j        °4| j                              |¦  «         | j        r6t          | j         ¦  «        | j
        k    r| j                             ¦   «          ddd¦  «         dS # 1 swxY w Y   dS )zì
        Add a connection to the pool.

        The connection can be a fresh one or one already used in the pool.

        If a client is already waiting for a connection pass it on, otherwise
        put it back into the pool
        N)r,   re   r¼   r[   rU   r§   Úsetrœ   rV   ru   rv   r·   s     r`   rö   zConnectionPool._add_to_poolà  sx  € ð ˆŒ
ð Œ<ð 	Ø×"Ò" 4Ñ(Ô(Ð(ØˆFð ŒZð 	0ð 	0ð
 Œ|ð Ø×&Ò& tÑ,Ô,Ð,Øð	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð ”-ð 0ð ”=×(Ò(Ñ*Ô*×.Ò.¨tÑ4Ô4ð Øð ”-ð 0ð ”
×!Ò! $Ñ'Ô'Ð'ð Ô(ð 0­S°´©_¬_ÀÄÒ-NÐ-NØÔ)×-Ò-Ñ/Ô/Ð/ð+	0ð 	0ð 	0ñ 	0ô 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0ð 	0øøøð 	0ð 	0ð 	0ð 	0ð 	0ð 	0s   ­C7ÁBC7Ã7C;Ã>C;c                óš  — |j         j        x}t          j        k    rnö|t          j        k    rdS |t          j        k    s|t          j        k    r„t                               d|¦  «         	 | 	                    ¦   «          n“# t          $ rF}t                               d|j        j        ||¦  «         |                      |¦  «         Y d}~nHd}~ww xY w|t          j        k    r0t                               d|¦  «         |                      |¦  «         | j        r°	 |                      |¦  «         |j         j        x}t          j        k    r4t          |¦  «        j        }t#          j        d|› d| j        › d�¦  «        ‚dS # t          $ r;}t                               d|¦  «         |                      |¦  «         Y d}~dS d}~ww xY wdS )	z?
        Bring a connection to IDLE state or close it.
        Nz$rolling back returned connection: %sz1rollback failed: %s: %s. Discarding connection %szclosing returned connection: %sr  z by reset function r  zerror resetting connection: %s)r  r  r   r  r)  ÚINTRANSÚINERRORrw   rø   Úrollbackr“   r_   rq   r¼   ÚACTIVErR   r9   rª   r  )r^   r„   r  r
  r  s        r`   r(  z ConnectionPool._reset_connection  s  € ð ”kÔ4Ð4ˆFÕ9JÔ9OÒOÐOØØÕ(Ô0Ò0Ð0àˆFØÕ(Ô0Ò0Ð0°FÕ>OÔ>WÒ4WÐ4Wå�NŠNÐAÀ4ÑHÔHÐHð	-Ø—’‘”��øÝ$ð -ð -ð -Ý—’ØGØ”LÔ)ØØñ	ô ð ð ×&Ò& tÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,øøøøð-øøøð Õ(Ô/Ò/Ð/å�NŠNÐ<¸dÑCÔCÐCØ×"Ò" 4Ñ(Ô(Ð(àŒ;ð 
	-ð	-Ø—’˜DÑ!Ô!Ð!Ø"œkÔ<Ð<�FÕARÔAWÒWÐWÝ-¨fÑ5Ô5Ô:�EÝÔ,Øg°UÐgÐgÈtÌ{ÐgÐgÐgñô ð ð XÐWøõ
 %ð -ð -ð -Ý—’Ð?ÀÑDÔDÐDØ×&Ò& tÑ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,øøøøð-øøøð
	-ð 
	-s1   Á,B Â
CÂ<CÃCÄA%F Æ
GÆ0GÇGc                ó<   — d |_         |                     ¦   «          d S rÕ   )r,   rz   r·   s     r`   r¼   z ConnectionPool._close_connection6  s   € ØˆŒ
Ø�
Š
‰Œˆˆˆra   c                óÀ  — d }| j         5  | j        }t          | j        ¦  «        | _        | j        | j        k    rF|dk    r@| j        r9| j                             ¦   «         }| xj        dz  c_        | xj        dz  c_        d d d ¦  «         n# 1 swxY w Y   |rDt                               d| j	        | j        || j
        ¦  «         |                      |¦  «         d S d S )Nr   r   zHshrinking pool %r to %s because %s unused connections in the last %s sec)r[   r¨   ru   r,   r¯   rv   r§   rw   rx   r9   r>   r¼   )r^   Úto_closeÚ
nconns_mins      r`   Ú_shrink_poolzConnectionPool._shrink_pool:  s-  € Ø"ˆàŒZð 		&ð 		&àÔ)ˆJÝ" 4¤:™œˆDÔð Œ|˜dœnÒ,Ð,°¸a²°ÀDÄJ°Øœ:×-Ò-Ñ/Ô/�Ø�” Ñ!�”ØÐ Ô  AÑ%Ð Ô ð		&ð 		&ð 		&ñ 		&ô 		&ð 		&ð 		&ð 		&ð 		&ð 		&ð 		&øøøð 		&ð 		&ð 		&ð 		&ð ð 	-Ý�KŠKØZØ”	Ø”ØØ”ñô ð ð ×"Ò" 8Ñ,Ô,Ð,Ð,Ð,ð	-ð 	-s   ŠA7BÂBÂBúdict[str, int]c                ó€   •— t          ¦   «                              ¦   «         }t          | j        ¦  «        || j        <   |S rÕ   )rY   Ú_get_measuresru   rU   Ú_REQUESTS_WAITING)r^   Úrvr_   s     €r`   r:  zConnectionPool._get_measuresR  s4   ø€ Ý‰WŒW×"Ò"Ñ$Ô$ˆÝ%(¨¬Ñ%7Ô%7ˆˆ4Ô!Ñ"Øˆ	ra   )r-   )$rB   r   r1   rC   r2   rD   r3   rE   r4   rF   r5   rG   r6   rH   r7   rH   r8   rH   r9   rI   r:   rJ   r;   rK   r<   rE   r=   rK   r>   rK   r?   rK   r@   rL   rA   rE   ©rb   rc   )r/   )r;   rK   rb   rc   rÕ   )r;   r{   rb   r|   )r;   r{   rb   r   )r�   rK   rb   r   ©r;   rK   rb   r   )r;   r{   rb   r¤   )r„   r   rb   rc   )r„   r   r�   rJ   rb   rc   ©r„   r   rb   rJ   )Fr/   )ry   rJ   r;   rK   rb   rc   )rf   )rb   rÝ   )rb   r    )rå   ræ   rç   rè   ré   rê   rb   rc   )r3   rE   r4   rF   rb   rc   )rý   rþ   rb   rc   )rý   rþ   r—   rK   rb   rc   )r  r  rb   rc   ©rb   r  )rb   r"  )F)r˜   r$  r®   rJ   rb   rc   )rb   r8  )4rq   Ú
__module__Ú__qualname__Ú__annotations__r
   rN   r   r   rZ   rl   rn   ry   r   r‡   r€   rŒ   r‘   r›   r’   rž   r�   r¿   r”   r¶   r5   r]   rË   rÌ   rz   ri   rä   rì   rñ   r7   Ústaticmethodrõ   r@   rŸ   r  ÚclassmethodrÑ   r  r  r  r&  rÂ   rö   r(  r¼   r7  r:  Ú__classcell__©r_   s   @r`   r+   r+   (   s;  ø€ € € € € € ØÐÐÑð #%ðIð &* T¨$¨r¬(°JÑ%?Ô%?Ø%)ØØ#Ø Ø-1Ø)-Ø)-ØØ#ØØØ'Ø#Ø#+Ø37Øð)Ið Ið Ið Ið Ið Ið Ið IðV9ð 9ð 9ð 9ð	ð 	ð 	ð 	ð 	ð 	ð:ð :ð :ð :ð :ð@ ðCð Cð Cð Cñ „^ðCð,ð ð ð ð ð8%ð %ð %ð %ð4 ð  ð  ð  ðDð ð ð ð$ð ð ð ð9ð 9ð 9ð 9ð0ð 0ð 0ð 0ð/ð /ð /ð /ð(Eð Eð Eð Eðð ð ð ð'ð 'ð 'ð 'ð 'ð($ð $ð $ð $ð"$ð $ð $ð $ðGð Gð Gð Gð'Fð 'Fð 'Fð 'Fð 'FðRð ð ð ðð ð ð ð
ð ð ð ð/ð /ð /ð /ð /ð"!(ð !(ð !(ð !(ðF ð(ð (ð (ñ „\ð(ð&%ð %ð %ð %ð%ð %ð %ð %ð,ð ,ð ,ð ,ð ðð ð ñ „[ðð*ð ð ð ð ð@#ð #ð #ð #ðð ð ð ð CHð2*ð 2*ð 2*ð 2*ð 2*ðh ð  ð  ð  ð8-0ð -0ð -0ð -0ð^%-ð %-ð %-ð %-ðNð ð ð ð-ð -ð -ð -ð0ð ð ð ð ð ð ð ð ð ra   r+   c                  ó6   — e Zd ZdZdZdd„Zdd	„Zdd„Zdd„ZdS )rT   z<A position in a queue for a client waiting for a connection.)r„   ÚerrorÚ_condrb   rc   c                óH   — d | _         d | _        t          ¦   «         | _        d S rÕ   )r„   rI  r!   rJ  r³   s    r`   rZ   zWaitingClient.__init__]  s!   € Ø#ˆŒ	Ø+/ˆŒ
õ ‘[”[ˆŒ
ˆ
ˆ
ra   r;   rK   r   c                ó>  — | j         5  | j        sZ| j        sS	 | j                              |¦  «        st	          d|d›d�¦  «        | _        n# t
          $ r}|| _        Y d}~nd}~ww xY wddd¦  «         n# 1 swxY w Y   | j        r| j        ‚| j        sJ ‚| j        S )z�Wait for a connection to be set and return it.

        Raise an exception if the wait times out or if fail() is called.
        r‰   rŠ   rt   N)rJ  r„   rI  ry   r   r“   )r^   r;   r
  s      r`   ry   zWaitingClient.waith  s  € ð
 ŒZð 	$ð 	$Ø”Ið $ ¤ð $ð$Øœ:Ÿ?š?¨7Ñ3Ô3ð Ý%0ØP¸wÐPÐPÐPÐPñ&ô &˜œ
øøõ )ð $ð $ð $Ø!#�D”J�J�J�J�J�Jøøøøð$øøøð	$ð 	$ð 	$ñ 	$ô 	$ð 	$ð 	$ð 	$ð 	$ð 	$ð 	$øøøð 	$ð 	$ð 	$ð 	$ð Œ:ð 	Ø”*Ðà”9ÐÐ�9Ø”9Ðs:   ˆA6˜3AÁA6Á
A'ÁA"ÁA6Á"A'Á'A6Á6A:Á=A:r„   rJ   c                óÀ   — | j         5  | j        s| j        r	 ddd¦  «         dS || _        | j                              ¦   «          	 ddd¦  «         dS # 1 swxY w Y   dS )zÂSignal the client waiting that a connection is ready.

        Return True if the client has "accepted" the connection, False
        otherwise (typically because wait() has timed out).
        NFT©rJ  r„   rI  Ú
notify_allr·   s     r`   r-  zWaitingClient.set}  sÎ   € ð ŒZð 	ð 	ØŒyð ˜DœJð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ˆDŒIØŒJ×!Ò!Ñ#Ô#Ð#Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ó   ˆA¥!AÁAÁArI  Ú	Exceptionc                óÀ   — | j         5  | j        s| j        r	 ddd¦  «         dS || _        | j                              ¦   «          	 ddd¦  «         dS # 1 swxY w Y   dS )zÉSignal the client that, alas, they won't have a connection today.

        Return True if the client has "accepted" the error, False otherwise
        (typically because wait() has timed out).
        NFTrN  )r^   rI  s     r`   rÚ   zWaitingClient.fail‹  sÎ   € ð ŒZð 	ð 	ØŒyð ˜DœJð Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð ˆDŒJØŒJ×!Ò!Ñ#Ô#Ð#Øð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	rP  Nr=  r>  r?  )rI  rQ  rb   rJ   )	rq   rA  rB  Ú__doc__Ú	__slots__rZ   ry   r-  rÚ   © ra   r`   rT   rT   X  so   € € € € € ØFÐFà*€Ið	!ð 	!ð 	!ð 	!ðð ð ð ð*ð ð ð ðð ð ð ð ð ra   rT   c                  óJ   — e Zd ZdZdd„Zdd„Zdd	„Zdd
„Zedd„¦   «         Z	dS )rþ   z8A task to run asynchronously to maintain the pool state.ÚpoolúConnectionPool[Any]c                ó.   — t          |¦  «        | _        d S rÕ   )r   rW  ©r^   rW  s     r`   rZ   zMaintenanceTask.__init__�  s   € Ý˜‘I”IˆŒ	ˆ	ˆ	ra   rb   r  c                ó¢   — |                       ¦   «         }|rt          |j        ¦  «        nd}d| j        j        › d|› dt          | ¦  «        d›d�S )Nz<pool is gone>ú<ú z at 0xÚxú>)rW  Úreprr9   r_   rq   Úid)r^   rW  r9   s      r`   Ú__repr__zMaintenanceTask.__repr__   sU   € Ø�yŠy‰{Œ{ˆØ"&Ð<�t�D”I‰ŒˆÐ,<ˆØF�4”>Ô*ÐFÐF¨TÐFÐF½¸D¹¼ÐFÐFÐFÐFÐFra   rc   c                óô   — |                       ¦   «         }|r|j        rt                               d| ¦  «         dS t                               dt	          ¦   «         | ¦  «         |                      |¦  «         dS )zŽRun the task.

        This usually happens in a worker. Call the concrete _run()
        implementation, if the pool is still alive.
        ztask run discarded: %sNztask running in %s: %s)rW  Úclosedrw   rÙ   r&   Ú_runrZ  s     r`   rÏ   zMaintenanceTask.run¥  sm   € ð �yŠy‰{Œ{ˆØð 	�t”{ð 	å�LŠLÐ1°4Ñ8Ô8Ð8ØˆFå�ŠÐ-Õ/BÑ/DÔ/DÀdÑKÔKÐKØ�	Š	�$‰Œˆˆˆra   c                ó¤   — |                       ¦   «         }|r|j        rt                               d| ¦  «         dS |                     | ¦  «         dS )z±Run the scheduled task

        This function is called by the scheduler task. Use a worker to
        run the task for real in order to free the scheduler immediately.
        ztask tick discarded: %sN)rW  rd  rw   rÙ   rŸ   rZ  s     r`   r  zMaintenanceTask.tick´  sT   € ð �yŠy‰{Œ{ˆØð 	�t”{ð 	å�LŠLÐ2°DÑ9Ô9Ð9ØˆFà�Š�dÑÔÐÐÐra   c                ó   — d S rÕ   rU  rZ  s     r`   re  zMaintenanceTask._runÂ  s   € Ø7:°sra   N)rW  rX  r@  r=  ©rW  rX  rb   rc   )
rq   rA  rB  rS  rZ   rb  rÏ   r  r   re  rU  ra   r`   rþ   rþ   š  s‚   € € € € € ØBÐBðð ð ð ðGð Gð Gð Gð
ð ð ð ðð ð ð ð Ø:Ð:Ð:ñ „^Ø:Ð:Ð:ra   rþ   c                  ó   — e Zd ZdZdd„ZdS )	rà   z+Signal the maintenance worker to terminate.rW  rX  rb   rc   c                ó   — d S rÕ   rU  rZ  s     r`   re  zStopWorker._runÉ  s   € Øˆra   Nrh  ©rq   rA  rB  rS  re  rU  ra   r`   rà   rà   Æ  s.   € € € € € Ø5Ð5ðð ð ð ð ð ra   rà   c                  ó.   ‡ — e Zd Z	 	 ddˆ fd	„Zdd„Zˆ xZS )r²   NFrW  rX  r˜   r$  r®   rJ   c                óf   •— t          ¦   «                              |¦  «         || _        || _        d S rÕ   )rY   rZ   r˜   r®   )r^   rW  r˜   r®   r_   s       €r`   rZ   zAddConnection.__init__Ï  s/   ø€ õ 	‰Œ×Ò˜ÑÔÐØˆŒØˆŒˆˆra   rb   rc   c                óH   — |                      | j        | j        ¬¦  «         d S )Nr­   )r&  r˜   r®   rZ  s     r`   re  zAddConnection._runÙ  s%   € Ø×Ò˜Tœ\°4´<ÐÑ@Ô@Ð@Ð@Ð@ra   rã   )rW  rX  r˜   r$  r®   rJ   rh  )rq   rA  rB  rZ   re  rF  rG  s   @r`   r²   r²   Í  sf   ø€ € € € € ð
 .2Øð	ð ð ð ð ð ð ðAð Að Að Að Að Að Að Ara   r²   c                  ó,   ‡ — e Zd ZdZdˆ fd„Zdd„Zˆ xZS )r    z-Clean up and return a connection to the pool.rW  rX  r„   r   r�   rJ   c                óf   •— t          ¦   «                              |¦  «         || _        || _        d S rÕ   )rY   rZ   r„   r�   )r^   rW  r„   r�   r_   s       €r`   rZ   zReturnConnection.__init__à  s0   ø€ Ý‰Œ×Ò˜ÑÔÐØˆŒ	Ø(ˆÔÐÐra   rb   rc   c                óH   — |                      | j        | j        ¬¦  «         d S rÁ   )rÂ   r„   r�   rZ  s     r`   re  zReturnConnection._runå  s&   € Ø×Ò ¤	¸Ô8IÐÑJÔJÐJÐJÐJra   )rW  rX  r„   r   r�   rJ   rh  ©rq   rA  rB  rS  rZ   re  rF  rG  s   @r`   r    r    Ý  s_   ø€ € € € € Ø7Ð7ð)ð )ð )ð )ð )ð )ð
Kð Kð Kð Kð Kð Kð Kð Kra   r    c                  ó   — e Zd ZdZdd„ZdS )	r×   z“If the pool can shrink, remove one connection.

    Re-schedule periodically and also reset the minimum number of connections
    in the pool.
    rW  rX  rb   rc   c                ód   — |                      | |j        ¦  «         |                     ¦   «          d S rÕ   )r  r>   r7  rZ  s     r`   re  zShrinkPool._runð  s4   € ð 	×Ò˜4 ¤Ñ/Ô/Ð/Ø×ÒÑÔÐÐÐra   Nrh  rk  rU  ra   r`   r×   r×   é  s2   € € € € € ðð ðð ð ð ð ð ra   r×   c                  ó,   ‡ — e Zd ZdZdˆ fd„Zdd„Zˆ xZS )rÖ   zÒSchedule a task in the pool scheduler.

    This task is a trampoline to allow to use a sync call (pool.run_task)
    to execute an async one (pool.schedule_task). It is pretty much no-op
    in sync code.
    rW  rX  rý   rþ   r—   rK   c                óf   •— t          ¦   «                              |¦  «         || _        || _        d S rÕ   )rY   rZ   rý   r—   )r^   rW  rý   r—   r_   s       €r`   rZ   zSchedule.__init__ÿ  s-   ø€ Ý‰Œ×Ò˜ÑÔÐØˆŒ	ØˆŒ
ˆ
ˆ
ra   rb   rc   c                óF   — |                      | j        | j        ¦  «         d S rÕ   )r  rý   r—   rZ  s     r`   re  zSchedule._run  s"   € Ø×Ò˜4œ9 d¤jÑ1Ô1Ð1Ð1Ð1ra   )rW  rX  rý   rþ   r—   rK   rh  rr  rG  s   @r`   rÖ   rÖ   ÷  s[   ø€ € € € € ðð ðð ð ð ð ð ð
2ð 2ð 2ð 2ð 2ð 2ð 2ð 2ra   rÖ   )ErS  Ú
__future__r   Úloggingro   Úabcr   r   Útimer   Útypesr   Útypingr   r	   r
   Úweakrefr   Ú
contextlibr   Úcollectionsr   Úcollections.abcr   Úpsycopgr   r   rª   Ú
psycopg.pqr   r   r   r   r   r   Úbaser   r   Úschedr   r   r   r   Ú_compatr   r   r    Ú_acompatr!   r"   r#   r$   r%   r&   r'   r(   r)   rQ  r“   Ú	getLoggerrw   r+   rT   rþ   rà   r²   r    r×   rÖ   rU  ra   r`   ú<module>r‰     s‚  ððð ð #Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø #Ð #Ð #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø (Ð (Ð (Ð (Ð (Ð (à NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NÐ NØ .Ð .Ð .Ð .Ð .Ð .Ð .Ð .Ø Ð Ð Ð Ð Ð Ø <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ð <Ø :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ð :Ø PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PÐ PØ *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ð *Ð *àÐ à	ˆÔ	˜>Ñ	*Ô	*€ðmð mð mð mð m�W˜R”[ (ñ mô mð mð`?ð ?ð ?ð ?ð ?�G˜B”Kñ ?ô ?ð ?ðD);ð );ð );ð );ð );�cñ );ô );ð );ðXð ð ð ð �ñ ô ð ðAð Að Að Að A�Oñ Aô Að Að 	Kð 	Kð 	Kð 	Kð 	K�ñ 	Kô 	Kð 	Kðð ð ð ð �ñ ô ð ð2ð 2ð 2ð 2ð 2ˆñ 2ô 2ð 2ð 2ð 2ra   