
    gf4                    :   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 d$dZ! G d d      Z"d%dZ#ejH                  	 	 	 	 d&	 	 	 	 	 	 	 	 	 d'd       Z%ejH                  	 	 	 	 d(	 	 	 	 	 	 	 	 	 d)d       Z%	 	 	 	 	 	 d*dZ%d$dZ& G d  d!      Z' G d" d#      Z(y)+    )annotationsN)Any)Dict)Optional   )config)	decorator)
gc_collect   )event)pool)
await_only)Literal)Engine)URL)AsyncEnginec                  r    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y)ConnectionKillerc                    t        j                         | _        t        j                  t
              | _        t               | _        y N)weakrefWeakKeyDictionary
proxy_refscollectionsdefaultdictsettesting_enginesdbapi_connectionsselfs    Y/var/www/html/AdoubleTech/venv/lib/python3.12/site-packages/sqlalchemy/testing/engines.py__init__zConnectionKiller.__init__%   s/    !335*66s;!$    c                   t        j                  |d| j                         t        j                  |d| j                         t        j                  |d| j                         t        j                  |d| j                         y )Ncheckoutcheckincloseclose_detached)r   listen	_add_conn_remove_conn)r    r   s     r!   add_poolzConnectionKiller.add_pool*   sY    T:t~~6T9d&7&78T7D$5$56T+T->->?r#   c                X    | j                   j                  |       d| j                  |<   y )NT)r   addr   )r    	dbapi_con
con_record	con_proxys       r!   r*   zConnectionKiller._add_conn2   s$    ""9-%)	"r#   c                :    | j                   j                  |       y r   )r   discard)r    
dbapi_connargs      r!   r+   zConnectionKiller._remove_conn6   s    &&z2r#   c                    | j                  |j                         |dv sJ | j                  |   j                  |       y )N)classglobalfunctionfixture)r,   r   r   r.   )r    enginescopes      r!   
add_enginezConnectionKiller.add_engine9   s:    fkk"BBBBU#''/r#   c                p    	  |        y # t         $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nz5testing_reaper couldn't rollback/close connection: %s	Exceptionwarningswarnr    fnes      r!   _safezConnectionKiller._safe?   s5    	D 	MMG!K 	   
 	505c                    t        | j                        D ]-  }||j                  s| j                  |j                         / y r   )listr   is_validrF   rollbackr    recs     r!   rollback_allzConnectionKiller.rollback_allG   s5    ( 	)C3<<

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

3<<(	) )) 	%CJJs||$	%$$&r#   c                $    | j                          y r   )rT   r   s    r!   	close_allzConnectionKiller.close_all[   s    r#   c                ~    t         j                  sy ddlm} |j	                  |j
                  j                  |       y Nr   )	provision)r   bootstrapped_as_sqlalchemy rY   prepare_for_drop_tablesr;   url)r    
connectionrY   s      r!   r\   z(ConnectionKiller.prepare_for_drop_tables^   s-    00))**;*;*?*?Lr#   c                   | j                   |   }t        |      D ]  }t        | j                        D ]S  }||j                  s|j                   |j                  |j
                  u s9| j                  |j                         U t        |d      rt        |j                                |j                           |j                          y )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)9 	C!$//2 7	(Y-?-?!3%OOsxx7

9#5#567 sM*3;;=)	 			r#   c                &    | j                  d       y )Nr9   )rf   r   s    r!   
after_testzConnectionKiller.after_testx   s    "":.r#   c                2   t         j                  sy |j                  j                  ry | j	                          ddlm} t         j                  j                         5 }|j                  |j                  j                  |       d d d        y # 1 sw Y   y xY w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{   sr    00>><<
 	 YY  	ED--dkkootD	E 	E 	Es   'BBc                h    | j                          | j                  d       | j                  d       y )Nr9   r7   )rT   rf   r   s    r!   stop_test_class_inside_fixturesz0ConnectionKiller.stop_test_class_inside_fixtures   s*    "":.""7+r#   c                .   t         j                  j                  r{t                t         j                  j                  rVt	        t         j                  j                        }t         j                  j                  j                          	 J d|z         y y )Nz/%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   sq     9933Lyy77AAB		88>>@LDKL	 8 4r#   c                h    | j                          | j                  D ]  }| j                  |        y r   )rT   r   rf   )r    r<   s     r!   final_cleanupzConnectionKiller.final_cleanup   s1    )) 	.E&&u-	.r#   c                B    | j                   D ]  }|j                  sJ  y r   )r   rJ   rL   s     r!   assert_all_closedz"ConnectionKiller.assert_all_closed   s!    ?? 	C||u	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0)
