U
    ø×ccß  ã                   @   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 ¡ ¢}|s,| d¡ ¡ }d}z| d||f ¡ W q¶ tjk
r¤ } z>|d7 }|dkrl‚ dt|ƒkr”t	 
d	||j|¡ t d
¡ W 5 d }~X Y q0   ‚ Y q0X q¶q0W 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Ú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-8u86ls_i/sqlalchemy/dialects/postgresql/provision.pyÚ_pg_create_db   s4    ÿ
ÿû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#   Ú_pg_drop_db5   s    
ÿúr(   c                 C   s
   ddgiS )NÚprefixesÚ	TEMPORARYr"   )r   r   r"   r"   r#   Ú#_postgresql_temp_table_keyword_argsD   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_connectionI   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	   U   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)r1   r2   )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   j   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   
#




