ó
¿b›]c           @   s-  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 j e ƒ Z d Z d e f d „  ƒ  YZ d „  Z d „  Z d „  Z d „  Z d „  Z e j d „  ƒ Z e j d „  ƒ Z e j d „  ƒ Z e j d „  ƒ Z e j d „  ƒ Z  e j 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 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. d) „  Z/ e j" d& ƒ d* „  ƒ Z0 e j" d& ƒ d+ „  ƒ Z1 d, „  Z2 d- „  Z3 e! j" d& ƒ d. „  ƒ Z4 e j" d ƒ d/ „  ƒ Z5 e j" d ƒ d0 „  ƒ Z6 d1 „  Z7 d2 „  Z8 d S(3   iÿÿÿÿNi   (   t   config(   t   enginesi   (   t   create_engine(   t   exc(   t   text(   t   url(   t   compatt   registerc           B   s2   e  Z d  „  Z e d „  ƒ Z d „  Z d „  Z RS(   c         C   s   i  |  _  d  S(   N(   t   fns(   t   self(    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   __init__   s    c         C   s   t  ƒ  j d ƒ | ƒ S(   Nt   *(   R   t   for_db(   t   clst   fn(    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   init   s    c            s   ‡  ‡ f d †  } | S(   Nc            s   |  ˆ j  ˆ  <ˆ S(   N(   R   (   R   (   t   dbnameR	   (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   decorate   s    (    (   R	   R   R   (    (   R   R	   s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR      s    c         G   s’   t  | t j ƒ r$ t j | ƒ } n' t  | t j ƒ r? | } n | j j } | j ƒ  } | |  j	 k rz |  j	 | | | Œ S|  j	 d | | Œ Sd  S(   NR   (
   t
   isinstanceR   t   string_typest   sa_urlt   make_urlt   URLt   dbR   t   get_backend_nameR   (   R	   t   cfgt   argR   t   backend(    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   __call__#   s    	(   t   __name__t
   __module__R
   t   classmethodR   R   R   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR      s   		c         C   sD   x= t  ƒ  D]2 } t j d |  | j j ƒ t | | j |  ƒ q
 Wd  S(   Ns   CREATE database %s, URI %r(   t   _configs_for_db_operationt   logt   infoR   R   t
   _create_db(   t   follower_identR   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   create_follower_db1   s    c         C   s+   x$ t  j j ƒ  D] } t | |  ƒ q Wd  S(   N(   R    t   Configt   all_configst   _configure_follower(   R$   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   configure_follower7   s    c         C   s’   | r t  |  | ƒ }  n  i  } t |  | ƒ t j |  | ƒ } t |  | | ƒ | j ƒ  j ƒ  t j j	 | | | | ƒ } | rŽ t
 | | ƒ n  | S(   N(   t   _follower_url_from_maint   _update_db_optsR   t   testing_enginet   _post_configure_enginet   connectt   closeR    R&   R   R(   (   t   db_urlt   optionst   file_configR$   t   db_optst   engR   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   setup_config<   s    c         C   sD   x= t  ƒ  D]2 } t j d |  | j j ƒ t | | j |  ƒ q
 Wd  S(   Ns   DROP database %s, URI %r(   R    R!   R"   R   R   t   _drop_db(   R$   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   drop_follower_dbK   s    c          c   sÉ   t  ƒ  }  x$ t j j ƒ  D] } | j j ƒ  q Wxk t j j ƒ  D]Z } | j j } | j ƒ  } | | j | j	 | j
 f } | |  k r@ | V|  j | ƒ q@ q@ Wx$ t j j ƒ  D] } | j j ƒ  q® Wd  S(   N(   t   setR    R&   R'   R   t   disposeR   R   t   usernamet   hostt   databaset   add(   t   hostsR   R   R   t	   host_conf(    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR    Q   s    	c         C   s   t  d | j ƒ ‚ d  S(   Ns"   no DB creation routine for cfg: %s(   t   NotImplementedErrorR   (   R   R4   t   ident(    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR#   d   s    c         C   s   t  d | j ƒ ‚ d  S(   Ns   no DB drop routine for cfg: %s(   R@   R   (   R   R4   RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR6   i   s    c         C   s   d  S(   N(    (   R0   R3   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR+   n   s    c         C   s   d  S(   N(    (   R   RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR(   s   s    c         C   s   d  S(   N(    (   R   t   engineR$   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR-   x   s    c         C   s   t  j |  ƒ }  | |  _ |  S(   N(   R   R   R<   (   R   RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR*   }   s    	t   mssqlc         C   s   t  | d <d  S(   Nt   legacy_schema_aliasing(   t   False(   R0   R3   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _mssql_update_db_opts„   s    t   sqlitec         C   sA   t  j |  ƒ }  |  j s( |  j d k r, |  St  j d | ƒ Sd  S(   Ns   :memory:s   sqlite:///%s.db(   R   R   R<   (   R   RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _sqlite_follower_url_from_main‰   s    c            s5   d d l  m } | j | d ƒ ‡  f d †  ƒ } d  S(   Niÿÿÿÿ(   t   eventR.   c            s+   ˆ  s |  j  d ƒ n |  j  d ˆ  ƒ d  S(   Ns/   ATTACH DATABASE "test_schema.db" AS test_schemas2   ATTACH DATABASE "%s_test_schema.db" AS test_schema(   t   execute(   t   dbapi_connectiont   connection_record(   R$   (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR.   –   s    
(   t
   sqlalchemyRI   t   listens_for(   R   RB   R$   RI   R.   (    (   R$   s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _sqlite_post_configure_engine’   s    t
   postgresqlc      	   C   s  |  j  j } | j ƒ  j d d ƒ ï } y t |  | | ƒ Wn t k
 rN n X| sg | j d ƒ } n  d } xŸ t ry | j d | | f ƒ Wnv t	 j
 k
 r } | d 7} | d k rÂ ‚  n  d t | ƒ k rt j d	 | | j | ƒ t j d
 ƒ qqp ‚  qp XPqp WWd  QXd  S(   Nt   isolation_levelt
   AUTOCOMMITs   select current_database()i    s   CREATE DATABASE %s TEMPLATE %si   i   s   accessed by other userssF   Waiting to create %s, URI %r, template DB %s is in use sleeping for .5g      à?(   R1   t   postgresql_templatedbR.   t   execution_optionst   _pg_drop_dbt	   Exceptiont   scalart   TrueRJ   R   t   OperationalErrort   strR!   R"   R   t   timet   sleep(   R   R4   RA   t   template_dbt   connt   attemptt   err(    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _pg_create_db¥   s6    	
t   mysqlc      	   C   st   | j  ƒ  b } y t |  | | ƒ Wn t k
 r6 n X| j d | ƒ | j d | ƒ | j d | ƒ Wd  QXd  S(   Ns(   CREATE DATABASE %s CHARACTER SET utf8mb4s4   CREATE DATABASE %s_test_schema CHARACTER SET utf8mb4s6   CREATE DATABASE %s_test_schema_2 CHARACTER SET utf8mb4(   R.   t   _mysql_drop_dbRV   RJ   (   R   R4   RA   R^   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _mysql_create_dbÊ   s    c         C   s   d | |  _  d | |  _ d  S(   Ns   %s_test_schemas   %s_test_schema_2(   t   test_schemat   test_schema_2(   R    RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _mysql_configure_followerÛ   s    c         C   s   d  S(   N(    (   R   R4   RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _sqlite_create_dbá   s    c         C   sO   | j  ƒ  j d d ƒ 1 } | j t d ƒ d | ƒ| j d | ƒ Wd  QXd  S(   NRQ   RR   s€   select pg_terminate_backend(pid) from pg_stat_activity where usename=current_user and pid != pg_backend_pid() and datname=:dnamet   dnames   DROP DATABASE %s(   R.   RT   RJ   R   (   R   R4   RA   R^   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyRU   æ   s    	c         C   s/   | r t  j d | ƒ n t  j d | ƒ d  S(   Ns   %s_test_schema.dbs   %s.db(   t   ost   remove(   R   R4   RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _sqlite_drop_dbô   s    c         C   sL   | j  ƒ  : } | j d | ƒ | j d | ƒ | j d | ƒ Wd  QXd  S(   Ns   DROP DATABASE %s_test_schemas   DROP DATABASE %s_test_schema_2s   DROP DATABASE %s(   R.   RJ   (   R   R4   RA   R^   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyRc   ü   s    t   oraclec         C   s“   | j  ƒ   } | j d | ƒ | j d | ƒ | j d | ƒ | j d | f ƒ | j d | ƒ | j d | ƒ | j d | ƒ Wd  QXd  S(   Ns   create user %s identified by xes#   create user %s_ts1 identified by xes#   create user %s_ts2 identified by xes   grant dba to %ss    grant unlimited tablespace to %ss$   grant unlimited tablespace to %s_ts1s$   grant unlimited tablespace to %s_ts2(   R.   RJ   (   R   R4   RA   R^   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _oracle_create_db  s    c         C   s   d | |  _  d | |  _ d  S(   Ns   %s_ts1s   %s_ts2(   Re   Rf   (   R    RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _oracle_configure_follower  s    c         C   sW   y) |  j  d | ƒ t j d | ƒ t SWn' t j k
 rR } t j d | ƒ t SXd  S(   Ns   drop user %s cascades   Reaped db: %ss   couldn't drop db: %s(   RJ   R!   R"   RX   R   t   DatabaseErrort   warningRE   (   R^   R   R`   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _ora_drop_ignore  s    c         C   sH   | j  ƒ  6 } t | | ƒ t | d | ƒ t | d | ƒ Wd  QXd  S(   Ns   %s_ts1s   %s_ts2(   R.   Rr   (   R   R4   RA   R^   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _oracle_drop_db#  s    c         C   s   d  S(   N(    (   R0   R3   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _oracle_update_db_opts0  s    c         C   s-  t  j d ƒ t j t ƒ } t j t ƒ } t |  ƒ  } xu | D]m } | j ƒ  } | j d ƒ \ } } t j	 | ƒ } | j
 ƒ  | j f } | | j | ƒ | | j | ƒ qA WWd  QXxn | D]f } | d }	 t | | ƒ d }
 | | } |	 d k r	t |
 | ƒ q¿ |	 d k r¿ t |
 | ƒ q¿ q¿ Wd  S(   Ns   Reaping databases...t    i    Rm   RC   (   R!   R"   t   collectionst   defaultdictR8   t   opent   stript   splitR   R   R   R;   R=   t   listt   _reap_oracle_dbst   _reap_mssql_dbs(   t   idents_filet   urlst   identst   file_t   linet   db_nameR0   t   url_objt   url_keyR   R   RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   reap_dbs5  s&    

c         C   sh  t  j d |  ƒ t |  ƒ } | j ƒ  :} t  j d d j | ƒ ƒ | j d ƒ } d „  | Dƒ } t ƒ  } x– | D]Ž } | j d ƒ ss | j d ƒ r qs qs | | k rs | j | ƒ d | | k rÚ | j d | ƒ n  d	 | | k r| j d	 | ƒ qqs qs Wd
 } }	 x9 t	 | d ƒ D]( \ }	 }
 t
 | |
 ƒ r| d 7} qqWt  j d | |	 ƒ Wd  QXd  S(   Ns   db reaper connecting to %rs   identifiers in file: %ss   , s‰   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  |  ] \ } | j  ƒ  ’ q S(    (   t   lower(   t   .0R:   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pys	   <setcomp>Z  s   	 t   _ts1t   _ts2s   %s_ts1s   %s_ts2i    i   s-   Dropped %d out of %d stale databases detected(   R!   R"   R   R.   t   joinRJ   R8   t   endswithR=   t	   enumerateRr   (   R   R€   R4   R^   t   to_reapt	   all_namest   to_dropt   namet   droppedt   totalR:   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR|   N  s.    		
c         C   s%   t  j |  ƒ }  | |  _ d |  _ |  S(   Nt   xe(   R   R   R:   t   password(   R   RA   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _oracle_follower_url_from_maino  s    		c         C   sƒ   | j  ƒ  j d d ƒ e } | j d | ƒ | j d | ƒ | j d | ƒ | j d | ƒ | j d ƒ | j d ƒ Wd  QXd  S(	   NRQ   RR   s   create database %ss1   ALTER DATABASE %s SET ALLOW_SNAPSHOT_ISOLATION ONs0   ALTER DATABASE %s SET READ_COMMITTED_SNAPSHOT ONs   use %ss   create schema test_schemas   create schema test_schema_2(   R.   RT   RJ   (   R   R4   RA   R^   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _mssql_create_dbw  s    c         C   s2   | j  ƒ  j d d ƒ  } t | | ƒ Wd  QXd  S(   NRQ   RR   (   R.   RT   t   _mssql_drop_ignore(   R   R4   RA   R^   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   _mssql_drop_db†  s    c         C   sW   y) |  j  d | ƒ t j d | ƒ t SWn' t j k
 rR } t j d | ƒ t SXd  S(   Ns   drop database %ss   Reaped db: %ss   couldn't drop db: %s(   RJ   R!   R"   RX   R   Rp   Rq   RE   (   R^   RA   R`   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR˜   Œ  s    	c         C   s  t  j d |  ƒ t |  ƒ } | j ƒ  j d d ƒ Î } t  j d d j | ƒ ƒ | j d ƒ } d „  | Dƒ } t ƒ  } x* | D]" } | | k r | j | ƒ q q Wd } }	 x9 t	 | d	 ƒ D]( \ }	 }
 t
 | |
 ƒ r¿ | d	 7} q¿ q¿ Wt  j d
 | |	 ƒ Wd  QXd  S(   Ns   db reaper connecting to %rRQ   RR   s   identifiers in file: %ss   , s›   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  |  ] \ } | j  ƒ  ’ q S(    (   R‡   (   Rˆ   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pys	   <setcomp>«  s   	 i    i   s-   Dropped %d out of %d stale databases detected(   R!   R"   R   R.   RT   R‹   RJ   R8   R=   R   R˜   (   R   R€   R4   R^   RŽ   R   R   R‘   R’   R“   R   (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyR}   ž  s"    		
(9   Rv   t   loggingRj   R[   t    R    R   R   R   R   RB   R   R   t   utilR   t	   getLoggerR   R!   t   Nonet   FOLLOWER_IDENTt   objectR   R%   R)   R5   R7   R    R   R#   R6   R+   R(   R-   R*   R   RF   RH   RO   Ra   Rd   Rg   Rh   RU   Rl   Rc   Rn   Ro   Rr   Rs   Rt   R†   R|   R–   R—   R™   R˜   R}   (    (    (    s;   lib/python2.7/site-packages/sqlalchemy/testing/provision.pyt   <module>   s\   						%	
		!	