U
    ¡ÿ9a@  ã                   @   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 d¡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d„ ƒZ	e 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 ¡ È}zt| ||ƒ W n tk
r>   Y nX |sR| 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 qV   ‚ Y qVX qÜqVW 5 Q R X d S )NÚ
AUTOCOMMIT©Z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$   úL/tmp/pip-unpacked-wheel-7pet0iyd/sqlalchemy/dialects/postgresql/provision.pyÚ_pg_create_db   s<    ÿ
ÿûr&   c              
   C   sX   |  ¡ jdd>}| ¡ * | tdƒt|d¡ | d| ¡ W 5 Q R X W 5 Q R X d S )Nr   r   z€select 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|_ | ¡ }| d| ¡ | ¡  ||_ 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   sB   |  ¡ jdd(}| d¡ ¡ D ]}| d| ¡ q W 5 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   s^   ddl m} t|ƒ}| ¡ 8}| d¡D ]&}| | |j|d |d d¡¡ q(W 5 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   |  d¡}| ¡ }|r2tdd dd„ |D ƒ¡ ƒ dS )z;Ensure there are no locks on the current username/database.zµselect 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>   s4   
&




