B ÃÌ4]Ï3ã@slddlZddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z dd l m Z dd l mZe e¡ZdZGd d „d eƒZd d„Zdd„Zdd„Zdd„Zdd„Zejdd„ƒZejdd„ƒZejdd„ƒZejdd„ƒZejdd „ƒZejd!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;¡dd?„ƒZ-d@dA„Z.e !d;¡dBdC„ƒZ/e !d;¡dDdE„ƒZ0dFdG„Z1dHdI„Z2e  !d;¡dJdK„ƒZ3e !d#¡dLdM„ƒZ4e !d#¡dNdO„ƒZ5dPdQ„Z6dRdS„Z7dS)TéNé)Úconfig)Úenginesé)Ú create_engine)Úexc)Útext)Úurl)Úcompatc@s0eZdZdd„Zedd„ƒZdd„Zdd„Zd S) ÚregistercCs i|_dS)N)Úfns)Úself©rúO/opt/alt/python37/lib64/python3.7/site-packages/sqlalchemy/testing/provision.pyÚ__init__szregister.__init__cCstƒ d¡|ƒS)NÚ*)r Úfor_db)ÚclsÚfnrrrÚinitsz register.initcs‡‡fdd„}|S)Ncs|ˆjˆ<ˆS)N)r )r)Údbnamer rrÚdecorates z!register.for_db..decorater)r rrr)rr rrszregister.for_dbcGspt|tjƒrt |¡}nt|tjƒr*|}n|jj}| ¡}||j krX|j ||f|žŽS|j d|f|žŽSdS)Nr) Ú isinstancer Z string_typesÚsa_urlÚmake_urlZURLÚdbr Úget_backend_namer )r ÚcfgÚargr ÚbackendrrrÚ__call__#s    zregister.__call__N)Ú__name__Ú __module__Ú __qualname__rÚ classmethodrrr rrrrr s r cCs4x.tƒD]$}t d||jj¡t||j|ƒqWdS)NzCREATE database %s, URI %r)Ú_configs_for_db_operationÚlogÚinforr Ú _create_db)Úfollower_identrrrrÚcreate_follower_db1s r*cCs"xtj ¡D]}t||ƒq WdS)N)rÚConfigÚ all_configsÚ_configure_follower)r)rrrrÚconfigure_follower7sr.cCsd|rt||ƒ}i}t||ƒt ||¡}t|||ƒ| ¡ ¡tj  ||||¡}|r`t ||ƒ|S)N) Ú_follower_url_from_mainÚ_update_db_optsrZtesting_engineÚ_post_configure_engineÚconnectÚcloserr+r r-)Údb_urlÚoptionsZ file_configr)Údb_optsÚengrrrrÚ setup_config<s      r8cCs4x.tƒD]$}t d||jj¡t||j|ƒqWdS)NzDROP database %s, URI %r)r%r&r'rr Ú_drop_db)r)rrrrÚdrop_follower_dbKs r:ccs”tƒ}xtj ¡D]}|j ¡qWxLtj ¡D]>}|jj}| ¡}||j|j |j f}||kr0|V|  |¡q0Wxtj ¡D]}|j ¡q~WdS)N) Úsetrr+r,rZdisposer rÚusernameÚhostÚdatabaseÚadd)Zhostsrr rZ host_confrrrr%Qsr%cCstd|jƒ‚dS)Nz"no DB creation routine for cfg: %s)ÚNotImplementedErrorr )rr7Úidentrrrr(dsr(cCstd|jƒ‚dS)Nzno DB drop routine for cfg: %s)r@r )rr7rArrrr9isr9cCsdS)Nr)r4r6rrrr0nsr0cCsdS)Nr)rrArrrr-ssr-cCsdS)Nr)r Úenginer)rrrr1xsr1cCst |¡}||_|S)N)rrr>)r rArrrr/}s r/ÚmssqlcCs d|d<dS)NFZlegacy_schema_aliasingr)r4r6rrrÚ_mssql_update_db_opts„srDZsqlitecCs0t |¡}|jr|jdkr|St d|¡SdS)Nz:memory:zsqlite:///%s.db)rrr>)r rArrrÚ_sqlite_follower_url_from_main‰s rEcs(ddlm}| |d¡‡fdd„ƒ}dS)Nr)Úeventr2cs"ˆs| d¡n| dˆ¡dS)Nz/ATTACH DATABASE "test_schema.db" AS test_schemaz2ATTACH DATABASE "%s_test_schema.db" AS test_schema)Úexecute)Zdbapi_connectionZconnection_record)r)rrr2–s z._sqlite_post_configure_engine..connect)Z sqlalchemyrFZ listens_for)r rBr)rFr2r)r)rÚ_sqlite_post_configure_engine’s rHZ postgresqlc Csê|jj}| ¡jddÈ}yt|||ƒWntk r>YnX|sN| d¡}d}xˆy| d||f¡Wnjtj k rÈ}z>|d7}|dkr‚dt |ƒkr¸t   d ||j |¡t d ¡Wdd}~XYqT‚YqTXPqTWWdQRXdS) NÚ AUTOCOMMIT)Úisolation_levelzselect current_database()rzCREATE DATABASE %s TEMPLATE %srézaccessed by other userszFWaiting to create %s, URI %r, template DB %s is in use sleeping for .5gà?)r5Zpostgresql_templatedbr2Úexecution_optionsÚ _pg_drop_dbÚ ExceptionZscalarrGrZOperationalErrorÚstrr&r'r ÚtimeZsleep)rr7rAZ template_dbÚconnZattemptÚerrrrrÚ _pg_create_db¥s6  rSZmysqlc Csh| ¡V}yt|||ƒWntk r.YnX| d|¡| d|¡| d|¡WdQRXdS)Nz(CREATE DATABASE %s CHARACTER SET utf8mb4z4CREATE DATABASE %s_test_schema CHARACTER SET utf8mb4z6CREATE DATABASE %s_test_schema_2 CHARACTER SET utf8mb4)r2Ú_mysql_drop_dbrNrG)rr7rArQrrrÚ_mysql_create_dbÊs  rUcCsd||_d||_dS)Nz%s_test_schemaz%s_test_schema_2)Ú test_schemaÚ test_schema_2)rrArrrÚ_mysql_configure_followerÛs rXcCsdS)Nr)rr7rArrrÚ_sqlite_create_dbásrYc Cs@| ¡jdd&}|jtdƒ|d| d|¡WdQRXdS)NrI)rJz€select pg_terminate_backend(pid) from pg_stat_activity where usename=current_user and pid != pg_backend_pid() and datname=:dname)ZdnamezDROP DATABASE %s)r2rLrGr)rr7rArQrrrrMæs rMcCs&|rt d|¡nt d|¡dS)Nz%s_test_schema.dbz%s.db)ÚosÚremove)rr7rArrrÚ_sqlite_drop_dbôsr\c CsB| ¡0}| d|¡| d|¡| d|¡WdQRXdS)NzDROP DATABASE %s_test_schemazDROP DATABASE %s_test_schema_2zDROP DATABASE %s)r2rG)rr7rArQrrrrTüs rTÚoraclec Cs|| ¡j}| d|¡| d|¡| d|¡| d|f¡| d|¡| d|¡| d|¡WdQRXdS)Nzcreate user %s identified by xez#create user %s_ts1 identified by xez#create user %s_ts2 identified by xezgrant dba to %sz grant unlimited tablespace to %sz$grant unlimited tablespace to %s_ts1z$grant unlimited tablespace to %s_ts2)r2rG)rr7rArQrrrÚ_oracle_create_dbs r^cCsd||_d||_dS)Nz%s_ts1z%s_ts2)rVrW)rrArrrÚ_oracle_configure_followers r_c CsTy| d|¡t d|¡dStjk rN}zt d|¡dSd}~XYnXdS)Nzdrop user %s cascadez Reaped db: %sTzcouldn't drop db: %sF)rGr&r'rÚ DatabaseErrorÚwarning)rQrrRrrrÚ_ora_drop_ignores  rbc Cs>| ¡,}t||ƒt|d|ƒt|d|ƒWdQRXdS)Nz%s_ts1z%s_ts2)r2rb)rr7rArQrrrÚ_oracle_drop_db#s  rccCsdS)Nr)r4r6rrrÚ_oracle_update_db_opts0srdc Csât d¡t t¡}t t¡}t|ƒ^}xV|D]N}| ¡}| d¡\}}t  |¡}|  ¡|j f}||  |¡||  |¡q.WWdQRXxR|D]J}|d} t ||ƒd} ||} | dkrÈt| | ƒq| dkrt| | ƒqWdS)NzReaping databases...ú rr]rC)r&r'Ú collectionsÚ defaultdictr;ÚopenÚstripÚsplitrrrr=r?ÚlistÚ_reap_oracle_dbsÚ_reap_mssql_dbs) Z idents_fileZurlsÚidentsZfile_ÚlineZdb_namer4Zurl_objZurl_keyrr rArrrÚreap_dbs5s&        rpc Cst d|¡t|ƒ}| ¡â}t dd |¡¡| d¡}dd„|Dƒ}tƒ}xj|D]b}| d¡sT| d¡rpqTqT||krT| |¡d ||krœ| d |¡d ||krT| d |¡qTWd }} x(t |d ƒD]\} } t || ƒrÎ|d 7}qÎWt d || ¡WdQRXdS)Nzdb reaper connecting to %rzidentifiers in file: %sz, z‰select u.username from all_users u where username like 'TEST_%' and not exists (select username from v$session where username=u.username)cSsh|]\}| ¡’qSr)Úlower)Ú.0r<rrrú Zsz#_reap_oracle_dbs..Z_ts1Z_ts2z%s_ts1z%s_ts2rrz-Dropped %d out of %d stale databases detected) r&r'rr2ÚjoinrGr;Úendswithr?Ú enumeraterb) r rnr7rQÚto_reapÚ all_namesÚto_dropÚnameÚdroppedÚtotalr<rrrrlNs.        rlcCst |¡}||_d|_|S)NZxe)rrr<Zpassword)r rArrrÚ_oracle_follower_url_from_mainos r}c Csl| ¡jddR}| d|¡| d|¡| d|¡| d|¡| d¡| d¡WdQRXdS) NrI)rJzcreate database %sz1ALTER DATABASE %s SET ALLOW_SNAPSHOT_ISOLATION ONz0ALTER DATABASE %s SET READ_COMMITTED_SNAPSHOT ONzuse %szcreate schema test_schemazcreate schema test_schema_2)r2rLrG)rr7rArQrrrÚ_mssql_create_dbws   r~c Cs*| ¡jdd}t||ƒWdQRXdS)NrI)rJ)r2rLÚ_mssql_drop_ignore)rr7rArQrrrÚ_mssql_drop_db†sr€c CsTy| d|¡t d|¡dStjk rN}zt d|¡dSd}~XYnXdS)Nzdrop database %sz Reaped db: %sTzcouldn't drop db: %sF)rGr&r'rr`ra)rQrArRrrrrŒs   rc CsÄt d|¡t|ƒ}| ¡jdd–}t dd |¡¡| d¡}dd„|Dƒ}tƒ}x|D]}||kr\| |¡q\Wd }} x(t |d ƒD]\} } t || ƒrŠ|d 7}qŠWt d || ¡WdQRXdS) Nzdb reaper connecting to %rrI)rJzidentifiers in file: %sz, 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)cSsh|]\}| ¡’qSr)rq)rrrrrrrs«sz"_reap_mssql_dbs..rrz-Dropped %d out of %d stale databases detected) r&r'rr2rLrtrGr;r?rvr) r rnr7rQrwrxryrzr{r|rrrrrmžs"    rm)8rfZloggingrZrPÚrrrrrrBr rÚutilr Z getLoggerr!r&ZFOLLOWER_IDENTÚobjectr r*r.r8r:r%rr(r9r0r-r1r/rrDrErHrSrUrXrYrMr\rTr^r_rbrcrdrprlr}r~r€rrmrrrrÚs\         %  !