U
    ov¨gŠ  ã                   @   sf  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 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e d¡dd d!œd"d#„ƒZd$d%g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)Úpost_configure_engine)Úprepare_for_drop_tables)Ú set_default_schema_on_connection)Útemp_table_keyword_args)ÚupsertÚ
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-uqd9otp_/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_db>   s    
ÿúr*   c                 C   s
   ddgiS )NÚprefixesÚ	TEMPORARYr$   )r   r   r$   r$   r%   Ú#_postgresql_temp_table_keyword_argsM   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_connectionR   s    r0   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	   ^   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)r3   r4   )Zsqlalchemy.dialectsr   r   r   Z	get_enumsr(   ZDropEnumTypeZENUM)r   r   r   Z	inspectorr!   Úenumr$   r$   r%   r   g   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   u   s    ÿþÿr   F)Ú
set_lambdaÚsort_by_parameter_orderc                C   sV   ddl m} ||ƒ}t|ƒj}|r:|j|j||jƒd}n| ¡ }|j|d|iŽ}|S )Nr   )Úinsert)Zindex_elementsÚset_rA   )	Zsqlalchemy.dialects.postgresqlrB   r   Z
selectableZon_conflict_do_updateZprimary_keyZexcludedZon_conflict_do_nothingÚ	returning)r   ÚtablerD   r@   rA   rB   ZstmtZtable_pkr$   r$   r%   Ú_upsertŠ   s    
 ÿÿÿrF   )Zcitext©é   )ZhstorerG   c              	   C   sN   |  ¡ <}tD ]0\}}|jj|kr| td|› ƒ¡ | ¡  qW 5 Q R X d S )NzCREATE EXTENSION IF NOT EXISTS )r'   Ú_extensionsÚdialectZserver_version_infor(   r   Úcommit)r   ZengineZfollower_identr!   Ú	extensionÚmin_versionr$   r$   r%   Ú_create_citext_extension§   s    
ÿrN   )r   Ú r   r   r   Ztestingr   Ztesting.provisionr   r   r	   r
   r   r   r   r   r   r   Zfor_dbr&   r*   r-   r0   rF   rI   rN   r$   r$   r$   r%   Ú<module>	   sJ   
"





 ÿþ