
    +hP4                     V   d dl mZ d dl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mZ dd
lmZ  G d de      Z e       Ze	d        Ze	d        Ze	d        Ze	d        ZddZ G d de      ZddZ	 	 	 	 	 	 ddZddZ G d de      Z G d de      ZeefdZy)    )absolute_importN   )config)	decorator)
gc_collect   )event)pool)
await_onlyc                   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    M/var/www/html/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_conn%   s$    ""9-%)	"r   c                 :    | j                   j                  |       y r   )r   discard)r   
dbapi_connargs      r   r$   zConnectionKiller._remove_conn)   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_engine,   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._safe2   s5    	D 	MMG!K 	   
 	505c                     t        | j                        D ]-  }||j                  s| j                  |j                         / y r   )listr   is_validr?   rollbackr   recs     r   rollback_allzConnectionKiller.rollback_all:   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   )
rB   r   rC   r   r,   dbapi_connectionr?   _checkinrD   clear)r   rF   cons      r   checkin_allzConnectionKiller.checkin_all?   s     ( 	)C3<<&&..s/C/CD

3<<(	) )) 	%CJJs||$	%$$&r   c                 $    | j                          y r   )rM   r   s    r   	close_allzConnectionKiller.close_allN   s    r   c                 ~    t         j                  sy ddlm} |j	                  |j
                  j                  |       y Nr   )	provision)r   bootstrapped_as_sqlalchemy rR   prepare_for_drop_tablesr4   url)r   
connectionrR   s      r   rU   z(ConnectionKiller.prepare_for_drop_tablesQ   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   rB   r   rC   _poolr
   r?   rJ   hasattrr   disposerK   )r   r5   engrF   	proxy_refs        r   _drop_testing_enginesz&ConnectionKiller._drop_testing_enginesZ   s    ""5)9 	C!$//2 7	(Y-?-?!3%OOsxx7

9#5#567 sM*3;;=)	 			r   c                 &    | j                  d       y )Nr2   )r_   r   s    r   
after_testzConnectionKiller.after_testj   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rQ   )r   rS   	__class__"__leave_connections_for_teardown__rM   rT   rR   dbconnectrU   r4   rV   )r   testrR   conns       r   after_test_outside_fixturesz,ConnectionKiller.after_test_outside_fixturesm   sr    00>><<
 	 YY  	ED--dkkootD	E 	E 	Es   'BBc                 h    | j                          | j                  d       | j                  d       y )Nr2   r0   )rM   r_   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   lenrK   )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   )rM   r   r_   )r   r5   s     r   final_cleanupzConnectionKiller.final_cleanup   s1    )) 	.E&&u-	.r   c                 B    | j                   D ]  }|j                  sJ  y r   )r   rC   rE   s     r   assert_all_closedz"ConnectionKiller.assert_all_closed   s!    ?? 	C||u	r   N)__name__
__module____qualname__r   r%   r#   r$   r6   r?   rG   rM   rO   rU   r_   ra   ri   rk   rq   rs   ru    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_reaperru   r=   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{   rG   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{   rM   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   rf   r   r?   r    cursorexecuter   append)r   r}   kwargsrh   curss        r   rf   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: %sr8   r<   s      r   r?   zReconnectFixture._safe   s4    	PD 	PMMJQNOO	Pr@   c                     || _         t        | j                        D ]  }| j                  |j                          g | _        y r   )r   rB   r   r?   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)	rv   rw   rx   r   r   rf   r?   r   r   ry   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   )_disposer4   s   r   r\   z$reconnecting_engine.<locals>.dispose  s0    %%'*/'
r   )r   re   rV   r   r   r   testing_enginer\   r   test_shutdownr   test_restart)rV   optionsr   r\   r   r4   s       @@r   reconnecting_enginer      s    

CII##E(/GHC)F~~H
 ">>//88F ....66FFNMr   c                    |r|rJ ddl m} n=|s.t        j                  r%t        j                  j                  r|dur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                  }  ||       } |Ut        j                  1| j                  t        j                  j                  j                  k(  rt        j                  }nsi }npt        j                  `| j                  t        j                  j                  j                  k(  r/t        j                  j                         }|j                  |        || fi |}|
