o znh3@slddlZddlZddlZddlZddlmZddlmZddlmZddlmZddlm Z dd l m Z dd l mZeeZdZGd d d eZd dZddZddZddZddZejddZejddZejddZejddZejdd 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/d0Z&e!d.d1d2Z'e!d&d3d4Z(e!d+d5d6Z)e!d&d7d8Z*e!d.d9d:Z+e!d;dd?Z-d@dAZ.e!d;dBdCZ/e!d;dDdEZ0dFdGZ1dHdIZ2e !d;dJdKZ3e!d#dLdMZ4e!d#dNdOZ5dPdQZ6dRdSZ7dS)TN)config)engines) create_engine)exc)text)url)compatc@s0eZdZddZeddZddZddZd S) registercCs i|_dSNfns)selfrG/usr/local/lib/python3.10/dist-packages/sqlalchemy/testing/provision.py__init__s zregister.__init__cCstd|SN*)r for_db)clsfnrrrinitsz register.initcsfdd}|S)Ncs|j<Sr r )rdbnamerrrdecorates z!register.for_db..decorater)rrrrrrrszregister.for_dbcGspt|tjr t|}n t|tjr|}n|jj}|}||j vr-|j ||g|RS|j d|g|RSr) isinstancer string_typessa_urlmake_urlURLdbr get_backend_namer)rcfgargr backendrrr__call__#s    zregister.__call__N)__name__ __module__ __qualname__r classmethodrrr&rrrrr s   r cC0tD]}td||jjt||j|qdS)NzCREATE database %s, URI %r)_configs_for_db_operationloginfor!r _create_dbfollower_identr#rrrcreate_follower_db1 r2cCstjD]}t||qdSr )rConfig all_configs_configure_followerr0rrrconfigure_follower7s r7cCsd|rt||}i}t||t||}t||||tj ||||}|r0t |||Sr ) _follower_url_from_main_update_db_optsrtesting_engine_post_configure_engineconnectcloserr4r r6)db_urloptions file_configr1db_optsengr#rrr setup_config<s      rCcCr+)NzDROP database %s, URI %r)r,r-r.r!r _drop_dbr0rrrdrop_follower_dbKr3rEccst}tjD]}|jq tjD]}|jj}|}||j|j |j f}||vr5|V| |qtjD]}|jq;dSr ) setrr4r5r!disposer r"usernamehostdatabaseadd)hostsr#r r% host_confrrrr,Qs   r,cCtd|j)Nz"no DB creation routine for cfg: %sNotImplementedErrorr r#rBidentrrrr/dr/cCrN)Nzno DB drop routine for cfg: %srOrQrrrrDirSrDcCdSr rr>rArrrr9nr9cCrTr r)r#rRrrrr6srVr6cCrTr r)r enginer1rrrr;xrVr;cCst|}||_|Sr rrrJr rRrrrr8}s r8mssqlcCs d|d<dS)NFlegacy_schema_aliasingrrUrrr_mssql_update_db_optss r\sqlitecCs,t|}|jr |jdkr|Std|S)Nz:memory:zsqlite:///%s.dbrXrYrrr_sqlite_follower_url_from_mains r^cs(ddlm}||dfdd}dS)Nr)eventr<cs$s |ddS|ddS)Nz/ATTACH DATABASE "test_schema.db" AS test_schemaz2ATTACH DATABASE "%s_test_schema.db" AS test_schema)execute)dbapi_connectionconnection_recordr1rrr<sz._sqlite_post_configure_engine..connect) sqlalchemyr_ listens_for)r rWr1r_r<rrcr_sqlite_post_configure_engines  rf postgresqlc Cs|jj}|jddf}zt|||Wn tyYnw|s&|d}d} z |d||fWn3tj yd}z#|d7}|dkrFd t |vrZt d ||j |td WYd}~n d}~wnq)WddS1suwYdS) N AUTOCOMMITisolation_levelzselect current_database()rTzCREATE DATABASE %s TEMPLATE %srzaccessed 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 Exceptionscalarr`rOperationalErrorstrr-r.r timesleep)r#rBrR template_dbconnattempterrrrr _pg_create_dbsD     "rymysqlc Cs||0}zt|||Wn tyYnw|d||d||d|WddS1s7wYdS)Nz(CREATE DATABASE %s CHARACTER SET utf8mb4z4CREATE DATABASE %s_test_schema CHARACTER SET utf8mb4z6CREATE DATABASE %s_test_schema_2 CHARACTER SET utf8mb4)r<_mysql_drop_dbror`r#rBrRrvrrr_mysql_create_dbs  "r}cCd||_d||_dS)Nz%s_test_schemaz%s_test_schema_2 test_schema test_schema_2rrRrrr_mysql_configure_follower rcCrTr rrQrrr_sqlite_create_dbrVrcCsV|jdd}|jtd|d|d|WddS1s$wYdS)Nrhrizselect pg_terminate_backend(pid) from pg_stat_activity where usename=current_user and pid != pg_backend_pid() and datname=:dname)dnameDROP DATABASE %s)r<rmr`rr|rrrrns"rncCs(|r td|dStd|dS)Nz%s_test_schema.dbz%s.db)osremoverQrrr_sqlite_drop_dbsrcCsX|}|d||d||d|WddS1s%wYdS)NzDROP DATABASE %s_test_schemazDROP DATABASE %s_test_schema_2rr<r`r|rrrr{s "r{oraclecCs|;}|d||d||d||d|f|d||d||d|WddS1sBwYdS)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_ts2rr|rrr_oracle_create_dbs "rcCr~N%s_ts1%s_ts2rrrrr_oracle_configure_followerrrc CVz|d|td|WdStjy*}z td|WYd}~dSd}~ww)Nzdrop user %s cascade Reaped db: %sTcouldn't drop db: %sFr`r-r.r DatabaseErrorwarning)rvrrxrrr_ora_drop_ignores  rcCsT|}t||t|d|t|d|WddS1s#wYdSr)r<rr|rrr_oracle_drop_db#s  "rcCrTr rrUrrr_oracle_update_db_opts0rVrc Cstdtt}tt}t|2}|D]'}|}|d\}}t |}| |j f}|| ||| |qWdn1sHwY|D]%}|d} t ||d} ||} | dkrkt| | qO| dkrtt| | qOdS)NzReaping databases... rrrZ)r-r. collections defaultdictrFopenstripsplitrrr"rIrKlist_reap_oracle_dbs_reap_mssql_dbs) idents_fileurlsidentsfile_linedb_namer>url_objurl_keyr%r rRrrrreap_dbs5s.        rc Cstd|t|}|r}tdd||d}dd|D}t}|D]0}|ds5|dr6q)||vrY||d ||vrL|d |d ||vrY|d |q)d }} t |d D] \} } t || rp|d 7}qctd || WddS1swYdS)Ndb reaper connecting to %ridentifiers in file: %s, zselect u.username from all_users u where username like 'TEST_%' and not exists (select username from v$session where username=u.username)cSh|]\}|qSrlower).0rHrrr Zz#_reap_oracle_dbs.._ts1_ts2rrrr-Dropped %d out of %d stale databases detected) r-r.rr<joinr`rFendswithrK enumerater) r rrBrvto_reap all_namesto_dropnamedroppedtotalrHrrrrNs8      "rcCst|}||_d|_|S)Nxe)rrrHpasswordrYrrr_oracle_follower_url_from_mainos rcCs|jdd/}|d||d||d||d||d|dWddS1s:wYdS) Nrhrizcreate database %sz1ALTER DATABASE %s SET ALLOW_SNAPSHOT_ISOLATION ONz0ALTER DATABASE %s SET READ_COMMITTED_SNAPSHOT ONzuse %szcreate schema test_schemazcreate schema test_schema_2)r<rmr`r|rrr_mssql_create_dbws  "rcCs@|jdd}t||WddS1swYdS)Nrhri)r<rm_mssql_drop_ignorer|rrr_mssql_drop_dbs "rc Cr)Nzdrop database %srTrFr)rvrRrxrrrrs  rc Cstd|t|}|jddM}tdd||d}dd|D}t}|D] }||vr8||q-d }} t |d D] \} } t || rO|d 7}qBtd || WddS1sbwYdS) Nrrhrirrzselect 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)cSrrr)rrrrrrrz"_reap_mssql_dbs..rrr) r-r.rr<rmrr`rFrKrr) r rrBrvrrrrrrrrrrrs,   "r)8rloggingrrsrrrrrrWr rutilr getLoggerr'r-FOLLOWER_IDENTobjectr r2r7rCrEr,rr/rDr9r6r;r8rr\r^rfryr}rrrnrr{rrrrrrrrrrrrrrrrs                  $          !