o
    ðT·jµ*  ã                   @   s  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
 e d¡Zdd„ ZG d	d
„ d
eƒZeddƒZdd„ ZG dd„ deƒZG dd„ deƒZG dd„ deeƒZG dd„ deƒZG dd„ dee	ƒZG dd„ deƒZG dd„ dee
ƒZdS )é    N)Ú
namedtuple)ÚMySQLDatabase)ÚPostgresqlDatabase)ÚSqliteDatabasezpeewee.poolc                 C   s"   | d urt | ttfƒst| ƒS | S ©N)Ú
isinstanceÚintÚfloat)Úval© r   úQ/home/dinkstrade/pdmp-scanner/venv/lib/python3.10/site-packages/playhouse/pool.pyÚmake_int   s   r   c                   @   ó   e Zd ZdS )ÚMaxConnectionsExceededN©Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r      s    r   ÚPoolConnection)Ú	timestampÚ
connectionÚchecked_outc                    s   t  ˆ ¡‡ fdd„ƒ}|S )Nc                    s@   | j � ˆ | g|¢R i |¤ŽW  d   ƒ S 1 sw   Y  d S r   )Ú
_pool_lock)ÚselfÚargsÚkwargs©Úfnr   r   Úinner   s   $ÿzlocked.<locals>.inner)Ú	functoolsÚwraps)r   r   r   r   r   Úlocked   s   r!   c                       sº   e Zd Z		d!‡ fdd„	Z		d"‡ fdd„	Zd#‡ fdd	„	Ze‡ fd
d„ƒZdd„ Zdd„ Z	dd„ Z
‡ fdd„Zed#dd„ƒZdd„ Zedd„ ƒZed$dd„ƒZdd„ Z‡ fdd „Z‡  ZS )%ÚPooledDatabaseé   Nc                    s~   t |ƒ| _t |ƒ| _t |ƒ| _| jdkrtdƒ| _t ¡ | _t | j¡| _	g | _
d| _i | _t| _tt| ƒj|fi |¤Ž d S ©Nr   Úinf)r   Ú_max_connectionsÚ_stale_timeoutÚ_wait_timeoutr	   Ú	threadingÚRLockr   Ú	ConditionÚ_pool_availableÚ_connectionsÚ_heap_counterÚ_in_useÚidÚconn_keyÚsuperr"   Ú__init__)r   ÚdatabaseÚmax_connectionsÚstale_timeoutÚtimeoutr   ©Ú	__class__r   r   r3   $   s   





zPooledDatabase.__init__c                    sn   t t| ƒj|fi |¤Ž |d urt|ƒ| _|d urt|ƒ| _|d ur3t|ƒ| _| jdkr5tdƒ| _d S d S d S r$   )r2   r"   Úinitr   r&   r'   r(   r	   )r   r4   r5   r6   r7   Úconnect_kwargsr8   r   r   r:   E   s   



ýzPooledDatabase.initFc                    s¤   | j stt| ƒ |¡S t ¡ | j  }	 z	tt| ƒ |¡W S  tyP   |t ¡  }|dkr1tdƒ‚| j� | jjt	|dƒd� W d   ƒ n1 sIw   Y  Y nw q)NTr   z:Max connections exceeded, timed out attempting to connect.g      ð?)r7   )
r(   r2   r"   ÚconnectÚtimeÚ	monotonicr   r,   ÚwaitÚmin)r   Úreuse_if_openÚdeadlineÚ	remainingr8   r   r   r<   Q   s$   ÿÿ€úýzPooledDatabase.connectc                    sà   | j r>t | j ¡\}}}|  |¡}|  |¡rt d|¡ q | jr1|  |¡r1t d|¡ |  	|¡ q t
||t ¡ ƒ| j|< |S | jrMt| jƒ| jkrMtdƒ‚tt| ƒ ¡ }t ¡ }|  |¡}t d|¡ t
||t ¡ ƒ| j|< |S )Nz%Connection %s was closed, discarding.z!Connection %s was stale, closing.zExceeded maximum connections.zCreated new connection %s.)r-   ÚheapqÚheappopr1   Ú
_is_closedÚloggerÚdebugr'   Ú	_is_staleÚ
_close_rawr   r=   r/   r&   Úlenr   r2   r"   Ú_connect)r   ÚtsÚ_counterÚconnÚkeyr8   r   r   rL   b   s*   



