o
    Rh                      @   sj   d dl Z d dlZd dlZddlmZ ddlmZmZmZ 		ddd	Z			dd
dZ
G dd de jZdS )    N   )connect)_PoolContextManager_PoolConnectionContextManager_PoolAcquireContextManager
   Fc                 K   s"   t d| ||||d|}t|S )Nminsizemaxsizeechopool_recycleloop )_create_poolr   )r
   r   r   r   r   kwargscoror   r   O/home/air/sanwanet/backup_V2/venv/lib/python3.10/site-packages/aiomysql/pool.pycreate_pool   s   
r   c              	      s   |d u r	t  }td| ||||d|}| dkr@|j4 I d H  |dI d H  W d   I d H  |S 1 I d H s;w   Y  |S )Nr	   r   Fr   )asyncioget_event_loopPool_cond_fill_free_pool)r
   r   r   r   r   r   poolr   r   r   r      s   
r   c                   @   s   e Zd ZdZdd Zedd Zedd Zedd	 Zed
d Z	e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dd Zdd Zd d! Zd"d# Zd$d% Zd&d' Zd(d) Zd*d+ Zd,d- Zd.S )/r   zConnection poolc                 K   s   |dk rt d||k r|dkrt d|| _|| _|| _d| _tj|p%d d| _t	 | _
t | _t | _d| _d| _|| _|| _d S )Nr   z!minsize should be zero or greaterz'maxsize should be not less than minsize)maxlenF)
ValueError_minsize_loop_conn_kwargs
_acquiringcollectionsdeque_freer   	Conditionr   set_used_terminated_closing_closed_echo_recycle)selfr
   r   r   r   r   r   r   r   r   __init__$   s    

zPool.__init__c                 C      | j S N)r*   r,   r   r   r   r   6      z	Pool.echoc                 C   r.   r/   )r   r0   r   r   r   r
   :   r1   zPool.minsizec                 C   s   | j jS r/   )r#   r   r0   r   r   r   r   >   s   zPool.maxsizec                 C   s   | j t| j | j S r/   )freesizelenr&   r    r0   r   r   r   sizeB   s   z	Pool.sizec                 C   s
   t | jS r/   )r3   r#   r0   r   r   r   r2   F   s   
zPool.freesizec              	      sp   | j 4 I dH # | jr| j }| I dH  | js| j   W d  I dH  dS 1 I dH s1w   Y  dS )z#Close all free connections in pool.N)r   r#   popleftensure_closednotifyr,   connr   r   r   clearJ   s   
.z
Pool.clearc                 C   r.   )zW
        The readonly property that returns ``True`` if connections is closed.
        )r)   r0   r   r   r   closedR   s   zPool.closedc                 C   s   | j rdS d| _dS )zClose pool.

        Mark all pool connections to be closed on getting back to pool.
        Closed pool doesn't allow to acquire new connections.
        NT)r)   r(   r0   r   r   r   closeY   s   
z
Pool.closec                 C   s:   |    t| jD ]}|   | j| q	| j  dS )zbTerminate pool.

        Close pool with instantly closing all acquired connections also.
        N)r<   listr&   r'   addr:   r8   r   r   r   	terminatec   s
   zPool.terminatec              	      s   | j rdS | jstd| jr| j }|  | js| j4 I dH  | j| jkr8| j	 I dH  | j| jks*W d  I dH  n1 I dH sHw   Y  d| _ dS )z(Wait for closing all pool's connections.Nz..wait_closed() should be called after .close()T)
r)   r(   RuntimeErrorr#   r5   r<   r   r4   r2   waitr8   r   r   r   wait_closedq   s   
(
zPool.wait_closedc                 C   s   |   }t|| S )z&Acquire free connection from the pool.)_acquirer   )r,   r   r   r   r   acquire   s   
zPool.acquirec              	      s   | j rtd| j4 I d H @ 	 | dI d H  | jrF| j }|jr(J ||| jvs4J || jf| j| |W  d   I d H  S | j	 I d H  q1 I d H sUw   Y  d S )Nz,Cannot acquire connection after closing poolT)
r(   r@   r   r   r#   r5   r;   r&   r>   rA   r8   r   r   r   rC      s    

zPool._acquirec              	      s  t | j}d}||k rZ| jd }|j s|j r%| j  |  n-|jjr3| j  |  n| jdkrM| j	
 |j | jkrM| j  |  n| j  |d7 }||k s| j| jk r|  jd7  _z$td| j| j	d| jI d H }| j| | j  W |  jd8  _n|  jd8  _w | j| jk s`| jrd S |r| jr| j| jk r|  jd7  _z%td| j| j	d| jI d H }| j| | j  W |  jd8  _d S |  jd8  _w d S d S )Nr   r   r   )r   r   r   )r3   r#   _readerat_eof	exceptionpopr<   eof_receivedr+   r   time
last_usagerotater4   r
   r    r   r*   r   appendr   r7   r   )r,   override_min	free_sizenr9   r   r   r   r      sP   









 
"zPool._fill_free_poolc              	      sL   | j 4 I d H  | j   W d   I d H  d S 1 I d H sw   Y  d S r/   )r   r7   r0   r   r   r   _wakeup   s   .zPool._wakeupc                 C   s   | j  }|d || jv r|jsJ || j| |S || jv s*J || jf| j| |jsU| }|r?|  |S | j	rG|  n| j
| | j |  }|S )zcRelease free connection back to the connection pool.

        This is **NOT** a coroutine.
        N)r   create_future
set_resultr'   r;   remover&   get_transaction_statusr<   r(   r#   rM   create_taskrQ   )r,   r9   futin_transr   r   r   release   s$   



zPool.releasec                 C   s   t d)Nz9"yield from" should be used as context manager expression)r@   r0   r   r   r   	__enter__   s   zPool.__enter__c                 G   s   d S r/   r   )r,   argsr   r   r   __exit__   s   zPool.__exit__c                 c   s    |   E d H }t| |S r/   )rD   r   r8   r   r   r   __iter__   s   
zPool.__iter__c                 c   s.    d}t j|tdd |  E d H }t| |S )NzPwith await pool as conn deprecated, useasync with pool.acquire() as conn instead   )
stacklevel)warningswarnDeprecationWarningrD   r   )r,   msgr9   r   r   r   	__await__  s
   
zPool.__await__c                    s   | S r/   r   r0   r   r   r   
__aenter__	  s   zPool.__aenter__c                    s   |    |  I d H  d S r/   )r<   rB   )r,   exc_typeexc_valexc_tbr   r   r   	__aexit__  s   zPool.__aexit__N)__name__
__module____qualname____doc__r-   propertyr   r
   r   r4   r2   r:   r;   r<   r?   rB   rD   rC   r   rQ   rY   rZ   r\   r]   rd   re   ri   r   r   r   r   r   !   s<    






3r   )r   r   Fr   N)r   r!   r`   
connectionr   utilsr   r   r   r   r   AbstractServerr   r   r   r   r   <module>   s   

