
    [h                        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j        d          d             Z ej        d          d             Z ej        d          d             Z ej        d          d             Z e
j        d          d             Z
 e	j        d          d             Z	 ej        d          d             Z ej        d          dddd            ZddgZ ej        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                 
   | j         j        }|                    d                                          5 }|s'|                    d                                          }d}	 	 |                    d|d|           nk# t          j        $ rW}|dz  }|d	k    r d
t          |          v r0t          j
        d||j        |           t          j        d           Y d }~n	d }~w  xY w	 d d d            d S # 1 swxY w Y   d S )N
AUTOCOMMITisolation_levelzselect current_database()r   TzCREATE DATABASE z
 TEMPLATE    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errs          w/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/sqlalchemy/dialects/postgresql/provision.py_pg_create_dbr,      s   +3K			|		<	<	B	B	D	D  	..+ fhh  	$$$8={{K  & ! ' $ $ $1a<<,C88HC#   JsOOO'	* 9                 s<   -C8#A?>C8?C&AC C8 C&&C88C<?C<c                 r   |                                                     d          5 }|                                5  |                    t	          d          t          |                     |                    d|z             d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   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)dnamezDROP DATABASE %s)connectr   r   executer   dictr   )r$   r%   r&   r(   s       r+   _pg_drop_dbr2   >   s9   		(	(	(	F	F 
=$ZZ\\ 		= 		=LL) 
 5!!!     !3e!;<<<		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		= 		=
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
= 
=s5   B,A
BB,B	B,B	B,,B03B0c                     ddgiS )Nprefixes	TEMPORARY )r$   r%   s     r+   #_postgresql_temp_table_keyword_argsr7   M   s    &&    c                     |j         }d|_         |                                }|                    d|z             |                                 ||_         d S )NTzSET SESSION search_path='%s')
autocommitcursorr0   close)r$   dbapi_connectionschema_nameexisting_autocommitr;   s        r+   ,_postgresql_set_default_schema_on_connectionr@   R   s[     +5"&$$&&F
NN1K?@@@
LLNNN"5r8   c                    |                                                     d          5 }|                    d                                          D ]}|                    d|z             	 d d d            d S # 1 swxY w Y   d S )Nr   r   z!select gid from pg_prepared_xactszROLLBACK PREPARED '%s')r/   r   r   scalars)r$   r%   r(   xids       r+   r
   r
   ^   s    		(	(	(	F	F A$''/
 

'))	A 	AC   !9C!?@@@@	AA A A A A A A A A A A A A A A A A As   AA::A>A>c                 N   ddl m} t          |          }|                                5 }|                    d          D ]K}|                    |                    |                    |d         |d                                        L	 d d d            d S # 1 swxY w Y   d S )Nr   )r   *nameschema)rF   rG   )sqlalchemy.dialectsr   r   r   	get_enumsr0   DropEnumTypeENUM)r$   r%   r   	inspectorr(   enums         r+   r	   r	   g   s    ......I	 '',, 	 	DLL''OOfd8nOMM    	                 s   A"BB!Bc                     |                     d          }|                                }|r1t          dd                    d |D                       z             dS 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              3   0   K   | ]}|j         d          V  dS )queryN)_mapping).0rows     r+   	<genexpr>z*prepare_for_drop_tables.<locals>.<genexpr>   s)      ??3g.??????r8   N)r   allr   join)config
connectionresultrowss       r+   r   r   u   s     ''	& F ::<<D 
&yy??$?????A	
 	
 	
 	
 	

 
r8   F)
set_lambdasort_by_parameter_orderc                    ddl m}  ||          }t          |          j        }|r+|                    |j         ||j                            }n|                                } |j        |d|i}|S )Nr   )insert)index_elementsset_r\   )	sqlalchemy.dialects.postgresqlr^   r   
selectableon_conflict_do_updateprimary_keyexcludedon_conflict_do_nothing	returning)r$   tablerg   r[   r\   r^   stmttable_pks           r+   _upsertrk      s     6555556%==Du~~(H -))#/jj6O6O * 
 
 **,,4>	,C D Kr8   )citext   )hstorerm   c                    |                                 5 }t          D ]N\  }}|j        j        |k    r9|                    t          d|                      |                                 O	 d d d            d S # 1 swxY w Y   d S )NzCREATE EXTENSION IF NOT EXISTS )r/   _extensionsdialectserver_version_infor0   r   commit)r!   enginefollower_identr(   	extensionmin_versions         r+   _create_citext_extensionry      s    			 T&1 	 	"I{|/;>>F9FFGG   	                 s   AA::A>A>)r"    r   r   r   testingr   testing.provisionr   r	   r
   r   r   r   r   r   r   r   for_dbr,   r2   r7   r@   rk   rq   ry   r6   r8   r+   <module>r~      s                      & & & & & & * * * * * * D D D D D D C C C C C C ( ( ( ( ( ( $ $ $ $ $ $ 6 6 6 6 6 6 8 8 8 8 8 8 A A A A A A 8 8 8 8 8 8 ' ' ' ' ' ' ,   D = = =  --' ' .-' )!(666 6 766 +#*<88A A 98A ,$+L99
 
 :9
  --
 
 .-
( |)-u    .  l++  ,+  r8   