o
    y¬´\c4  ã                   @   sl  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 dd
lmZ e e¡ZdZG dd„ deƒZdd„ Zdd„ Zdd„ Zdd„ Zdd„ Zejdd„ ƒZejdd„ ƒZejdd„ ƒZejdd„ ƒZejdd „ ƒZejd!d"„ ƒZ e !d#¡d$d%„ ƒZ"e  !d&¡d'd(„ ƒZ#e !d&¡d)d*„ ƒZ$e !d+¡d,d-„ ƒZ%e !d.¡d/d0„ ƒZ&e !d.¡d1d2„ ƒZ'e !d&¡d3d4„ ƒZ(e !d+¡d5d6„ ƒZ)e !d&¡d7d8„ ƒZ*e !d.¡d9d:„ ƒZ+e !d;¡d<d=„ ƒZ,e !d;¡d>d?„ ƒZ-d@dA„ Z.e !d;¡dBdC„ ƒZ/e !d;¡dDdE„ ƒZ0dFdG„ Z1dHdI„ Z2e  !d;¡dJdK„ ƒZ3e !d#¡dLdM„ ƒZ4e !d#¡dNdO„ ƒZ5dPdQ„ Z6dRdS„ Z7dS )Té    Né   )Úconfig)Úenginesé   )Úcreate_engine)Úexc)Útext)Úurl)Úcompatc                   @   s0   e Zd Zdd„ Zedd„ ƒZdd„ Zdd„ Zd	S )
Úregisterc                 C   s
   i | _ d S ©N©Úfns)Úself© r   úN/var/www/html/env/lib/python3.10/site-packages/sqlalchemy/testing/provision.pyÚ__init__   s   
zregister.__init__c                 C   s   t ƒ  d¡|ƒS ©NÚ*)r   Úfor_db)ÚclsÚfnr   r   r   Úinit   s   zregister.initc                    s   ‡ ‡fdd„}|S )Nc                    s   | ˆj ˆ < ˆS r   r   )r   ©Údbnamer   r   r   Údecorate   s   
z!register.for_db.<locals>.decorater   )r   r   r   r   r   r   r      s   zregister.for_dbc                 G   sp   t |tjƒrt |¡}nt |tjƒr|}n|jj}| ¡ }|| j	v r-| j	| |g|¢R Ž S | j	d |g|¢R Ž S r   )
Ú
isinstancer
   Ústring_typesÚsa_urlÚmake_urlÚURLÚdbr	   Úget_backend_namer   )r   ÚcfgÚargr	   Úbackendr   r   r   Ú__call__#   s   
zregister.__call__N)Ú__name__Ú
__module__Ú__qualname__r   Úclassmethodr   r   r&   r   r   r   r   r      s    
r   c                 C   ó0   t ƒ D ]}t d| |jj¡ t||j| ƒ qd S )NzCREATE database %s, URI %r)Ú_configs_for_db_operationÚlogÚinfor!   r	   Ú
_create_db©Úfollower_identr#   r   r   r   Úcreate_follower_db1   ó   
þr2   c                 C   s   t j ¡ D ]}t|| ƒ qd S r   )r   ÚConfigÚall_configsÚ_configure_followerr0   r   r   r   Úconfigure_follower7   s   ÿr7   c                 C   sd   |rt | |ƒ} i }t| |ƒ t | |¡}t| ||ƒ | ¡  ¡  tj 	||||¡}|r0t
||ƒ |S r   )Ú_follower_url_from_mainÚ_update_db_optsr   Útesting_engineÚ_post_configure_engineÚconnectÚcloser   r4   r   r6   )Údb_urlÚoptionsÚfile_configr1   Údb_optsÚengr#   r   r   r   Úsetup_config<   s   


