o
    Šå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� ¡ �V}|s| d¡ ¡ }d}	 z| d||f ¡ W n3 tjyT } z#|d7 }|dkr6‚ d	t|ƒv rJt	 
d
||j|¡ t d¡ W Y d }~n	d }~w   ‚ nqW d   ƒ d S 1 sew   Y  d S )NÚ
AUTOCOMMIT©Úisolation_levelzselect current_database()r   Tz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      à?)ÚoptionsÚpostgresql_templatedbÚexecution_optionsÚbeginÚexec_driver_sqlÚscalarr   ÚOperationalErrorÚstrr   ÚinfoÚurlÚtimeÚsleep)ÚcfgÚengÚidentÚtemplate_dbÚconnÚattemptÚerr© r)   úd/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/dialects/postgresql/provision.pyÚ_pg_create_db   sB   ÿþ
ÿû
€ë"är+   c              	   C   s’   |  ¡ jdd��7}| ¡ � | tdƒt|d�¡ | d| ¡ W d   ƒ n1 s*w   Y  W d   ƒ d S W d   ƒ d S 1 sBw   Y  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)ÚdnamezDROP DATABASE %s)Úconnectr   r   Úexecuter   Údictr   )r"   r#   r$   r&   r)   r)   r*   Ú_pg_drop_db>   s   
ÿú÷ÿ"ÿr0   c                 C   s
   ddgiS )NÚprefixesÚ	TEMPORARYr)   )r"   r#   r)   r)   r*   Ú#_postgresql_temp_table_keyword_argsM   s   
r3   c                 C   s4   |j }d|_ | ¡ }| d| ¡ | ¡  ||_ d S )NTzSET SESSION search_path='%s')Ú
autocommitÚcursorr.   Úclose)r"   Údbapi_connectionÚschema_nameÚexisting_autocommitr5   r)   r)   r*   Ú,_postgresql_set_default_schema_on_connectionR   s   
r:   c                 C   sX   |  ¡ jdd��}| d¡ ¡ D ]	}| d| ¡ qW d   ƒ d S 1 s%w   Y  d S )Nr   r   z!select gid from pg_prepared_xactszROLLBACK PREPARED '%s')r-   r   r   Úscalars)r"   r#   r&   Úxidr)   r)   r*   r	   ^   s   ÿþý"ÿr	   c              
   C   st   ddl m} t|ƒ}| ¡ �"}| d¡D ]}| | |j|d |d d�¡¡ qW d   ƒ d S 1 s3w   Y  d S )Nr   )r   Ú*ÚnameÚschema)r>   r?   )Úsqlalchemy.dialectsr   r   r   Ú	get_enumsr.   ÚDropEnumTypeÚENUM)r"   r#   r   Ú	inspectorr&   Úenumr)   r)   r*   r   g   s   
ÿÿÿ"ÿr   c                 C   s:   |  d¡}| ¡ }|rtdd dd„ |D ƒ¡ ƒ dS 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ÚresultÚ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)Úindex_elementsÚset_rR   )	Úsqlalchemy.dialects.postgresqlrS   r   Ú
selectableÚon_conflict_do_updateÚprimary_keyÚexcludedÚon_conflict_do_nothingÚ	returning)r"   Útabler\   rQ   rR   rS   ÚstmtÚtable_pkr)   r)   r*   Ú_upsertŠ   s   
ÿÿÿr`   )Úcitext©é   )Úhstorerb   c                 C   sd   |  ¡ �$}tD ]\}}|jj|kr| td|› �ƒ¡ | ¡  qW d   ƒ d S 1 s+w   Y  d S )NzCREATE EXTENSION IF NOT EXISTS )r-   Ú_extensionsÚdialectÚserver_version_infor.   r   Úcommit)r   ÚengineÚfollower_identr&   Ú	extensionÚmin_versionr)   r)   r*   Ú_create_citext_extension§   s   
ÿ€û"ÿrm   )r    Ú r   r   r   Útestingr   Útesting.provisionr   r   r	   r
   r   r   r   r   r   r   Úfor_dbr+   r0   r3   r:   r`   re   rm   r)   r)   r)   r*   Ú<module>   sJ   
"





ÿþ