U
    [¹ÖhŠ  ã                   @   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ÚconnZattemptÚerr© r#   úN./venv/lib/python3.8/site-packages/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ÚprefixesZ	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    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!   Z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)r0   r1   )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 )ZqueryN)Ú_mapping)Ú.0Úrowr#   r#   r$   Ú	<genexpr>†   s     z*prepare_for_drop_tables.<locals>.<genexpr>N)r   Úallr   Újoin)ZconfigZ
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_elementsZset_r;   )	Zsqlalchemy.dialects.postgresqlr<   r   Z
selectableZon_conflict_do_updateZprimary_keyZexcludedZon_conflict_do_nothingÚ	returning)r   Útabler=   r:   r;   r<   ZstmtZtable_pkr#   r#   r$   Ú_upsertŠ   s    
 ÿÿÿr?   )Zcitext©é   )Zhstorer@   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&   Ú_extensionsZdialectZserver_version_infor'   r   Zcommit)r   ZengineZfollower_identr!   Ú	extensionZmin_versionr#   r#   r$   Ú_create_citext_extension§   s    
ÿrD   )r   Ú r   r   r   Ztestingr   Ztesting.provisionr   r   r	   r
   r   r   r   r   r   r   Zfor_dbr%   r)   r+   r.   r?   rB   rD   r#   r#   r#   r$   Ú<module>	   sJ   
"





 ÿþ