rC   c                 C   r+   )NzDROP database %s, URI %r)r,   r-   r.   r!   r	   Ú_drop_dbr0   r   r   r   Údrop_follower_dbK   r3   rE   c                  c   sŠ   � t ƒ } tj ¡ D ]}|j ¡  q	tj ¡ D ]}|jj}| ¡ }||j|j	|j
f}|| vr5|V  |  |¡ qtj ¡ D ]}|j ¡  q;d S r   )Úsetr   r4   r5   r!   Údisposer	   r"   ÚusernameÚhostÚdatabaseÚadd)Úhostsr#   r	   r%   Ú	host_confr   r   r   r,   Q   s   €
€ÿr,   c                 C   ó   t d|j ƒ‚)Nz"no DB creation routine for cfg: %s©ÚNotImplementedErrorr	   ©r#   rB   Úidentr   r   r   r/   d   ó   r/   c                 C   rN   )Nzno DB drop routine for cfg: %srO   rQ   r   r   r   rD   i   rS   rD   c                 C   ó   d S r   r   ©r>   rA   r   r   r   r9   n   ó   r9   c                 C   rT   r   r   )r#   rR   r   r   r   r6   s   rV   r6   c                 C   rT   r   r   )r	   Úenginer1   r   r   r   r;   x   rV   r;   c                 C   s   t  | ¡} || _| S r   ©r   r   rJ   ©r	   rR   r   r   r   r8   }   s   
r8   Úmssqlc                 C   s   d|d< d S )NFÚlegacy_schema_aliasingr   rU   r   r   r   Ú_mssql_update_db_opts„   s   r\   Úsqlitec                 C   s,   t  | ¡} | jr| jdkr| S t  d| ¡S )Nz:memory:zsqlite:///%s.dbrX   rY   r   r   r   Ú_sqlite_follower_url_from_main‰   s   
r^   c                    s(   ddl m} | |d¡‡ fdd„ƒ}d S )Nr   )Úeventr<   c                    s$   ˆ s	|   d¡ d S |   dˆ  ¡ d S )Nz/ATTACH DATABASE "test_schema.db" AS test_schemaz2ATTACH DATABASE "%s_test_schema.db" AS test_schema)Úexecute)Údbapi_connectionÚconnection_record©r1   r   r   r<   –   s   ÿÿÿz._sqlite_post_configure_engine.<locals>.connect)Ú
sqlalchemyr_   Úlistens_for)r	   rW   r1   r_   r<   r   rc   r   Ú_sqlite_post_configure_engine’   s   
rf   Ú
postgresqlc                 C   sò   | j j}| ¡ jdd��c}zt| ||ƒ W n	 ty   Y nw |s&| d¡}d}	 z| d||f ¡ W n0 tj	yd } z#|d7 }|dkrF‚ d	t
|ƒv rZt d
||j|¡ t d¡ W Y d }~nd }~ww nq)W d   ƒ d S 1 srw   Y  d S )NÚ
AUTOCOMMIT©Úisolation_levelzselect current_database()r   TzCREATE DATABASE %s TEMPLATE %sr   é   zaccessed by other userszFWaiting to create %s, URI %r, template DB %s is in use sleeping for .5g      à?)r?   Úpostgresql_templatedbr<   Úexecution_optionsÚ_pg_drop_dbÚ	ExceptionÚscalarr`   r   ÚOperationalErrorÚstrr-   r.   r	   ÚtimeÚsleep)r#   rB   rR   Útemplate_dbÚconnÚattemptÚerrr   r   r   Ú_pg_create_db¥   sB   ÿ

ÿû
€ôí"äry   Úmysqlc              	   C   s|   |  ¡ �0}zt| ||ƒ W n	 ty   Y nw | d| ¡ | d| ¡ | d| ¡ W d   ƒ d S 1 s7w   Y  d S )Nz(CREATE DATABASE %s CHARACTER SET utf8mb3z4CREATE DATABASE %s_test_schema CHARACTER SET utf8mb3z6CREATE DATABASE %s_test_schema_2 CHARACTER SET utf8mb3)r<   Ú_mysql_drop_dbro   r`   ©r#   rB   rR   rv   r   r   r   Ú_mysql_create_dbÈ   s   
ÿÿÿ"ór}   c                 C   ó   d| | _ d| | _d S )Nz%s_test_schemaz%s_test_schema_2©Útest_schemaÚtest_schema_2©r   rR   r   r   r   Ú_mysql_configure_followerÜ   ó   
rƒ   c                 C   rT   r   r   rQ   r   r   r   Ú_sqlite_create_dbâ   rV   r…   c                 C   sV   |  ¡ jdd��}|jtdƒ|d� | d| ¡ W d   ƒ d S 1 s$w   Y  d S )Nrh   ri   z€select pg_terminate_backend(pid) from pg_stat_activity where usename=current_user and pid != pg_backend_pid() and datname=:dname)ÚdnameúDROP DATABASE %s)r<   rm   r`   r   r|   r   r   r   rn   ç   s   ÿú"÷rn   c                 C   s(   |rt  d| ¡ d S t  d| ¡ d S )Nz%s_test_schema.dbz%s.db)ÚosÚremoverQ   r   r   r   Ú_sqlite_drop_dbõ   s   rŠ   c                 C   sX   |  ¡ �}| d| ¡ | d| ¡ | d| ¡ W d   ƒ d S 1 s%w   Y  d S )NzDROP DATABASE %s_test_schemazDROP DATABASE %s_test_schema_2r‡   ©r<   r`   r|   r   r   r   r{   ý   s
   
"ýr{   Úoraclec                 C   s’   |  ¡ �;}| d| ¡ | d| ¡ | d| ¡ | d|f ¡ | d| ¡ | d| ¡ | d| ¡ W d   ƒ d S 1 sBw   Y  d S )Nzcreate user %s identified by xez#create user %s_ts1 identified by xez#create user %s_ts2 identified by xezgrant dba to %sz grant unlimited tablespace to %sz$grant unlimited tablespace to %s_ts1z$grant unlimited tablespace to %s_ts2r‹   r|   r   r   r   Ú_oracle_create_db  s   
"ùr�   c                 C   r~   ©Nú%s_ts1ú%s_ts2r   r‚   r   r   r   Ú_oracle_configure_follower  r„   r‘   c              
   C   óV   z|   d| ¡ t d|¡ W dS  tjy* } zt d|¡ W Y d }~dS d }~ww )Nzdrop user %s cascadeúReaped db: %sTúcouldn't drop db: %sF©r`   r-   r.   r   ÚDatabaseErrorÚwarning)rv   r   rx   r   r   r   Ú_ora_drop_ignore  s   €þr˜   c                 C   sT   |  ¡ �}t||ƒ t|d| ƒ t|d| ƒ W d   ƒ d S 1 s#w   Y  d S rŽ   )r<   r˜   r|   r   r   r   Ú_oracle_drop_db$  s
   

