
    ,hf4                    T   S SK Jr  S SKrS SKrS SKrS SKJr  S SKJr  S SKJr  S SKrS SK	r	SSK
Jr  SSKJr  SS	KJr  S
SK
Jr  S
SK
Jr  S
SKJr  S
SKJr  \R(                  (       a  S
SKJr  S
SKJr  S
SKJr   " S S5      r\" 5       r\S 5       r\S 5       r\S 5       r\S 5       r S$S jr! " S S5      r"S%S jr#\RH                      S&         S'S jj5       r%\RH                      S(         S)S jj5       r%      S*S jr%S$S jr& " S  S!5      r' " S" S#5      r(g)+    )annotationsN)Any)Dict)Optional   )config)	decorator)
gc_collect   )event)pool)
await_only)Literal)Engine)URL)AsyncEnginec                  z    \ rS rSrS rS rS rS rS rS r	S r
S	 rS
 rS rS rS rS rS rS rS rS rSrg)ConnectionKiller$   c                    [         R                  " 5       U l        [        R                  " [
        5      U l        [        5       U l        g N)weakrefWeakKeyDictionary
proxy_refscollectionsdefaultdictsettesting_enginesdbapi_connectionsselfs    R/var/www/auris/envauris/lib/python3.13/site-packages/sqlalchemy/testing/engines.py__init__ConnectionKiller.__init__%   s/    !335*66s;!$    c                   [         R                  " USU R                  5        [         R                  " USU R                  5        [         R                  " USU R                  5        [         R                  " USU R                  5        g )Ncheckoutcheckincloseclose_detached)r   listen	_add_conn_remove_conn)r!   r   s     r"   add_poolConnectionKiller.add_pool*   sY    T:t~~6T9d&7&78T7D$5$56T+T->->?r%   c                X    U R                   R                  U5        SU R                  U'   g )NT)r   addr   )r!   	dbapi_con
con_record	con_proxys       r"   r,   ConnectionKiller._add_conn2   s$    ""9-%)	"r%   c                :    U R                   R                  U5        g r   )r   discard)r!   
dbapi_connargs      r"   r-   ConnectionKiller._remove_conn6   s    &&z2r%   c                    U R                  UR                  5        US;   d   eU R                  U   R                  U5        g )N)classglobalfunctionfixture)r.   r   r   r1   )r!   enginescopes      r"   
add_engineConnectionKiller.add_engine9   s:    fkk"BBBBU#''/r%   c                t     U" 5         g ! [          a#  n[        R                  " SU-  5         S nAg S nAff = f)Nz5testing_reaper couldn't rollback/close connection: %s	Exceptionwarningswarnr!   fnes      r"   _safeConnectionKiller._safe?   s5    	D 	MMG!K 	   
 
727c                    [        U R                  5       H6  nUc  M  UR                  (       d  M  U R                  UR                  5        M8     g r   )listr   is_validrL   rollbackr!   recs     r"   rollback_allConnectionKiller.rollback_allG   s2    (C3<<<

3<<( )r%   c                |   [        U R                  5       H[  nUc  M  UR                  (       d  M  U R                  R	                  UR
                  5        U R                  UR                  5        M]     U R                   H  nU R                  UR                  5        M      U R                  R                  5         g r   )
rP   r   rQ   r   r7   dbapi_connectionrL   _checkinrR   clear)r!   rT   cons      r"   checkin_allConnectionKiller.checkin_allL   s     (C3<<<&&..s/C/CD

3<<( ) ))CJJs||$ *$$&r%   c                $    U R                  5         g r   )r\   r    s    r"   	close_allConnectionKiller.close_all[   s    r%   c                    [         R                  (       d  g SSKJn  UR	                  UR
                  R                  U5        g Nr   )	provision)r   bootstrapped_as_sqlalchemy rc   prepare_for_drop_tablesr@   url)r!   
connectionrc   s      r"   rf   (ConnectionKiller.prepare_for_drop_tables^   s-    00))**;*;*?*?Lr%   c                   U R                   U   n[        U5       H  n[        U R                  5       H`  nUc  M  UR                  (       d  M  UR                  c  M*  UR                  UR
                  L d  ME  U R                  UR                  5        Mb     [        US5      (       a  [        UR                  5       5        M  UR                  5         M     UR                  5         g )Nsync_engine)r   rP   r   rQ   _poolr   rL   rY   hasattrr   disposerZ   )r!   rA   engrT   	proxy_refs        r"   _drop_testing_engines&ConnectionKiller._drop_testing_enginesg   s    ""5)9C!$//2	(Y-?-?-?!3%OOsxx7