'M"/E$,
L.
r#   r   c                p    	  | |i | t         j                          y # t         j                          w xY wr   )testing_reaperr|   rD   argskws      r!   assert_conns_closedr      s+    +
DB((*((*    5c                p    	  | |i | t         j                          y# t         j                          w xY w)zBDecorator that rolls back all open connections after fn execution.N)r   rN   r   s      r!   rollback_open_connectionsr      s+    &
DB##%##%r   c                <    t         j                           | |i | y)z:Decorator that closes all connections before fn execution.Nr   rT   r   s      r!   close_firstr      s      OOr#   c                p    	  | |i | t         j                          y# t         j                          w xY w)z9Decorator that closes all connections after fn execution.Nr   r   s      r!   close_open_connectionsr      s+    %
DB""$""$r   c              #     K   dd l m} |j                  D ]L  }| r|| v r
t        ||d       }|s"t        t	        d|z        j                  |      }|j                          N y w)Nr   zsqlalchemy.dialects.%s)sqlalchemy.dialectsdialects__all__getattr
__import__dialect)excludednamemods       r!   all_dialectsr      sg     #		 	twat$3d:;DDdC kkm	s   A#A%c                  2    e Zd Zd Zd Zd Zd ZddZd Zy)	ReconnectFixturec                .    || _         g | _        d| _        y 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    tzz3''r#   c                    | j                   j                  |i |}| j                  rC| j                  |j                         |j                         }|j                  d       J d       | j                  j                  |       |S )Nzselect 1z%simulated connect failure didn't work)	r   rm   r   rF   r'   cursorexecuter   append)r    r   kwargsro   curss        r!   rm   zReconnectFixture.connect   sq    !tzz!!4262??JJtzz";;=D LL$AAA5##D)Kr#   c                p    	  |        y # t         $ r"}t        j                  d|z         Y d }~y d }~ww xY w)Nz.ReconnectFixture couldn't close connection: %sr?   rC   s      r!   rF   zReconnectFixture._safe   s4    	PD 	PMMJQNOO	PrG   c                    || _         t        | j                        D ]  }| j                  |j                          g | _        y r   )r   rI   r   rF   r'   )r    stopcs      r!   shutdownzReconnectFixture.shutdown   s=     d&&' 	 AJJqww	 r#   c                    d| _         y 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      s!     
(P	 r#   r   c                   | xs t         j                  j                  } t         j                  j                  j                  }|si }t        |      |d<   t        | |      j                  fd}j                  j                  j                  _	        j                  j                  j                  _        |_        S )Nmodulec                     j                   j                  j                          dj                   j                  _                  y r   )r   r   r   r   )_disposer;   s   r!   rc   z$reconnecting_engine.<locals>.dispose  s0    %%'*/'
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II##E(/GHC)F~~H
 ">>//88F ....66FFNMr#   c                     y r   r   r]   r   asynciotransfer_staticpools       r!   r   r     s     r#   c                     y r   r   r   s       r!   r   r   '  s     r#   c                   |r|rJ ddl m} nddlm} ddlm} |sd}d}	d}
n6|j                  dd      }|j                  d	d      }	|j                  d
d      }
| xs t        j                  j                  }  ||       } t        j                  1| j                  t        j                  j                  j                  k(  r/t        j                  rt        j                  j                         }ni }||j                  |        || fi |}|
rG|j                  dk(  r8t        j                   |d      d        }t        j                   |d      d        }|rpddlm} t        j                  {t'        t        j                  j(                  |      rWd}|j(                  j+                  t        j                  j(                         n!|rt        j                  j(                  |_        |	dk(  r|rd|j,                  _        nd|_        t'        |j(                  t(        j0                        r.d|vr*d|vr&d|vr"d|j(                  _        d|j(                  _        |rt6        j9                  ||	       |S )Nr   )create_async_engine)create_engine)make_urlTr9   F
use_reaperr<   sqlite_savepointsqliterm   c                    d | _         y r   )isolation_level)rP   connection_records     r!   
do_connectz"testing_engine.<locals>.do_connect\  s    /3,r#   beginc                &    | j                  d       y )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    $$$	
 	-.
 [[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JKK&&vyy~~6	iinn-1F*  
 	6;;/+%+-+- $%!!!&%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                (    j                  |        y r   )r   )sqlar   buffers      r!   executorzmock_engine.<locals>.executor  s    cr#   c           
         D cg c]"  }t        j                  ddt        |            $ }}|| k(  sJ |       y c c}w )Nz[\n\t]r[   )resubstr)stmtssrecvr   s      r!   
assert_sqlzmock_engine.<locals>.assert_sql  s=    7=>!y"c!f->>u}"d"} ?s   '<c                 f     j                    dj                   fdj                  D              S )N
c              3  T   K   | ]  }t        |j                                ! yw))r   N)r   compile).0r   r   s     r!   	<genexpr>z1mock_engine.<locals>.print_sql.<locals>.<genexpr>  s!     HqQYYqY12Hs   %()r   joinmock)r   r;   s   @r!   	print_sqlzmock_engine.<locals>.print_sql  s%    NNyyHFKK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     sl     .yy~~F#I  u 4h?Fvv&&&FK"F FMr#   c                  0    e Zd ZdZd ZddZd Zd Zd Zy)	DBAPIProxyCursorzuProxy a DBAPI cursor.

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

    c                N    || _         || _         |j                  |i || _        y r   )r;   r^   r   )r    r;   ro   r   r   s        r!   r"   zDBAPIProxyCursor.__init__  s'    !dkk4262r#   Nc                |    |r | j                   j                  ||fi |S  | j                   j                  |fi |S r   )r   r   )r    stmt
parametersr   s       r!   r   zDBAPIProxyCursor.execute  s?    &4;;&&tZ>2>>&4;;&&t2r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    DKK  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    s     3
3;!)r#   r  c                  (    e Zd ZdZd Zd Zd Zd Zy)DBAPIProxyConnectionz}Proxy a DBAPI connection.

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

    c                .    || _         || _        || _        y r   )ro   r;   
cursor_cls)r    r;   ro   r  s       r!   r"   zDBAPIProxyConnection.__init__  s    	$r#   c                X     | j                   | j                  | j                  g|i |S r   )r  r;   ro   )r    r   r   s      r!   r   zDBAPIProxyConnection.cursor  s'    tt{{DIIGGGGr#   c                8    | j                   j                          y 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    tyy#&&r#   N)r}   r~   r   r  r"   r   r'   r   r   r#   r!   r  r    s    %
H'r#   r  r   )NN)NNFF)
r]   Optional[URL]r   Optional[Dict[str, Any]]r   zLiteral[False]r   boolreturnr   )NNTF)
r]   r  r   r  r   zLiteral[True]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L "# + + & &   % %(  ( V( (,# %		%  	
   (,! %		%  	
   	Pf#L) ):' 'r#   