
    h$3                     (   d Z ddlZddlZddlZddlZddl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 n# e$ r	 dxZxZZY nw xY w	 ddlmZ n# e$ r Y nw xY wdd	lmZ dd
lmZ ddlmZ  ej        d          Zd Z G d de          Z edd          Z G d de          Zd Z G d de          Z G d dee          Z G d de          Z  G d de e          Z!	 ddl"m#Z#  G d de e#          Z$n# e$ r dZ$Y nw xY w	 dd l%m&Z&  G d! d"ee&          Z'n# e$ r dZ'Y nw xY w G d# d$e          Z( G d% d&e(e          Z)	 dd'l*m+Z+  G d( d)e(e+          Z,n# e$ r dZ,Y nw xY w	 dd*l*m-Z-  G d+ d,e(e-          Z.dS # e$ r dZ.Y dS w xY w)-aG  
Lightweight connection pooling for peewee.

In a multi-threaded application, up to `max_connections` will be opened. Each
thread (or, if using gevent, greenlet) will have it's own connection.

In a single-threaded application, only one connection will be created. It will
be continually recycled until either it exceeds the stale timeout or is closed
explicitly (using `.manual_close()`).

By default, all your application needs to do is ensure that connections are
closed when you are finished with them, and they will be returned to the pool.
For web applications, this typically means that at the beginning of a request,
you will open a connection, and when you return a response, you will close the
connection.

Simple Postgres pool example code:

    # Use the special postgresql extensions.
    from playhouse.pool import PooledPostgresqlExtDatabase

    db = PooledPostgresqlExtDatabase(
        'my_app',
        max_connections=32,
        stale_timeout=300,  # 5 minutes.
        user='postgres')

    class BaseModel(Model):
        class Meta:
            database = db

That's it!
    N)
namedtuple)chain)TRANSACTION_STATUS_IDLE)TRANSACTION_STATUS_INERROR)TRANSACTION_STATUS_UNKNOWN)TransactionStatus)MySQLDatabase)PostgresqlDatabase)SqliteDatabasezpeewee.poolc                 `    | +t          | t          t          f          st          |           S | S N)
isinstanceintfloat)vals    L/var/www/html/marketdash/venv/lib/python3.11/site-packages/playhouse/pool.pymake_intr   >   s)    
z#U|<<3xxJ    c                       e Zd ZdS )MaxConnectionsExceededN__name__
__module____qualname__ r   r   r   r   D   s          r   r   PoolConnection)	timestamp
connectionchecked_outc                       e Zd Zd ZdS )	_sentinelc                     dS NTr   )selfothers     r   __lt__z_sentinel.__lt__K   s    tr   N)r   r   r   r&   r   r   r   r!   r!   J   s#            r   r!   c                 F     t          j                    fd            }|S )Nc                 ^    | j         5   | g|R i |cd d d            S # 1 swxY w Y   d S r   )
_pool_lock)r$   argskwargsfns      r   innerzlocked.<locals>.innerP   s    _ 	- 	-2d,T,,,V,,	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	- 	-s   "&&)	functoolswraps)r,   r-   s   ` r   lockedr0   O   s8    _R- - - - - Lr   c                        e Zd Z	 	 d fd	Z	 	 d fd	Zd fd	Ze fd            Zd Zd	 Z	d
 Z
ed fd	            Zed             Zed             Zedd            Zed             Z xZS )PooledDatabase   Nc                 d   t          |          | _        t          |          | _        t          |          | _        | j        dk    rt	          d          | _        t          j                    | _        g | _        i | _	        t          | _         t          t          |           j        |fi | d S Nr   inf)r   _max_connections_stale_timeout_wait_timeoutr   	threadingRLockr)   _connections_in_useidconn_keysuperr2   __init__)r$   databasemax_connectionsstale_timeouttimeoutr+   	__class__s         r   rA   zPooledDatabase.__init__X   s     ( 9 9&}55%g..""!&uD#/++ 
  ,nd##,X@@@@@@@r   c                     t          t          |           j        |fi | |t          |          | _        |t          |          | _        |5t          |          | _        | j        dk    rt          d          | _        d S d S d S r5   )r@   r2   initr   r7   r8   r9   r   )r$   rB   rC   rD   rE   connect_kwargsrF   s         r   rH   zPooledDatabase.initr   s    (nd##(DD^DDD&$,_$=$=D!$"*="9"9D!)'!2!2D!Q&&%*5\\""" &&r   Fc                    | j         s(t          t          |                               |          S t	          j                    | j         z   }|t	          j                    k    rf	 t          t          |                               |          }|S # t
          $ r t	          j        d           Y nw xY w|t	          j                    k    ft          d          )Ng?z:Max connections exceeded, timed out attempting to connect.)r9   r@   r2   connecttimer   sleep)r$   reuse_if_openexpiresretrF   s       r   rK   zPooledDatabase.connect~   s    ! 	F..66}EEE)++ 22	##ND1199-HH 
 *      