9#5#56 3 sM**3;;=)  			r%   c                &    U R                  S5        g )Nr>   )rq   r    s    r"   
after_testConnectionKiller.after_testx   s    "":.r%   c                P   [         R                  (       d  g UR                  R                  (       a  g U R	                  5         SSKJn  [         R                  R                  5        nUR                  UR                  R                  U5        S S S 5        g ! , (       d  f       g = frb   )r   rd   	__class__"__leave_connections_for_teardown__r\   re   rc   dbconnectrf   r@   rg   )r!   testrc   conns       r"   after_test_outside_fixtures,ConnectionKiller.after_test_outside_fixtures{   se    00>><<
 	 YY D--dkkootD !  s   ''B
B%c                h    U R                  5         U R                  S5        U R                  S5        g )Nr>   r<   )r\   rq   r    s    r"   stop_test_class_inside_fixtures0ConnectionKiller.stop_test_class_inside_fixtures   s*    "":.""7+r%   c                B   [         R                  R                  (       a  [        5         [         R                  R                  (       aV  [	        [         R                  R                  5      n[         R                  R                  R                  5           SU-  5       eg g )Nz/%d connection recs not cleared after test suite)r   base_strong_ref_connection_recordsr
   lenrZ   )r!   lns     r"    stop_test_class_outside_fixtures1ConnectionKiller.stop_test_class_outside_fixtures   sq     9933Lyy77AAB		88>>@LDKL	 8 4r%   c                l    U R                  5         U R                   H  nU R                  U5        M     g r   )r\   r   rq   )r!   rA   s     r"   final_cleanupConnectionKiller.final_cleanup   s,    ))E&&u- *r%   c                P    U R                    H  nUR                  (       d  M   e   g r   )r   rQ   rS   s     r"   assert_all_closed"ConnectionKiller.assert_all_closed   s    ??C|||u #r%   )r   r   r   N)__name__
