U
    uiK5                     @  s  d dl m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	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 ddlmZ ddlmZ ejrddlmZ ddlmZ ddlmZ G dd dZe Zedd Zedd Zedd Z edd Z!d9ddZ"G dd  d Z#d:d!d"Z$ej%d;d$d%d&d'd(d)d*Z&ej%d<d$d%d+d,d(d-d*Z&d=d.d/d$d%d0d1d(d2d*Z&d>d3d4Z'G d5d6 d6Z(G d7d8 d8Z)dS )?    )annotationsN)Any)Dict)Optional)Union   )config)	decorator)
gc_collect   )event)pool)
await_only)Literal)Engine)URL)AsyncEnginec                   @  s   e Z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d Zdd  Zd!d" Zd#d$ Zd%S )&ConnectionKillerc                 C  s"   t  | _tt| _t | _d S N)weakrefWeakKeyDictionary
proxy_refscollectionsdefaultdictsettesting_enginesdbapi_connectionsself r   T/home/lhs5088/backend/venv/lib/python3.8/site-packages/sqlalchemy/testing/engines.py__init__&   s    
zConnectionKiller.__init__c                 C  sD   t |d| j t |d| j t |d| j t |d| j d S )NcheckoutZcheckincloseZclose_detached)r   listen	_add_conn_remove_conn)r   r   r   r   r    add_pool+   s    zConnectionKiller.add_poolc                 C  s   | j | d| j|< d S )NT)r   addr   )r   Z	dbapi_conZ
con_recordZ	con_proxyr   r   r    r%   3   s    zConnectionKiller._add_connc                 G  s   | j | d S r   )r   discard)r   Z
dbapi_connargr   r   r    r&   7   s    zConnectionKiller._remove_connc                 C  s,   |  |j |dkst| j| | d S )N)classglobalfunctionZfixture)r'   r   AssertionErrorr   r(   )r   enginescoper   r   r    
add_engine:   s    zConnectionKiller.add_enginec              
   C  s@   z
|  W n0 t k
r: } ztd|  W 5 d }~X Y nX d S )Nz5testing_reaper couldn't rollback/close connection: %s	Exceptionwarningswarnr   fner   r   r    _safe@   s    
zConnectionKiller._safec                 C  s.   t | jD ]}|d k	r
|jr
| |j q
d S r   )listr   is_validr9   rollbackr   recr   r   r    rollback_allH   s    zConnectionKiller.rollback_allc                 C  s^   t | jD ],}|d k	r
|jr
| j|j | |j q
| jD ]}| |j q>| j	  d S r   )
r:   r   r;   r   r)   Zdbapi_connectionr9   _checkinr<   clear)r   r>   conr   r   r    checkin_allM   s    
zConnectionKiller.checkin_allc                 C  s   |    d S r   )rC   r   r   r   r    	close_all\   s    zConnectionKiller.close_allc                 C  s*   t js
d S ddlm} ||jj| d S Nr   	provision)r   bootstrapped_as_sqlalchemy rG   prepare_for_drop_tablesr/   url)r   
connectionrG   r   r   r    rJ   _   s    z(ConnectionKiller.prepare_for_drop_tablesc                 C  s   | j | }t|D ]d}t| jD ]4}|d k	r |jr |jd k	r |j|jkr | |j q t|drnt	|
  q|
  q|  d S Nsync_engine)r   r:   r   r;   _poolr   r9   r@   hasattrr   disposerA   )r   r0   engr>   Z	proxy_refr   r   r    _drop_testing_enginesh   s    



z&ConnectionKiller._drop_testing_enginesc                 C  s<   | j | }t|D ]$}t|dr.t|  q|  qd S rM   )r   r:   rP   r   rQ   )r   r0   rR   r>   r   r   r    _dispose_testing_enginesz   s
    

z)ConnectionKiller._dispose_testing_enginesc                 C  s   |  d d S )Nr-   )rS   r   r   r   r    
after_test   s    zConnectionKiller.after_testc              	   C  sT   t js
d S |jjrd S |   ddlm} t j }|	|j
j| W 5 Q R X d S rE   )r   rH   	__class__Z"__leave_connections_for_teardown__rC   rI   rG   dbconnectrJ   r/   rK   )r   testrG   connr   r   r    after_test_outside_fixtures   s    z,ConnectionKiller.after_test_outside_fixturesc                 C  s    |    | d | d d S )Nr-   r+   )rC   rS   r   r   r   r    stop_test_class_inside_fixtures   s    
z0ConnectionKiller.stop_test_class_inside_fixturesc                 C  sZ   t jjr>t  t jjr>tt jj}t jj  ds>td| tjrVtjj	rV| 
d d S )NFz/%d connection recs not cleared after test suiter,   )r   baseZ_strong_ref_connection_recordsr
   lenrA   r.   r   optionslow_connectionsrT   )r   lnr   r   r     stop_test_class_outside_fixtures   s    z1ConnectionKiller.stop_test_class_outside_fixturesc                 C  s"   |    | jD ]}| | qd S r   )rC   r   rS   )r   r0   r   r   r    final_cleanup   s    