rG|j                   dk(  r8t#        j$                  |d      d        }t#        j$                  |d      d        }|roddlm} t        j                  Yt+        t        j                  j,                  |      r5d}|j,                  j/                  t        j                  j,                         |	dk(  r|rd|j0                  _        nd|_        t+        |j,                  t,        j4                        r"d|j,                  _        d|j,                  _        |rt:        j=                  ||	       |S )zBProduce an engine configured by --options with optional overrides.r   )create_async_engineF)create_engine)make_urlTr2   
use_reaperr5   sqlite_savepointsqliterf   c                     d | _         y r   )isolation_level)rI   connection_records     r   
do_connectz"testing_engine.<locals>.do_connectA  s    /3,r   beginc                 &    | j                  d       y )NBEGIN)exec_driver_sqlrh   s    r   do_beginz testing_engine.<locals>.do_beginE  s      )r   )
StaticPoolr1   )sqlalchemy.ext.asyncior   r   re   
_is_futuresqlalchemy.futurer   
sqlalchemysqlalchemy.engine.urlr   poprV   
drivernamedb_optscopyupdater   r	   listens_forsqlalchemy.poolr   
isinstancer
   _transfer_fromrY   _has_events	QueuePool_timeout_max_overflowr{   r6   )rV   r   futureasynciotransfer_staticpool_sqlite_savepointr   r   r   r5   r   default_optr4   r   r   r   s                   r   r   r     s    $$$	
 
		fii**vU/B3,.
 [[t4
GZ0";;'95A

C
3-C99&))--2J2J JnnGG		3>>VYY]]5M5M#Mnn))+7#3*'*FFKK83			69	-	4 
.	4 
		67	+	* 
,	* .99 Z		
%KJKK&&vyy~~6-1F*   &++t~~. $%!!!&%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>.executort  s    cr   c           
          D cg c]"  }t        j                  ddt        |            $ }}|| k(  sJ |       y c c}w )Nz[\n\t]rT   )resubstr)stmtssrecvr   s      r   
assert_sqlzmock_engine.<locals>.assert_sqlw  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   r4   s   @r   	print_sqlzmock_engine.<locals>.print_sql{  s%    NNyyHFKKHHHr   z://r   )	r   r   r   re   r   r[   r   r   r   )dialect_namer   r   r   r   r   r4   s        @@r   mock_enginer   a  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   )r4   rW   r   )r   r4   rh   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   )	rv   rw   rx   __doc__r   r   r   r  r   ry   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                 ^    |j                   j                         | _        || _        || _        y r   )r
   _creatorrh   r4   
cursor_cls)r   r4   r
  s      r   r   zDBAPIProxyConnection.__init__  s$    KK((*	$r   c                 X     | j                   | j                  | j                  g|i |S r   )r
  r4   rh   )r   r}   r   s      r   r   zDBAPIProxyConnection.cursor  s'    tt{{DIIGGGGr   c                 8    | j                   j                          y r   )rh   r    r   s    r   r    zDBAPIProxyConnection.close  s    		r   c                 .    t        | j                  |      S r   )r   rh   r   s     r   r   z DBAPIProxyConnection.__getattr__  s    tyy#&&r   N)rv   rw   rx   r  r   r   r    r   ry   r   r   r  r    s    %
H'r   r  c                 6      fd}d }t        ||d      S )zIProduce an engine that provides proxy hooks for
    common methods.

    c                  2      t         j                        S r   )r   re   )conn_clsr
  s   r   	mock_connz"proxying_engine.<locals>.mock_conn  s    		:..r   c                       fd}|S )Nc                 (     | j                         S r   r   )r-   do_on_connects    r   goz8proxying_engine.<locals>._wrap_do_on_connect.<locals>.go  s     11r   ry   )r  r  s   ` r   _wrap_do_on_connectz,proxying_engine.<locals>._wrap_do_on_connect  s    	2 	r   )creatorr  )r   )r   )r  r
  r  r  s   ``  r   proxying_enginer    s'    /  #6
 r   r   )NN)NNNFFF)
__future__r   r   r   r:   r   rT   r   utilr   r   r	   r
   r   objectr   r{   r   r   r   r   r   r   r   r   r   r   r  r  ry   r   r   <module>r     s    '  	        Bv BJ "# + + & &   % %) v ) X* 	M`#L)v ):'6 '0 ".>r   