3  	## % &> ? ? 	?s   $(B B/.B/c                 t   	 	 t          j        | j                  \  }}}|}|                     |          }|                     |          r t
                              d|           d x}}n| j        rK|                     |          r6t
                              d|           | 	                    |d           d x}}n/n/# t          $ r! d x}}t
                              d           Y nw xY w|| j        r,t          | j                  | j        k    rt          d          t          t           |                                           }t%          j                    }|                     |          }t
                              d|           t'          ||t%          j                              | j        |<   |S )NTzConnection %s was closed.z!Connection %s was stale, closing.z No connection available in pool.zExceeded maximum connections.zCreated new connection %s.)heapqheappopr<   r?   
_is_closedloggerdebugr8   	_is_stale_close
IndexErrorr7   lenr=   r   r@   r2   _connectrL   r   )r$   ts_c_connconnkeyrF   s         r   r[   zPooledDatabase._connect   s   	 %d.? @ @AvmmD)) ??4((  LL!<cBBB $$B( 	T^^B-?-? 	
 LL!DcJJJKKd+++ $$B-      T?@@@	< <$ N%%)>>>,-LMMM..7799DB--%%CLL5s;;;*2tTY[[AASs   4C   (C+*C+c                 @    t          j                     |z
  | j        k    S r   )rL   r8   )r$   r   s     r   rW   zPooledDatabase._is_stale   s     	i'4+>>>r   c                     dS )NFr   r$   r_   s     r   rT   zPooledDatabase._is_closed   s    ur   c                     dS r#   r   rc   s     r   
_can_reusezPooledDatabase._can_reuse   s    tr   c                    |                      |          }|r*t          t          |                               |           d S || j        v r| j                            |          }| j        r_|                     |j                  rEt          
                    d|           t          t          |                               |           d S |                     |          rKt          
                    d|           t          j        | j        |j        t                      |f           d S t          
                    d|           d S d S )NzClosing stale connection %s.zReturning %s to pool.z
Closed %s.)r?   r@   r2   rX   r=   popr8   rW   r   rU   rV   re   rR   heappushr<   r!   )r$   r_   
close_connr`   	pool_connrF   s        r   rX   zPooledDatabase._close   sB   mmD!! 	0.$''..t44444DL  ((--I" 0t~~i6I'J'J 0;SAAAnd++22488888&& 04c:::t0 ) 3Y[[$GI I I I I \3///// ! r   c                    |                                  rdS |                                 }| j                            |                     |          d           |                                  |                     |d           dS )zS
        Close the underlying connection without returning it to the pool.
        FNTri   )	is_closedr   r=   rg   r?   closerX   rc   s     r   manual_closezPooledDatabase.manual_close   s{    
 >> 	5    	t,,d333

DT*****r   c                 ^    | j         D ]\  }}}|                     |d           g | _         d S NTrl   )r<   rX   )r$   r]   r_   s      r   
close_idlezPooledDatabase.close_idle   sC     + 	/ 	/JAq$KKK....r   X  c                     i }t          j                     |z
  }d}| j                                        D ]7\  }}|j        |k     r"|                     |j        d           |dz  }2|||<   8|| _        |S )Nr   Trl      )rL   r=   itemsr   rX   r   )r$   agein_usecutoffnr`   rj   s          r   close_stalezPooledDatabase.close_stale   s     s""l0022 	( 	(NC$v--I0TBBBQ'sr   c                    |                                   | j        D ]\  }}}|                     |d           | j                                        D ]}|                     |j        d           g | _        i | _        d S rq   )rn   r<   rX   r=   valuesr   )r$   r]   r_   rj   s       r   	close_allzPooledDatabase.close_all   s     	

+ 	/ 	/JAq$KKK....,,.. 	? 	?IKK	,K>>>>r   )r3   NN)NNNF)rs   )r   r   r   rA   rH   rK   r0   r[   rW   rT   re   rX   ro   rr   r{   r~   __classcell__)rF   s   @r   r2   r2   W   s}       CGA A A A A A4 BF
2 
2 
2 
2 
2 
2? ? ? ? ? ? ) ) ) ) V)V? ? ?
     0 0 0 0 0 V0  + + V+$   V    V 	 	 V	 	 	 	 	r   r2   c                       e Zd Zd ZdS )PooledMySQLDatabasec                 X    | j         d         dk    rd}nd}	  |j        |  dS #  Y dS xY w)Nr      r   r   FT)server_versionping)r$   r_   r*   s      r   rT   zPooledMySQLDatabase._is_closed  sL    q!Q&&DDD	DIt 5	44s   