zConnectionKiller.final_cleanupc                 C  s   | j D ]}|jrdstqd S NF)r   r;   r.   r=   r   r   r    assert_all_closed   s    
z"ConnectionKiller.assert_all_closedN)__name__
__module____qualname__r!   r'   r%   r&   r1   r9   r?   rC   rD   rJ   rS   rT   rU   r[   r\   rb   rc   re   r   r   r   r    r   %   s$   	r   c                 O  s   z| || W 5 t   X d S r   )testing_reaperre   r7   argskwr   r   r    assert_conns_closed   s    rm   c                 O  s   z| || W 5 t   X dS )zBDecorator that rolls back all open connections after fn execution.N)ri   r?   rj   r   r   r    rollback_open_connections   s    rn   c                 O  s   t   | || dS )z:Decorator that closes all connections before fn execution.Nri   rC   rj   r   r   r    close_first   s    rp   c                 O  s   z| || W 5 t   X dS )z9Decorator that closes all connections after fn execution.Nro   rj   r   r   r    close_open_connections   s    rq   c                 c  sX   dd l m} |jD ]@}| r$|| kr$qt||d }|sHttd| j|}| V  qd S )Nr   zsqlalchemy.dialects.%s)Zsqlalchemy.dialectsZdialects__all__getattr
__import__dialect)excludednamemodr   r   r    all_dialects   s    
 rz   c                   @  s>   e Zd Zdd Zdd Zdd Zdd Zdd
dZdd ZdS )ReconnectFixturec                 C  s   || _ g | _d| _d S rd   )dbapiconnections
is_stopped)r   r|   r   r   r    r!      s    zReconnectFixture.__init__c                 C  s   t | j|S r   )rs   r|   r   keyr   r   r    __getattr__   s    zReconnectFixture.__getattr__c                 O  sT   | j j||}| jr@| |j | }|d dsPtdn| j	| |S d S )Nzselect 1Fz%simulated connect failure didn't work)
r|   rX   r~   r9   r#   cursorexecuter.   r}   append)r   rk   kwargsrZ   Zcursr   r   r    rX      s    
zReconnectFixture.connectc              
   C  s@   z
|  W n0 t k
r: } ztd|  W 5 d }~X Y nX d S )Nz.ReconnectFixture couldn't close connection: %sr2   r6   r   r   r    r9     s    
zReconnectFixture._safeFc                 C  s,   || _ t| jD ]}| |j qg | _d S r   )r~   r:   r}   r9   r#   )r   stopcr   r   r    shutdown	  s    zReconnectFixture.shutdownc                 C  s
   d| _ d S rd   )r~   r   r   r   r    restart  s    zReconnectFixture.restartN)F)	rf   rg   rh   r!   r   rX   r9   r   r   r   r   r   r    r{      s   
r{   c                   sj   | p
t jj} t jjj}|si }t||d< t| |j  fdd}jjj_	jjj
_|_S )Nmodulec                     s    j j  dj j_   d S rd   )ru   r|   r   r~   r   Z_disposer/   r   r    rQ   !  s    
z$reconnecting_engine.<locals>.dispose)r   rW   rK   ru   r|   r{   testing_enginerQ   r   Ztest_shutdownr   Ztest_restart)rK   r_   r|   rQ   r   r   r    reconnecting_engine  s    

r   .zOptional[URL]zOptional[Dict[str, Any]]zLiteral[False]r   )rK   r_   asyncioreturnc                C  s   d S r   r   rK   r_   r   r   r   r    r   ,  s    r   zLiteral[True]r   c                C  s   d S r   r   r   r   r   r    r   5  s    F)r   boolzUnion[Engine, AsyncEngine]c                C  s@  |rddl m} nddlm} ddlm} || r4| ntjj} |sFi }i }tj	|fD ]"}|s^qT|
dd | D  qT|| f|}tjrtjjrtd |dd	}|dkr|rd
|j_nd
|_ddlm}	 |	|j||| |dd
}
|
rt|| t|jtjr<d|kr<d|kr<d|kr<d|j_d|j_|S )Nr   )create_async_engine)create_engine)make_urlc                 S  s(   i | ] \}}|d kr| ds||qS ))r0   
use_reaperZsqlite_)
startswith).0optvaluer   r   r    
<dictcomp>X  s
   
 z"testing_engine.<locals>.<dictcomp>r,   r0   r-   Tr   rF   r   r   pool_timeoutZmax_overflow)Zsqlalchemy.ext.asyncior   