zPooledDatabase._connectc                 C   s   t   ¡ | | jkS r   )r=   r'   )r   r   r   r   r   rI   �   s   zPooledDatabase._is_stalec                 C   ó   dS )NFr   ©r   rO   r   r   r   rF   †   s   zPooledDatabase._is_closedc                 C   rQ   ©NTr   rR   r   r   r   Ú
_can_reuse‰   s   zPooledDatabase._can_reusec                    sB   zt t| ƒ |¡ W d S  ty    tjd|  |¡dd� Y d S w )NzError closing connection %s.T)Úexc_info)r2   r"   Ú_closeÚ	ExceptionrG   rH   r1   rR   r8   r   r   rJ   �   s   ÿÿzPooledDatabase._close_rawc                 C   sÚ   |   |¡}|r| j |d ¡ |  |¡ nR|| jvr!t d|¡ d S | j |¡}| jr<|  |j¡r<t d|¡ |  |¡ n*|  	|¡sMt d|¡ |  |¡ nt d|¡ |  j
d7  _
t | j|j| j
|f¡ | j ¡  d S )Nz)Connection %s not in use, ignoring close.z(Closing stale connection %s on check-in.z$Connection %s not reusable, closing.zReturning %s to pool.é   )r1   r/   ÚpoprJ   rG   rH   r'   rI   r   rT   r.   rD   Úheappushr-   r,   Únotify)r   rO   Ú
close_connrP   Ú	pool_connr   r   r   rV   ”   s(   


ÿzPooledDatabase._closec                 C   sh   |   ¡ rdS |  ¡ }|  |¡}| j� | j |d¡ W d  ƒ n1 s$w   Y  |  ¡  |  |¡ dS )zS
        Close the underlying connection without returning it to the pool.
        FN)Ú	is_closedr   r1   r   r/   rY   ÚcloserJ   )r   rO   rP   r   r   r   Úmanual_close±   s   
ÿzPooledDatabase.manual_closec                 C   s*   | j }g | _ |D ]
\}}}|  |¡ qd S r   )r-   rJ   )r   ÚidleÚ_rO   r   r   r   Ú
close_idleÅ   s
   ÿzPooledDatabase.close_idleéX  c                 C   s\   t   ¡ | }d}t| j ¡ ƒD ]\}}|j|k r&|  |j¡ | j|= |d7 }q| j ¡  |S )Nr   rX   )	r=   Úlistr/   Úitemsr   rJ   r   r,   Ú
notify_all)r   ÚageÚcutoffÚnrP   r]   r   r   r   Úclose_staleÍ   s   
€
zPooledDatabase.close_stalec                 C   sn   |   ¡  | j�& |  ¡  | ji }| _| ¡ D ]}|  |j¡ q| j ¡  W d   ƒ d S 1 s0w   Y  d S r   )	r_   r   rc   r/   ÚvaluesrJ   r   r,   rg   )r   Úin_user]   r   r   r   Ú	close_allÝ   s   "úzPooledDatabase.close_allc                    sP   t t| ƒ ¡  | j� g | _i | _| j ¡  W d   ƒ d S 1 s!w   Y  d S r   )r2   r"   Údisposer   r-   r/   r,   rg   )r   r8   r   r   ro   í   s   "ýzPooledDatabase.dispose)r#   NN)NNN)F)rd   )r   r   r   r3   r:   r<   r!   rL   rI   rF   rT   rJ   rV   r`   rc   rk   rn   ro   Ú__classcell__r   r   r8   r   r"   #   s.    ÿ!ÿ
r"   c                   @   ó   e Zd Zdd„ Zdd„ ZdS )Ú_PooledMySQLDatabasec                 C   sZ   z|  d¡ W dS  ty#   z|  ¡  W Y dS  ty"   Y Y dS w  ty,   Y dS w ©NFT)ÚpingÚ	TypeErrorrW   rR   r   r   r   rF   ö   s   
÷üÿÿz_PooledMySQLDatabase._is_closedc                 C   sV   z t |dd ƒ}|d ur|ƒ }nt |ddƒ}|r| ¡  W dS W dS  ty*   Y dS w )NÚget_transaction_statusÚin_transactionTF)ÚgetattrÚrollbackrW   )r   rO   ÚstatusÚdirtyr   r   r   rT     s   
üþÿz_PooledMySQLDatabase._can_reuseN©r   r   r   rF   rT   r   r   r   r   rr   õ   s    rr   c                   @   r   )ÚPooledMySQLDatabaseNr   r   r   r   r   r}     ó    r}   c                   @   rq   )Ú_PooledPostgresqlDatabasec                 C   s   |j rdS | j |¡S rS   )ÚclosedÚ_adapterÚis_connection_closedrR   r   r   r   rF     s   z$_PooledPostgresqlDatabase._is_closedc                 C   s   | j  |¡S r   )r�   Úis_connection_reusablerR   r   r   r   rT     s   z$_PooledPostgresqlDatabase._can_reuseNr|   r   r   r   r   r     s    r   c                   @   r   )ÚPooledPostgresqlDatabaseNr   r   r   r   r   r„   !  r~   r„   c                   @   rq   )Ú_PooledSqliteDatabasec                 C   s   z|j  W dS    Y dS )NTF)Útotal_changesrR   r   r   r   rF   &  s
   þz _PooledSqliteDatabase._is_closedc                 C   s0   z|j r| ¡  W dS W dS  ty   Y dS w rs   )rw   ry   rW   rR   r   r   r   rT   -  s   
üþÿz _PooledSqliteDatabase._can_reuseNr|   r   r   r   r   r…   %  s    r…   c                   @   r   )ÚPooledSqliteDatabaseNr   r   r   r   r   r‡   6  r~   r‡   )r   rD   Úloggingr)   r=   Úcollectionsr   Úpeeweer   r   r   Ú	getLoggerrG   r   Ú
ValueErrorr   r   r!   Úobjectr"   rr   r}   r   r„   r…   r‡   r   r   r   r   Ú<module>   s,    

 S	