3
a@                 @   s  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
 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ddd Zejddd Zejddd Zejddd Ze
jddd Z
e	jddd Z	ejddd ZdS )    N   )exc)inspect)text)warn_test_suite)	create_db)#drop_all_schema_objects_post_tables)"drop_all_schema_objects_pre_tables)drop_db)log)prepare_for_drop_tables) set_default_schema_on_connection)temp_table_keyword_args
postgresqlc              C   s   | j j}|jddj }yt| || W n tk
r>   Y nX |sR|jdj }d}xy|jd||f  W nj tj	k
r } z@|d7 }|dkr dt
|krtjd	||j| tjd
 W Y d d }~X qX    Y qXX P qXW W d Q R X d S )N
AUTOCOMMIT)isolation_levelzselect current_database()r   zCREATE DATABASE %s TEMPLATE %s   r   zaccessed by other userszFWaiting to create %s, URI %r, template DB %s is in use sleeping for .5g      ?)optionsZpostgresql_templatedbexecution_optionsbegin_pg_drop_db	Exceptionexec_driver_sqlZscalarr   ZOperationalErrorstrr   infourltimesleep)cfgengidentZtemplate_dbconnattempterr r$   N/tmp/pip-build-6_cqtusv/SQLAlchemy/sqlalchemy/dialects/postgresql/provision.py_pg_create_db   s8    
r&   c             C   sX   |j  jdd>}|j * |jtdt|d |jd|  W d Q R X W d Q R X d S )Nr   )r   zselect pg_terminate_backend(pid) from pg_stat_activity where usename=current_user and pid != pg_backend_pid() and datname=:dname)ZdnamezDROP DATABASE %s)connectr   r   executer   dictr   )r   r   r    r!   r$   r$   r%   r   8   s    
r   c             C   s
   ddgiS )Nprefixes	TEMPORARYr$   )r   r   r$   r$   r%   #_postgresql_temp_table_keyword_argsG   s    r,   c             C   s4   |j }d|_ |j }|jd|  |j  ||_ d S )NTzSET SESSION search_path='%s')Z
autocommitcursorr(   close)r   Zdbapi_connectionZschema_nameZexisting_autocommitr-   r$   r$   r%   ,_postgresql_set_default_schema_on_connectionL   s    r/   c             C   sF   |j  jdd,}x$|jdj D ]}|jd|  q"W W d Q R X d S )Nr   )r   z!select gid from pg_prepared_xactszROLLBACK PREPARED '%s')r'   r   r(   Zscalars)r   r   r!   xidr$   r$   r%   r	   X   s    r	   c             C   sb   ddl m} t|}|j <}x4|jdD ]&}|j|j|j|d |d d q*W W d Q R X d S )Nr   )r   *nameschema)r2   r3   )Zsqlalchemy.dialectsr   r   r   Z	get_enumsr(   ZDropEnumTypeZENUM)r   r   r   Z	inspectorr!   enumr$   r$   r%   r   _   s    
r   c             C   s6   |j d}|j }|r2tddjdd |D   dS )z;Ensure there are no locks on the current username/database.zselect pid, state, wait_event_type, query from pg_stat_activity where usename=current_user and datname=current_database() and state='idle in transaction' and pid != pg_backend_pid()zHPostgreSQL may not be able to DROP tables due to idle in transaction: %sz; c             s   s   | ]}|j d  V  qdS )queryN)_mapping).0rowr$   r$   r%   	<genexpr>~   s    z*prepare_for_drop_tables.<locals>.<genexpr>N)r   allr   join)config
connectionresultZrowsr$   r$   r%   r   m   s    r   )r    r   r   r   Ztestingr   Ztesting.provisionr   r   r	   r
   r   r   r   r   Zfor_dbr&   r   r,   r/   r$   r$   r$   r%   <module>   s&   '