U
    xž^Ï3  ã                   @   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   úD/tmp/pip-install-dq5v43_d/SQLAlchemy/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	krX| j	| |f|žŽ S | j	d |f|žŽ S d 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   s0   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   s    
r1   c                 C   s   t j ¡ D ]}t|| ƒ q
d S r   )r   ÚConfigÚall_configsÚ_configure_followerr/   r   r   r   Úconfigure_follower7   s    r5   c                 C   sd   |rt | |ƒ} i }t| |ƒ t | |¡}t| ||ƒ | ¡  ¡  tj 	||||¡}|r`t
||ƒ |S r   )Ú_follower_url_from_mainÚ_update_db_optsr   Ztesting_engineÚ_post_configure_engineÚconnectÚcloser   r2   r   r4   )Údb_urlÚoptionsZfile_configr0   Údb_optsÚengr#   r   r   r   Úsetup_config<   s    


r?   c                 C   s0   t ƒ D ]$}t d| |jj¡ t||j| ƒ qd S )NzDROP database %s, URI %r)r+   r,   r-   r!   r	   Ú_drop_dbr/   r   r   r   Údrop_follower_dbK   s    
rA   c                  c   sˆ   t ƒ } tj ¡ D ]}|j ¡  qtj ¡ D ]>}|jj}| ¡ }||j|j	|j
f}|| kr*|V  |  |¡ q*tj ¡ D ]}|j ¡  qtd S r   )Úsetr   r2   r3   r!   Zdisposer	   r"   ÚusernameÚhostÚdatabaseÚadd)Úhostsr#   r	   r%   Z	host_confr   r   r   r+   Q   s    r+   c                 C   s   t d|j ƒ‚d S )Nz"no DB creation routine for cfg: %s©ÚNotImplementedErrorr	   ©r#   r>   Úidentr   r   r   r.   d   s    r.   c                 C   s   t d|j ƒ‚d S )Nzno DB drop routine for cfg: %srH   rJ   r   r   r   r@   i   s    r@   c                 C   s   d S r   r   ©r;   r=   r   r   r   r7   n   s    r7   c                 C   s   d S r   r   )r#   rK   r   r   r   r4   s   s    r4   c                 C   s   d S r   r   )r	   Úenginer0   r   r   r   r8   x   s    r8   c                 C   s   t  | ¡} || _| S r   ©r   r   rE   ©r	   rK   r   r   r   r6   }   s    
r6   Úmssqlc                 C   s   d|d< d S )NFZlegacy_schema_aliasingr   rL   r   r   r   Ú_mssql_update_db_opts„   s    rQ   Zsqlitec                 C   s0   t  | ¡} | jr| jdkr| S t  d| ¡S d S )Nz:memory:zsqlite:///%s.dbrN   rO   r   r   r   Ú_sqlite_follower_url_from_main‰   s    
rR   c                    s(   ddl m} | |d¡‡ fdd„ƒ}d S )Nr   )Úeventr9   c                    s"   ˆ s|   d¡ n|   dˆ  ¡ d S )Nz/ATTACH DATABASE "test_schema.db" AS test_schemaz2ATTACH DATABASE "%s_test_schema.db" AS test_schema)Úexecute)Zdbapi_connectionZconnection_record©r0   r   r   r9   –   s    ÿÿÿz._sqlite_post_configure_engine.<locals>.connect)Z
sqlalchemyrS   Zlistens_for)r	   rM   r0   rS   r9   r   rU   r   Ú_sqlite_post_configure_engine’   s    
rV   Z
postgresqlc                 C   sæ   | j j}| ¡ jddÄ}zt| ||ƒ W n tk
r>   Y nX |sN| d¡}d}z| d||f ¡ W qØ tj	k
rÆ } z>|d7 }|dkrŽ‚ dt
|ƒkr¶t d	||j|¡ t d
¡ W 5 d }~X Y qR   ‚ Y qRX qØqRW 5 Q R X d S )NÚ
AUTOCOMMIT©Zisolation_levelzselect current_database()r   z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<   Zpostgresql_templatedbr9   Úexecution_optionsÚ_pg_drop_dbÚ	ExceptionZscalarrT   r   ZOperationalErrorÚstrr,   r-   r	   ÚtimeÚsleep)r#   r>   rK   Ztemplate_dbÚconnÚattemptÚerrr   r   r   Ú_pg_create_db¥   s8    

ÿûrc   Zmysqlc              	   C   sh   |  ¡ V}zt| ||ƒ W n tk
r.   Y nX | d| ¡ | d| ¡ | d| ¡ W 5 Q R X d S )Nz(CREATE DATABASE %s CHARACTER SET utf8mb4z4CREATE DATABASE %s_test_schema CHARACTER SET utf8mb4z6CREATE DATABASE %s_test_schema_2 CHARACTER SET utf8mb4)r9   Ú_mysql_drop_dbr\   rT   ©r#   r>   rK   r`   r   r   r   Ú_mysql_create_dbÊ   s    
ÿÿrf   c                 C   s   d| | _ d| | _d S )Nz%s_test_schemaz%s_test_schema_2©Ztest_schemaZtest_schema_2©r   rK   r   r   r   Ú_mysql_configure_followerÛ   s    
ri   c                 C   s   d S r   r   rJ   r   r   r   Ú_sqlite_create_dbá   s    rj   c              	   C   s@   |  ¡ jdd&}|jtdƒ|d | d| ¡ W 5 Q R X d S )NrW   rX   z€select pg_terminate_backend(pid) from pg_stat_activity where usename=current_user and pid != pg_backend_pid() and datname=:dname)ZdnameúDROP DATABASE %s)r9   rZ   rT   r   re   r   r   r   r[   æ   s    ÿúr[   c                 C   s&   |rt  d| ¡ nt  d| ¡ d S )Nz%s_test_schema.dbz%s.db)ÚosÚremoverJ   r   r   r   Ú_sqlite_drop_dbô   s    rn   c              	   C   sB   |  ¡ 0}| d| ¡ | d| ¡ | d| ¡ W 5 Q R X d S )NzDROP DATABASE %s_test_schemazDROP DATABASE %s_test_schema_2rk   ©r9   rT   re   r   r   r   rd   ü   s    
rd   Úoraclec              	   C   s|   |  ¡ j}| d| ¡ | d| ¡ | d| ¡ | d|f ¡ | d| ¡ | d| ¡ | d| ¡ W 5 Q R X 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_ts2ro   re   r   r   r   Ú_oracle_create_db  s    
rq   c                 C   s   d| | _ d| | _d S ©Nú%s_ts1ú%s_ts2rg   rh   r   r   r   Ú_oracle_configure_follower  s    
ru   c              
   C   s\   z |   d| ¡ t d|¡ W dS  tjk
