
    g                     t   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y)    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                  }|j                  d      j                         5 }|s|j	                  d      j                         }d}	 	 |j	                  d|d|       	 d d d        y # t        j                  $ rY}|dz  }|dk\  r d	t        |      v r7t        j                  d
||j                  |       t        j                  d       Y d }~n	d }~w  xY w# 1 sw Y   y xY w)N
AUTOCOMMITisolation_levelzselect current_database()r   z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          h/var/www/api/v1/venv_getwork_v1/lib/python3.12/site-packages/sqlalchemy/dialects/postgresql/provision.py_pg_create_dbr,      s    ++33K			|		<	B	B	D..+fh  $$8={K& 9 
E	D '' $1a<,C8HHC# JJsO'  
E	Ds0   %C/A>>C+AC% C/%C++C//C8c                 *   |j                         j                  d      5 }|j                         5  |j                  t	        d      t        |             |j                  d|z         d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)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   >   s{    		(	(	(	F$ZZ\LL)
 5!   !3e!;<  
G	F\ 
G	Fs"   B	:A=,B	=B	B		Bc                     ddgiS )Nprefixes	TEMPORARY )r$   r%   s     r+   #_postgresql_temp_table_keyword_argsr7   M   s    &&    c                     |j                   }d|_         |j                         }|j                  d|z         |j                          ||_         y )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   sK     +55"&$$&F
NN1K?@
LLN"5r8   c                     |j                         j                  d      5 }|j                  d      j                         D ]  }|j                  d|z          	 d d d        y # 1 sw Y   y xY w)Nr   r   z!select gid from pg_prepared_xactszROLLBACK PREPARED '%s')r/   r   r   scalars)r$   r%   r(   xids       r+   r
   r
   ^   sb    		(	(	(	F$''/

')C   !9C!?@ 
G	F	Fs   9A$$A-c                    ddl m} t        |      }|j                         5 }|j	                  d      D ]9  }|j                  |j                  |j                  |d   |d                      ; 	 d d d        y # 1 sw Y   y xY w)Nr   )r   *nameschema)rF   rG   )sqlalchemy.dialectsr   r   r   	get_enumsr0   DropEnumTypeENUM)r$   r%   r   	inspectorr(   enums         r+   r	   r	   g   sj    .I	'',DLL''OOfd8nOM - 
s   AA::Bc                     |j                  d      }|j                         }|r%t        ddj                  d |D              z         yy)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   :   K   | ]  }|j                   d      yw)queryN)_mapping).0rows     r+   	<genexpr>z*prepare_for_drop_tables.<locals>.<genexpr>   s     ?$3g.$s   N)r   allr   join)config
connectionresultrowss       r+   r   r   u   sS     ''	&F ::<D&yy?$??A	
 r8   F)
set_lambdasort_by_parameter_orderc                    ddl m}  ||      }t        |      j                  }|r.|j	                  |j
                   ||j                              }n|j                         } |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%=Du~((H))#//j6O * 
 **,4>>	,CD Kr8   )citext   )hstorerm   c                     |j                         5 }t        D ]L  \  }}|j                  j                  |k\  s |j	                  t        d|              |j                          N 	 d d d        y # 1 sw Y   y xY w)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      sb    		T&1"I{||//;>:9+FG  '2 
		s   &A1/A11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~      sv       & * D C ( $ 6 8 A 8 ' ,  D = =  -' .' )!((66 76 +#**<8A 9A ,$++L9
 :
  -
 .
( |)-u .  l+ ,r8   