__module____qualname____firstlineno__r#   r.   r,   r-   rB   rL   rU   r\   r_   rf   rq   rt   r}   r   r   r   r   __static_attributes__ r%   r"   r   r   $   s[    '
@*30)
'M"/E$,
L.
r%   r   c                p     U " U0 UD6  [         R                  5         g ! [         R                  5         f = fr   )testing_reaperr   rJ   argskws      r"   assert_conns_closedr      s+    +
DB((*((*    5c                p     U " U0 UD6  [         R                  5         g! [         R                  5         f = f)zBDecorator that rolls back all open connections after fn execution.N)r   rU   r   s      r"   rollback_open_connectionsr      s+    &
DB##%##%r   c                <    [         R                  5         U " U0 UD6  g)z:Decorator that closes all connections before fn execution.Nr   r\   r   s      r"   close_firstr      s      OOr%   c                p     U " U0 UD6  [         R                  5         g! [         R                  5         f = f)z9Decorator that closes all connections after fn execution.Nr   r   s      r"   close_open_connectionsr      s+    %
DB""$""$r   c              #     #    SS K Jn  UR                   HX  nU (       a  X ;   a  M  [        XS 5      nU(       d"  [        [	        SU-  5      R                  U5      nUR                  5       v   MZ     g 7f)Nr   zsqlalchemy.dialects.%s)sqlalchemy.dialectsdialects__all__getattr
__import__dialect)excludednamemods       r"   all_dialectsr      s]     #		tat$3d:;DDdC kkm s   A0A2c                  <    \ rS rSrS rS rS rS rS
S jrS r	Sr
g	)ReconnectFixture   c                ,    Xl         / U l        SU l        g NF)dbapiconnections
is_stopped)r!   r   s     r"   r#   ReconnectFixture.__init__   s    
r%   c                .    [        U R                  U5      $ r   )r   r   r!   keys     r"   __getattr__ReconnectFixture.__getattr__   s    tzz3''r%   c                   U R                   R                  " U0 UD6nU R                  (       aC  U R                  UR                  5        UR                  5       nUR                  S5         S5       eU R                  R                  U5        U$ )Nzselect 1z%simulated connect failure didn't work)	r   rz   r   rL   r)   cursorexecuter   append)r!   r   kwargsr|   curss        r"   rz   ReconnectFixture.connect   so    zz!!4262??JJtzz";;=D LL$AAA5##D)Kr%   c                t     U" 5         g ! [          a#  n[        R                  " SU-  5         S nAg S nAff = f)Nz.ReconnectFixture couldn't close connection: %srE   rI   s      r"   rL   ReconnectFixture._safe   s4    	PD 	PMMJQNOO	PrN   c                    Xl         [        U R                  5       H  nU R                  UR                  5        M      / U l        g r   )r   rP   r   rL   r)   )r!   stopcs      r"   shutdownReconnectFixture.shutdown   s6     d&&'AJJqww (r%   c                    SU l         g r   )r   r    s    r"   restartReconnectFixture.restart  s	    r%   )r   r   r   N)F)r   r   r   r   r#   r   rz   rL   r   r   r   r   r%   r"   r   r      s!     
(P	 r%   r   c                  ^^ U =(       d    [         R                  R                  n [         R                  R                  R                  nU(       d  0 n[        U5      US'   [        X5      mTR                  mUU4S jnTR                  R                  R                  Tl	        TR                  R                  R                  Tl        UTl        T$ )Nmodulec                    > TR                   R                  R                  5         STR                   R                  l        T " 5         g r   )r   r   r   r   )_disposer@   s   r"   rn   $reconnecting_engine.<locals>.dispose  s0    %%'*/'
r%   )r   ry   rg   r   r   r   testing_enginern   r   test_shutdownr   test_restart)rg   optionsr   rn   r   r@   s       @@r"   reconnecting_enginer   
  s    

CII##E(/GHC)F~~H
 ">>//88F ....66FFNMr%   c                    g r   r   rg   r   asynciotransfer_staticpools       r"   r   r     s     r%   c                    g r   r   r   s       r"   r   r   '  s     r%   c                |   U(       a  U(       a   eSSK Jn  OSSKJn  SSKJn  U(       d  SnSn	Sn
O6UR                  SS5      nUR                  S	S5      n	UR                  S
S5      n
U =(       d    [        R                  R                  n U" U 5      n [        R                  b2  U R                  [        R                  R                  R                  :X  a4  [        R                  (       a  [        R                  R                  5       nO0 nUb  UR                  U5        U" U 40 UD6nU
(       aJ  UR                  S:X  a:  [        R                   " US5      S 5       n[        R                   " US5      S 5       nU(       av  SSKJn  [        R                  b^  ['        [        R                  R(                  U5      (       a5  SnUR(                  R+                  [        R                  R(                  5        O&U(       a  [        R                  R(                  Ul        U	S:X  a   U(       a  SUR,                  l        OSUl        ['        UR(                  [(        R0                  5      (       a4  SU;  a.  SU;  a(  SU;  a"  SUR(                  l        SUR(                  l        U(       a  [6        R9                  X5        U$ )Nr   )create_async_engine)create_engine)make_urlTr>   F
use_reaperrA   sqlite_savepointsqliterz   c                    S U l         g r   )isolation_level)rX   connection_records     r"   
do_connect"testing_engine.<locals>.do_connect\  s    /3,r%   beginc                &    U R                  S5        g )NBEGIN)exec_driver_sql)r|   s    r"   do_begin testing_engine.<locals>.do_begin`  s      )r%   )
StaticPoolr=   r   pool_timeoutmax_overflow)sqlalchemy.ext.asyncior   
sqlalchemyr   sqlalchemy.engine.urlr   popr   ry   rg   
drivernamedb_optscopyupdater   r   listens_forsqlalchemy.poolr   
isinstancer   _transfer_fromrk   _has_events	QueuePool_timeout_max_overflowr   rB   )rg   r   r   r   
share_pool_sqlite_savepointr   r   r   rA   r   use_optionsr@   r   r   r   s                   r"   r   r   0  s    $$$	
 	-.
 [[t4
GZ0";;'95A

C
3-C 			S^^vyy}}/G/GG
..nn))+7#3.+.FFKK83			69	-	4 
.	4 
		67	+	* 
,	* .99 Z		
%K%KJKK&&vyy~~6	iinn-1F*  
 	6;;//+%+-+- $%!!!&0Mr%   c                   ^^ SSK Jn  U (       d  [        R                  R                  n / mU4S jnU4S jnU4S jnU" U S-   U5      m[        TS5      (       a   eTTl        UTl        UTl        T$ )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                (   > TR                  U 5        g r   )r   )sqlar   buffers      r"   executormock_engine.<locals>.executor  s    cr%   c           
        > T Vs/ s H$  n[         R                  " SS[        U5      5      PM&     nnX :X  d   U5       eg s  snf )Nz[\n\t]re   )resubstr)stmtssrecvr
  s      r"   
assert_sqlmock_engine.<locals>.assert_sql  s<    7=>v!y"c!f-v>}"d"} ?s   +A c                 h   >^  TR                   m SR                  U 4S jTR                   5       5      $ )N
c              3  T   >#    U  H  n[        UR                  TS 95      v   M     g7f))r   N)r  compile).0r  r   s     r"   	<genexpr>1mock_engine.<locals>.print_sql.<locals>.<genexpr>  s$     HKqQYYqY122Ks   %()r   joinmock)r   r@   s   @r"   	print_sqlmock_engine.<locals>.print_sql  s%    NNyyHFKKHHHr%   z://r  )	r   r  r   ry   r   rm   r  r  r  )dialect_namer  r  r  r  r
  r@   s        @@r"   mock_enginer"    so     .yy~~F#I  u 4h?Fvv&&&&FK"F FMr%   c                  :    \ rS rSrSrS rS
S jrS rS rS r	S	r
g)DBAPIProxyCursori  ziProxy a DBAPI cursor.

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

c                J    Xl         X l        UR                  " U0 UD6U l        g r   )r@   rh   r   )r!   r@   r|   r   r   s        r"   r#   DBAPIProxyCursor.__init__  s!    kk4262r%   Nc                    U(       a  U R                   R                  " X40 UD6$ U R                   R                  " U40 UD6$ r   )r   r   )r!   stmt
parametersr   s       r"   r   DBAPIProxyCursor.execute  s9    ;;&&t>2>>;;&&t2r22r%   c                <    U R                   R                  " X40 UD6$ r   )r   executemany)r!   r(  paramsr   s       r"   r,  DBAPIProxyCursor.executemany  s    {{&&t:r::r%   c                ,    [        U R                  5      $ r   )iterr   r    s    r"   __iter__DBAPIProxyCursor.__iter__  s    DKK  r%   c                .    [        U R                  U5      $ r   )r   r   r   s     r"   r   DBAPIProxyCursor.__getattr__  s    t{{C((r%   )rh   r   r@   r   )r   r   r   r   __doc__r#   r   r,  r1  r   r   r   r%   r"   r$  r$    s     3
3;!)r%   r$  c                  0    \ rS rSrSrS rS rS rS rSr	g)	DBAPIProxyConnectioni  zqProxy a DBAPI connection.

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

c                (    X l         Xl        X0l        g r   )r|   r@   
cursor_cls)r!   r@   r|   r9  s       r"   r#   DBAPIProxyConnection.__init__  s    	$r%   c                X    U R                   " U R                  U R                  /UQ70 UD6$ r   )r9  r@   r|   )r!   r   r   s      r"   r   DBAPIProxyConnection.cursor  s%    t{{DIIGGGGr%   c                8    U R                   R                  5         g r   )r|   r)   r    s    r"   r)   DBAPIProxyConnection.close  s    		r%   c                .    [        U R                  U5      $ r   )r   r|   r   s     r"   r    DBAPIProxyConnection.__getattr__  s    tyy#&&r%   )r|   r9  r@   N)
r   r   r   r   r5  r#   r   r)   r   r   r   r%   r"   r7  r7    s    %
H'r%   r7  r   )NN)NNFF)
rg   Optional[URL]r   Optional[Dict[str, Any]]r   zLiteral[False]r   boolreturnr   )NNTF)
rg   rA  r   rB  r   zLiteral[True]r   rC  rD  r   )NNFFFF))
__future__r   r   r  typingr   r   r   rG   r   re   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$  r7  r   r%   r"   <module>rM     s   #  	             ! 
 )C CL "# + + & &   % %(  ( V( (,# %		%  	
   (,! %		%  	
   	Pf#L) ):' 'r%   