U
    !Jj?                     @   sh  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"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rt	
d	||j| td
 W 5 d }~X Y q0    Y q0X qq0W 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$   /var/www/api.dyntland.com/public_html/python_social_comments/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   zselect 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   sF   |  jdd,}|d D ]}|jj||dd q W 5 Q R X d S )Nr   r   zESELECT gid FROM pg_prepared_xacts WHERE database = current_database()T)Zrecover)r'   r   r   ZscalarsdialectZdo_rollback_twophase)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)r4   r5   )Zsqlalchemy.dialectsr   r   r   Z	get_enumsr(   ZDropEnumTypeZENUM)r   r   r   Z	inspectorr!   enumr$   r$   r%   r   h   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.zselect 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   v   s    r   F)
set_lambdasort_by_parameter_orderindex_elementsc          	      C   sb   ddl m} ||}t|j}|rF|d kr0|j}|j|||jd}n| }|j|d|i}|S )Nr   )insert)rD   set_rC   )	Zsqlalchemy.dialects.postgresqlrE   r   Z
selectableZprimary_keyZon_conflict_do_updateexcludedZon_conflict_do_nothing	returning)	r   tablerH   rB   rC   rD   rE   stmtZtable_pkr$   r$   r%   _upsert   s"    

 rK   )Zcitext   )ZhstorerL   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'   _extensionsr1   Zserver_version_infor(   r   commit)r   ZengineZfollower_identr!   	extensionmin_versionr$   r$   r%   _create_citext_extension   s    
rR   )r    r   r   r   Ztestingr   Ztesting.provisionr   r   r	   r
   r   r   r   r   r   r   Zfor_dbr&   r*   r-   r0   rK   rN   rR   r$   r$   r$   r%   <module>	   sL   
"



	