sqlalchemyr   Zsqlalchemy.engine.urlr   r   rW   rK   Zdb_optsupdateitemsr_   r`   ri   rT   getrN   Z_has_eventsrI   rG   Zpost_configure_testing_enginer1   
isinstancer   Z	QueuePool_timeoutZ_max_overflow)rK   r_   r   r   r   Zuse_optionsopt_dictr/   r0   rG   r   r   r   r    r   >  sR    	

c                   sr   ddl m} | stjj} g   fdd} fdd}fdd}|| d	 |td
r\t _|_|_	S )a'  Provides a mocking engine based on the current testing.db.

    This is normally used to test DDL generation flow as emitted
    by an Engine.

    It should not be used in other cases, as assert_compile() and
    assert_sql_execution() are much better choices with fewer
    moving parts.

    r   )create_mock_enginec                   s     |  d S r   )r   )sqlarl   bufferr   r    executor  s    zmock_engine.<locals>.executorc                   s"   dd  D }|| kst |d S )Nc                 S  s   g | ]}t d dt|qS )z[\n\t]rI   )resubstrr   sr   r   r    
<listcomp>  s     z3mock_engine.<locals>.assert_sql.<locals>.<listcomp>)r.   )Zstmtsrecvr   r   r    
assert_sql  s    zmock_engine.<locals>.assert_sqlc                     s    j  d fddjD S )N
c                 3  s   | ]}t |j d V  qdS ))ru   N)r   compiler   rw   r   r    	<genexpr>  s     z1mock_engine.<locals>.print_sql.<locals>.<genexpr>)ru   joinmockr   )r/   r   r    	print_sql  s    zmock_engine.<locals>.print_sqlz://r   )
r   r   r   rW   rx   rP   r.   r   r   r   )Zdialect_namer   r   r   r   r   )r   r/   r    mock_engine  s    r   c                   @  s:   e Zd ZdZdd ZdddZdd Zd	d
 Zdd ZdS )DBAPIProxyCursorzuProxy a DBAPI cursor.

    Tests can provide subclasses of this to intercept
    DBAPI-level cursor operations.

    c                 O  s   || _ || _|j||| _d S r   )r/   rL   r   )r   r/   rZ   rk   r   r   r   r    r!     s    zDBAPIProxyCursor.__init__Nc                 K  s*   |r| j j||f|S | j j|f|S d S r   )r   r   )r   stmt
parametersrl   r   r   r    r     s    zDBAPIProxyCursor.executec                 K  s   | j j||f|S r   )r   executemany)r   r   paramsrl   r   r   r    r     s    zDBAPIProxyCursor.executemanyc                 C  s
   t | jS r   )iterr   r   r   r   r    __iter__  s    zDBAPIProxyCursor.__iter__c                 C  s   t | j|S r   )rs   r   r   r   r   r    r     s    zDBAPIProxyCursor.__getattr__)N)	rf   rg   rh   __doc__r!   r   r   r   r   r   r   r   r    r     s   
r   c                   @  s0   e Zd ZdZdd Zdd Zdd Zdd	 Zd
S )DBAPIProxyConnectionz}Proxy a DBAPI connection.

    Tests can provide subclasses of this to intercept
    DBAPI-level connection operations.

    c                 C  s   || _ || _|| _d S r   )rZ   r/   
cursor_cls)r   r/   rZ   r   r   r   r    r!     s    zDBAPIProxyConnection.__init__c                 O  s   | j | j| jf||S r   )r   r/   rZ   )r   rk   r   r   r   r    r     s    zDBAPIProxyConnection.cursorc                 C  s   | j   d S r   )rZ   r#   r   r   r   r    r#     s    zDBAPIProxyConnection.closec                 C  s   t | j|S r   )rs   rZ   r   r   r   r    r     s    z DBAPIProxyConnection.__getattr__N)rf   rg   rh   r   r!   r   r#   r   r   r   r   r    r     s
   r   )N)NN)..)..)NN)N)*
__future__r   r   r   typingr   r   r   r   r4   r   rI   r   utilr	   r
   r   r   r   Zutil.typingr   TYPE_CHECKINGr/   r   Z
engine.urlr   Zext.asyncior   r   ri   rm   rn   rp   rq   rz   r{   r   overloadr   r   r   r   r   r   r   r    <module>
   sd    

	


+
    	  I
&