$ )Nr   r   r   rT   r   r   r   r   r     s#        
 
 
 
 
r   r   c                       e Zd Zd Zd ZdS )_PooledPostgresqlDatabasec                     |j         rdS |                                }|t          k    rdS |t          k    r|                                 dS NTF)closedget_transaction_statusr   r   rollbackr$   r_   
txn_statuss      r   rT   z$_PooledPostgresqlDatabase._is_closed  sQ    ; 	40022
3334222MMOOOur   c                     |                                 }|t          k    rdS |t          k    r|                                 n|t          k    r|                                 dS NFT)r   r   r   resetr   r   r   s      r   re   z$_PooledPostgresqlDatabase._can_reuse'  s_    0022
 3335555JJLLLL222MMOOOtr   Nr   r   r   rT   re   r   r   r   r   r     s2        	 	 	    r   r   c                       e Zd ZdS )PooledPostgresqlDatabaseNr   r   r   r   r   r   4          Dr   r   )PostgresqlExtDatabasec                       e Zd ZdS )PooledPostgresqlExtDatabaseNr   r   r   r   r   r   :          r   r   )Psycopg3Databasec                       e Zd Zd Zd ZdS )PooledPsycopg3Databasec                     |j         rdS |j        j        }|t          j        k    rdS |t          j        k    r|                                 dS r   )r   pgconntransaction_statusr   UNKNOWNIDLEr   r   s      r   rT   z!PooledPsycopg3Database._is_closedD  sP    { t7J.666t05555r   c                     |j         j        }|t          j        k    rdS |t          j        k    r|                                 n$|t          j        k    r|                                 dS r   )r   r   r   r   INERRORr   r   r   r   s      r   re   z!PooledPsycopg3Database._can_reuseO  sa    7J .666u0888

05554r   Nr   r   r   r   r   r   C  s2        		 		 			 	 	 	 	r   r   c                       e Zd Zd ZdS )_PooledSqliteDatabasec                 &    	 |j          dS #  Y dS xY wr   )total_changesrc   s     r   rT   z _PooledSqliteDatabase._is_closed`  s'    	 5	44s    Nr   r   r   r   r   r   _  s#            r   r   c                       e Zd ZdS )PooledSqliteDatabaseNr   r   r   r   r   r   h  r   r   r   )SqliteExtDatabasec                       e Zd ZdS )PooledSqliteExtDatabaseNr   r   r   r   r   r   n  r   r   r   )CSqliteExtDatabasec                       e Zd ZdS )PooledCSqliteExtDatabaseNr   r   r   r   r   r   v  r   r   r   )/__doc__r.   rR   loggingr:   rL   collectionsr   	itertoolsr   psycopg2.extensionsr   r   r   ImportError
psycopg.pqr   peeweer	   r
   r   	getLoggerrU   r   
ValueErrorr   r   objectr!   r0   r2   r   r   r   playhouse.postgres_extr   r   playhouse.psycopg3_extr   r   r   r   playhouse.sqlite_extr   r   r   r   r   r   r   <module>r      s     B            " " " " " "      .;;;;;;>>>>>>>>>>>>> . . . *.. .&&&&.	,,,,,,, 	 	 	D	 !           % % % % % % ! ! ! ! ! !		=	)	)   / . . . .Z . . . , /> ? ?       
  s s s s sV s s sl    .-          2	 	 	 	 	8:L 	 	 	'<<<<<<    &?AV     ' ' '"&'"777777    1A    0  " " "!"    N   	 	 	 	 	0. 	 	 	#666666    "79J     # # #"#$777777    #8:L      $ $ $#$si   7 AA	A AA&C< <DD
D   D*)D*E! !E+*E+/F FF