rV } zt d|¡ W Y ¢dS d }~X Y nX d S )Nzdrop user %s cascadeúReaped db: %sTúcouldn't drop db: %sF©rT   r,   r-   r   ZDatabaseErrorÚwarning)r`   r   rb   r   r   r   Ú_ora_drop_ignore  s    rz   c              	   C   s>   |  ¡ ,}t||ƒ t|d| ƒ t|d| ƒ W 5 Q R X d S rr   )r9   rz   re   r   r   r   Ú_oracle_drop_db#  s    

r{   c                 C   s   d S r   r   rL   r   r   r   Ú_oracle_update_db_opts0  s    r|   c              	   C   sÚ   t  d¡ t t¡}t t¡}t| ƒZ}|D ]N}| ¡ }| d¡\}}t 	|¡}| 
¡ |jf}||  |¡ ||  |¡ q,W 5 Q R X |D ]J}|d }	t|| ƒd }
|| }|	dkrÂt|
|ƒ qŠ|	dkrŠt|
|ƒ qŠd S )NzReaping databases...ú r   rp   rP   )r,   r-   ÚcollectionsÚdefaultdictrB   ÚopenÚstripÚsplitr   r   r"   rD   rF   ÚlistÚ_reap_oracle_dbsÚ_reap_mssql_dbs)Zidents_fileÚurlsÚidentsÚfile_ÚlineZdb_namer;   Zurl_objZurl_keyr%   r	   rK   r   r   r   Úreap_dbs5  s&    




