
    [hf4                    <   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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        rd
dlmZ d
dlmZ d
dlmZ  G d d          Z e            Zed             Zed             Zed             Zed             Z d2dZ! G d d          Z"d3dZ#ej$        	 	 	 	 d4d5d'            Z%ej$        	 	 	 	 d6d7d+            Z%	 	 	 	 	 	 d8d,Z%d2d-Z& G d. d/          Z' G d0 d1          Z(dS )9    )annotationsN)Any)Dict)Optional   )config)	decorator)
gc_collect   )event)pool)
await_only)Literal)Engine)URL)AsyncEnginec                  t    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zd Zd Zd Zd Zd ZdS )ConnectionKillerc                    t          j                    | _        t          j        t
                    | _        t                      | _        d S N)weakrefWeakKeyDictionary
proxy_refscollectionsdefaultdictsettesting_enginesdbapi_connectionsselfs    i/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/sqlalchemy/testing/engines.py__init__zConnectionKiller.__init__%   s7    !355*6s;;!$    c                    t          j        |d| j                   t          j        |d| j                   t          j        |d| j                   t          j        |d| j                   d S )Ncheckoutcheckincloseclose_detached)r   listen	_add_conn_remove_conn)r    r   s     r!   add_poolzConnectionKiller.add_pool*   sd    T:t~666T9d&7888T7D$5666T+T->?????r#   c                N    | j                             |           d| j        |<   d S )NT)r   addr   )r    	dbapi_con
con_record	con_proxys       r!   r*   zConnectionKiller._add_conn2   s+    ""9---%)	"""r#   c                :    | j                             |           d S r   )r   discard)r    
dbapi_connargs      r!   r+   zConnectionKiller._remove_conn6   s    &&z22222r#   c                    |                      |j                   |dv sJ | j        |                             |           d S )N)classglobalfunctionfixture)r,   r   r   r.   )r    enginescopes      r!   
add_enginezConnectionKiller.add_engine9   sJ    fk"""BBBBBU#''/////r#   c                z    	  |             d S # t           $ r"}t          j        d|z             Y d }~d S d }~ww xY w)Nz5testing_reaper couldn't rollback/close connection: %s	Exceptionwarningswarnr    fnes      r!   _safezConnectionKiller._safe?   so    	BDDDDD 	 	 	MG!K        	   
 
:5:c                z    t          | j                  D ]%}|!|j        r|                     |j                   &d S r   )listr   is_validrF   rollbackr    recs     r!   rollback_allzConnectionKiller.rollback_allG   sE    (( 	) 	)C3<

3<(((	) 	)r#   c                2   t          | j                  D ]D}|@|j        r9| j                            |j                   |                     |j                   E| j        D ]}|                     |j                   | j        	                                 d S r   )
rI   r   rJ   r   r3   dbapi_connectionrF   _checkinrK   clear)r    rM   cons      r!   checkin_allzConnectionKiller.checkin_allL   s     (( 	) 	)C3<&..s/CDDD

3<((( ) 	% 	%CJJs|$$$$$$&&&&&r#   c                .    |                                   d S r   )rT   r   s    r!   	close_allzConnectionKiller.close_all[   s    r#   c                n    t           j        sd S ddlm} |                    |j        j        |           d S Nr   )	provision)r   bootstrapped_as_sqlalchemy rY   prepare_for_drop_tablesr;   url)r    
connectionrY   s      r!   r\   z(ConnectionKiller.prepare_for_drop_tables^   sF    0 	F))**;*?LLLLLr#   c                   | j         |         }t          |          D ]}t          | j                  D ]:}|6|j        r/|j        (|j        |j        u r|                     |j                   ;t          |d          r"t          |
                                           |
                                 |                                 d S )Nsync_engine)r   rI   r   rJ   _poolr   rF   rQ   hasattrr   disposerR   )r    r<   engrM   	proxy_refs        r!   _drop_testing_enginesz&ConnectionKiller._drop_testing_enginesg   s    "5)99 	 	C!$/22 7 7	(Y-?(!3%Osx77