"ør™   c                 C   rT   r   r   rU   r   r   r   Ú_oracle_update_db_opts1  rV   rš   c                 C   sî   t  d¡ t t¡}t t¡}t| ƒ�2}|D ]'}| ¡ }| d¡\}}t 	|¡}| 
¡ |jf}||  |¡ ||  |¡ qW d   ƒ n1 sHw   Y  |D ]%}|d }	t|| ƒd }
|| }|	dkrkt|
|ƒ qO|	dkrtt|
|ƒ qOd S )NzReaping databases...ú r   rŒ   rZ   )r-   r.   ÚcollectionsÚdefaultdictrF   ÚopenÚstripÚsplitr   r   r"   rI   rK   ÚlistÚ_reap_oracle_dbsÚ_reap_mssql_dbs)Úidents_fileÚurlsÚidentsÚfile_ÚlineÚdb_namer>   Úurl_objÚurl_keyr%   r	   rR   r   r   r   Úreap_dbs6  s.   




úÿ	
€ùr¬   c                 C   s  t  d| ¡ t| ƒ}| ¡ �r}t  dd |¡¡ | d¡}dd„ |D ƒ}tƒ }|D ]0}| d¡s5| d¡r6q)||v rY| |¡ d	| |v rL| d	| ¡ d
| |v rY| d
| ¡ q)d }}	t	|dƒD ]\}	}
t
||
ƒrp|d7 }qct  d||	¡ W d   ƒ d S 1 sƒw   Y  d S )Núdb reaper connecting to %rúidentifiers in file: %sú, z‰select u.username from all_users u where username like 'TEST_%' and not exists (select username from v$session where username=u.username)c                 S   ó   h | ]\}|  ¡ ’qS r   ©Úlower)Ú.0rH   r   r   r   Ú	<setcomp>[  ó    z#_reap_oracle_dbs.<locals>.<setcomp>Ú_ts1Ú_ts2r�   r�   r   r   ú-Dropped %d out of %d stale databases detected)r-   r.   r   r<   Újoinr`   rF   ÚendswithrK   Ú	enumerater˜   )r	   r¦   rB   rv   Úto_reapÚ	all_namesÚto_dropÚnameÚdroppedÚtotalrH   r   r   r   r¢   O  s8   
ÿ
€
€ÿ"çr¢   c                 C   s   t  | ¡} || _d| _| S )NÚxe)r   r   rH   ÚpasswordrY   r   r   r   Ú_oracle_follower_url_from_mainp  s   
rÄ   c                 C   s‚   |  ¡ jdd��/}| d| ¡ | d| ¡ | d| ¡ | d| ¡ | d¡ | d¡ W d   ƒ d S 1 s:w   Y  d S )	Nrh   ri   zcreate database %sz1ALTER DATABASE %s SET ALLOW_SNAPSHOT_ISOLATION ONz0ALTER DATABASE %s SET READ_COMMITTED_SNAPSHOT ONzuse %szcreate schema test_schemazcreate schema test_schema_2)r<   rm   r`   r|   r   r   r   Ú_mssql_create_dbx  s   ÿÿ
"örÅ   c                 C   s@   |  ¡ jdd��}t||ƒ W d   ƒ d S 1 sw   Y  d S )Nrh   ri   )r<   rm   Ú_mssql_drop_ignorer|   r   r   r   Ú_mssql_drop_db‡  s   "ÿrÇ   c              
   C   r’   )Nzdrop database %sr“   Tr”   Fr•   )rv   rR   rx   r   r   r   rÆ   �  s   	€þrÆ   c                 C   sÒ   t  d| ¡ t| ƒ}| ¡ jdd��M}t  dd |¡¡ | d¡}dd„ |D ƒ}tƒ }|D ]}||v r8| |¡ q-d	 }}	t	|d
ƒD ]\}	}
t
||
ƒrO|d
7 }qBt  d||	¡ W d   ƒ d S 1 sbw   Y  d S )Nr­   rh   ri   r®   r¯   z›select d.name from sys.databases as d where name like 'TEST_%' and not exists (select session_id from sys.dm_exec_sessions where database_id=d.database_id)c                 S   r°   r   r±   )r³   r   r   r   r   r´   ¬  rµ   z"_reap_mssql_dbs.<locals>.<setcomp>r   r   r¸   )r-   r.   r   r<   rm   r¹   r`   rF   rK   r»   rÆ   )r	   r¦   rB   rv   r¼   r½   r¾   r¿   rÀ   rÁ   r   r   r   r   r£   Ÿ  s,   ÿ
€
€ÿ"ìr£   )8rœ   Úloggingrˆ   rs   Ú r   r   r   r   r   rW   r	   r   Úutilr
   Ú	getLoggerr'   r-   ÚFOLLOWER_IDENTÚobjectr   r2   r7   rC   rE   r,   r   r/   rD   r9   r6   r;   r8   r   r\   r^   rf   ry   r}   rƒ   r…   rn   rŠ   r{   r�   r‘   r˜   r™   rš   r¬   r¢   rÄ   rÅ   rÇ   rÆ   r£   r   r   r   r   Ú<module>   sŒ    










"










!