rŠ   c              	   C   s   t  d| ¡ t| ƒ}| ¡ Ú}t  dd |¡¡ | d¡}dd„ |D ƒ}tƒ }|D ]b}| d¡sR| d¡rnqRqR||krR| |¡ d	| |krš| d	| ¡ d
| |krR| d
| ¡ qRd }}	t	|dƒD ]\}	}
t
||
ƒrÈ|d7 }qÈt  d||	¡ W 5 Q R X 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   s   h | ]\}|  ¡ ’qS r   ©Úlower)Ú.0rC   r   r   r   Ú	<setcomp>Z  s     z#_reap_oracle_dbs.<locals>.<setcomp>Z_ts1Z_ts2rs   rt   r   r   ú-Dropped %d out of %d stale databases detected)r,   r-   r   r9   ÚjoinrT   rB   ÚendswithrF   Ú	enumeraterz   )r	   r‡   r>   r`   Úto_reapÚ	all_namesÚto_dropÚnameÚdroppedÚtotalrC   r   r   r   r„   N  s6    
ÿ


  ÿr„   c                 C   s   t  | ¡} || _d| _| S )NZxe)r   r   rC   ÚpasswordrO   r   r   r   Ú_oracle_follower_url_from_maino  s    
r   c              	   C   sl   |  ¡ jddR}| d| ¡ | d| ¡ | d| ¡ | d| ¡ | d¡ | d¡ W 5 Q R X d S )	NrW   rX   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)r9   rZ   rT   re   r   r   r   Ú_mssql_create_dbw  s    ÿÿ
rž   c              	   C   s*   |  ¡ jdd}t||ƒ W 5 Q R X d S )NrW   rX   )r9   rZ   Ú_mssql_drop_ignorere   r   r   r   Ú_mssql_drop_db†  s    r    c              
   C   s\   z |   d| ¡ t d|¡ W dS  tjk
rV } zt d|¡ W Y ¢dS d }~X Y nX d S )Nzdrop database %srv   Trw   Frx   )r`   rK   rb   r   r   r   rŸ   Œ  s    	rŸ   c              	   C   s¼   t  d| ¡ t| ƒ}| ¡ jddŽ}t  dd |¡¡ | d¡}dd„ |D ƒ}tƒ }|D ]}||krZ| |¡ qZd	 }}	t	|d
ƒD ]\}	}
t
||
ƒr„|d
7 }q„t  d||	¡ W 5 Q R X d S )Nr‹   rW   rX   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   s   h | ]\}|  ¡ ’qS r   rŽ   )r   r   r   r   r   r‘   «  s     z"_reap_mssql_dbs.<locals>.<setcomp>r   r   r’   )r,   r-   r   r9   rZ   r“   rT   rB   rF   r•   rŸ   )r	   r‡   r>   r`   r–   r—   r˜   r™   rš   r›   r   r   r   r   r…   ž  s*    ÿ

  ÿr…   )8r~   Úloggingrl   r^   Ú r   r   r   r   r   rM   r	   r   Úutilr
   Ú	getLoggerr'   r,   ZFOLLOWER_IDENTÚobjectr   r1   r5   r?   rA   r+   r   r.   r@   r7   r4   r8   r6   r   rQ   rR   rV   rc   rf   ri   rj   r[   rn   rd   rq   ru   rz   r{   r|   rŠ   r„   r   rž   r    rŸ   r…   r   r   r   r   Ú<module>   sŠ   










$










!