9#5666sM** 3;;==))))		r#   c                0    |                      d           d S )Nr9   )rf   r   s    r!   
after_testzConnectionKiller.after_testx   s    "":.....r#   c                    t           j        sd S |j        j        rd S |                                  ddlm} t           j                                        5 }|	                    |j
        j        |           d d d            d S # 1 swxY w Y   d S rX   )r   rZ   	__class__"__leave_connections_for_teardown__rT   r[   rY   dbconnectr\   r;   r]   )r    testrY   conns       r!   after_test_outside_fixturesz,ConnectionKiller.after_test_outside_fixtures{   s    0 	F>< 	F
 	 Y   	ED--dkotDDD	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	E 	Es   !BB
Bc                    |                                   |                     d           |                     d           d S )Nr9   r7   )rT   rf   r   s    r!   stop_test_class_inside_fixturesz0ConnectionKiller.stop_test_class_inside_fixtures   sB    "":...""7+++++r#   c                   t           j        j        rnt                       t           j        j        rQt	          t           j        j                  }t           j        j                                         	 J d|z              d S d S )NFz/%d connection recs not cleared after test suite)r   base_strong_ref_connection_recordsr
   lenrR   )r    lns     r!    stop_test_class_outside_fixturesz1ConnectionKiller.stop_test_class_outside_fixtures   s     93 	LLLLy7 LABB	8>>@@@LDKL L L	L 	LL Lr#   c                l    |                                   | j        D ]}|                     |           d S r   )rT   r   rf   )r    r<   s     r!   final_cleanupzConnectionKiller.final_cleanup   sG    ) 	. 	.E&&u----	. 	.r#   c                ,    | j         D ]}|j        rJ d S r   )r   rJ   rL   s     r!   assert_all_closedz"ConnectionKiller.assert_all_closed   s1    ? 	 	C| 	 	r#   N)__name__
__module____qualname__r"   r,   r*   r+   r=   rF   rN   rT   rV   r\   rf   rh   rp   rr   rx   rz   r|    r#   r!   r   r   $   s       ' ' '
@ @ @* * *3 3 30 0 0  ) ) )
' ' '  M M M  "/ / /E E E$, , ,
L L L. . .
    r#   r   c                    	  | |i | t                                            d S # t                                            w xY wr   )testing_reaperr|   rD   argskws      r!   assert_conns_closedr      sH    +
DB((*****((****	   % A c                    	  | |i | t                                            dS # t                                            w xY w)zBDecorator that rolls back all open connections after fn execution.N)r   rN   r   s      r!   rollback_open_connectionsr      sH    &
DB##%%%%%##%%%%r   c                H    t                                             | |i | dS )z:Decorator that closes all connections before fn execution.Nr   rT   r   s      r!   close_firstr      s+        BOOOOOOr#   c                    	  | |i | t                                            dS # t                                            w xY w)z9Decorator that closes all connections after fn execution.Nr   r   s      r!   close_open_connectionsr      sH    %
DB""$$$$$""$$$$r   c              #     K   dd l m} |j        D ]W}| r|| v r	t          ||d           }|s%t          t	          d|z            j        |          }|                                V  Xd S )Nr   zsqlalchemy.dialects.%s)sqlalchemy.dialectsdialects__all__getattr
__import__dialect)excludednamemods       r!   all_dialectsr      s      ######	 	 	 	twat$$ 	3d:;;Dd C kkmm	 	r#   c                  4    e Zd Zd Zd Zd Zd Zd	dZd ZdS )
ReconnectFixturec                0    || _         g | _        d| _        d S NF)dbapiconnections
is_stopped)r    r   s     r!   r"   zReconnectFixture.__init__   s    
r#   c                ,    t          | j        |          S r   )r   r   r    keys     r!   __getattr__zReconnectFixture.__getattr__   s    tz3'''r#   c                    | j         j        |i |}| j        rM|                     |j                   |                                }|                    d           J d            | j                            |           |S )Nzselect 1Fz%simulated connect failure didn't work)	r   rm   r   rF   r'   cursorexecuter   append)r    r   kwargsro   curss        r!   rm   zReconnectFixture.connect   s    !tz!42622? 		JJtz""";;==D LL$$$AAAAA##D)))Kr#   c                z    	  |             d S # t           $ r"}t          j        d|z             Y d }~d S d }~ww xY w)Nz.ReconnectFixture couldn't close connection: %sr?   rC   s      r!   rF   zReconnectFixture._safe   sb    	PBDDDDD 	P 	P 	PMJQNOOOOOOOOO	PrG   Fc                    || _         t          | j                  D ]}|                     |j                   g | _        d S r   )r   rI   r   rF   r'   )r    stopcs      r!   shutdownzReconnectFixture.shutdown   sJ     d&'' 	  	 AJJqwr#   c                    d| _         d S r   )r   r   s    r!   restartzReconnectFixture.restart  s    r#   N)F)	r}   r~   r   r"   r   rm   rF   r   r   r   r#   r!   r   r      sv             
( ( (  P P P	 	 	 	         r#   r   c                (   | pt           j        j        } t           j        j        j        }|si }t          |          |d<   t          | |          j        fd}j        j        j        _	        j        j        j
        _        |_        S )Nmodulec                 z    j         j                                         dj         j        _                       d S r   )r   r   r   r   )_disposer;   s   r!   rc   z$reconnecting_engine.<locals>.dispose  s6    %%'''*/'




r#   )r   rl   r]   r   r   r   testing_enginerc   r   test_shutdownr   test_restart)r]   optionsr   rc   r   r;   s       @@r!   reconnecting_enginer   
  s    

CI#E (//GHC))F~H     
 ">/8F ..6FFNMr#   Fr]   Optional[URL]r   Optional[Dict[str, Any]]asyncioLiteral[False]transfer_staticpoolboolreturnr   c                    d S r   r   r]   r   r   r   s       r!   r   r     s	     Sr#   TLiteral[True]r   c                    d S r   r   r   s       r!   r   r   '  s	     #r#   c                r   |r|rJ ddl m} nddlm} ddlm} |sd}d}	d}
nB|                    dd          }|                    d	d          }	|                    d
d          }
| pt          j        j	        }  ||           } t          j        | j
        t          j        j	        j
        k    r+t          j        rt          j                                        }ni }||                    |            || fi |}|
rG|j        dk    r<t          j        |d          d             }t          j        |d          d             }|r]ddlm} t          j        Jt'          t          j        j        |          r+d}|j                            t          j        j                   n|rt          j        j        |_        |	dk    r|rd|j        _        nd|_        t'          |j        t(          j                  r$d|vr d|vrd|vrd|j        _        d|j        _        |rt6                              ||	           |S )Nr   )create_async_engine)create_engine)make_urlTr9   F
use_reaperr<   sqlite_savepointsqliterm   c                    d | _         d S r   )isolation_level)rP   connection_records     r!   
do_connectz"testing_engine.<locals>.do_connect\  s    /3,,,r#   beginc                0    |                      d           d S )NBEGIN)exec_driver_sql)ro   s    r!   do_beginz testing_engine.<locals>.do_begin`  s      )))))r#   )
StaticPoolr8   r   pool_timeoutmax_overflow)sqlalchemy.ext.asyncior   
sqlalchemyr   sqlalchemy.engine.urlr   popr   rl   r]   
drivernamedb_optscopyupdater   r   listens_forsqlalchemy.poolr   
isinstancer   _transfer_fromr`   _has_events	QueuePool_timeout_max_overflowr   r=   )r]   r   r   r   
share_pool_sqlite_savepointr   r   r   r<   r   use_optionsr;   r   r   r   s                   r!   r   r   0  s     -$$$$	
 	
 	
 	
 	
 	
 	
 	-,,,,,...... B
 [[t44
GZ00";;'95AA

C
(3--C 		S^vy}/GGG
. Hn))++7###]3..+..F *FK833		69	-	-	4 	4 
.	-	4 
	67	+	+	* 	* 
,	+	*  %......9 Z	
%K%K JK&&vy~666	 %in 	-1F**  
 	6;//&+%%+--+-- $%! 1!!&%000Mr#   c                    ddl m} | st          j        j        } g fd}fd}fd} || dz   |          t          d          rJ _        |_        |_        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                2                         |            d S r   )r   )sqlar   buffers      r!   executorzmock_engine.<locals>.executor  s    cr#   c                @    d D             }|| k    s
J |            d S )Nc           	     T    g | ]%}t          j        d dt          |                    &S )z[\n\t]r[   )resubstr).0ss     r!   
<listcomp>z3mock_engine.<locals>.assert_sql.<locals>.<listcomp>  s,    >>>!y"c!ff-->>>r#   r   )stmtsrecvr   s     r!   
assert_sqlzmock_engine.<locals>.assert_sql  s-    >>v>>>u}}}d}}}}}r#   c                 `     j          d                     fdj        D                       S )N
c              3  ^   K   | ]'}t          |                                         V  (dS ))r   N)r   compile)r   r   r   s     r!   	<genexpr>z1mock_engine.<locals>.print_sql.<locals>.<genexpr>  s9      HHqQYYqY1122HHHHHHr#   )r   joinmock)r   r;   s   @r!   	print_sqlzmock_engine.<locals>.print_sql  s4    NyyHHHHFKHHHHHHr#   z://r  )	r   r   r   rl   r   rb   r  r   r  )dialect_namer   r   r   r  r   r;   s        @@r!   mock_enginer    s     .----- &y~F    # # # # #I I I I I  u 4h??Fvv&&&&&FK"F FMr#   c                  2    e Zd ZdZd ZddZd Zd Zd ZdS )	DBAPIProxyCursorzuProxy a DBAPI cursor.

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

    c                F    || _         || _         |j        |i || _        d S r   )r;   r^   r   )r    r;   ro   r   r   s        r!   r"   zDBAPIProxyCursor.__init__  s,    !dk42622r#   Nc                T    |r | j         j        ||fi |S  | j         j        |fi |S r   )r   r   )r    stmt
parametersr   s       r!   r   zDBAPIProxyCursor.execute  sF     	3&4;&tZ>>2>>>&4;&t22r222r#   c                *     | j         j        ||fi |S r   )r   executemany)r    r  paramsr   s       r!   r  zDBAPIProxyCursor.executemany  s!    &t{&tV::r:::r#   c                *    t          | j                  S r   )iterr   r   s    r!   __iter__zDBAPIProxyCursor.__iter__  s    DK   r#   c                ,    t          | j        |          S r   )r   r   r   s     r!   r   zDBAPIProxyCursor.__getattr__  s    t{C(((r#   r   )	r}   r~   r   __doc__r"   r   r  r  r   r   r#   r!   r
  r
    sn         3 3 3
3 3 3 3; ; ;! ! !) ) ) ) )r#   r
  c                  *    e Zd ZdZd Zd Zd Zd ZdS )DBAPIProxyConnectionz}Proxy a DBAPI connection.

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

    c                0    || _         || _        || _        d S r   )ro   r;   
cursor_cls)r    r;   ro   r  s       r!   r"   zDBAPIProxyConnection.__init__  s    	$r#   c                :     | j         | j        | j        g|R i |S r   )r  r;   ro   )r    r   r   s      r!   r   zDBAPIProxyConnection.cursor  s*    tt{DIGGGGGGGr#   c                8    | j                                          d S r   )ro   r'   r   s    r!   r'   zDBAPIProxyConnection.close  s    	r#   c                ,    t          | j        |          S r   )r   ro   r   s     r!   r   z DBAPIProxyConnection.__getattr__  s    ty#&&&r#   N)r}   r~   r   r  r"   r   r'   r   r   r#   r!   r  r    s]         % % %
H H H  ' ' ' ' 'r#   r  r   )NN)NNFF)
r]   r   r   r   r   r   r   r   r   r   )NNTF)
r]   r   r   r   r   r   r   r   r   r   )NNFFFF))
__future__r   r   r   typingr   r   r   rA   r   r[   r   utilr	   r
   r   r   r   util.typingr   TYPE_CHECKINGr;   r   
engine.urlr   ext.asyncior   r   r   r   r   r   r   r   r   r   overloadr   r  r
  r  r   r#   r!   <module>r&     s@   # " " " " "     				                                                          ! ! ! ! ! ! 
 *      ))))))C C C C C C C CL "!## + + + & & &    % % %   (  (  (  (  (  (  (  ( V   ( (,# %	     (,! %	     	P P P Pf# # # #L) ) ) ) ) ) ) ):' ' ' ' ' ' ' ' ' 'r#   