o
    LDi+                     @   s0  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 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dd  Zedd!d" Z edd#d$ Z!edd%d& Z"edd'd( Z#d=d)d*Z$edd+d, Z%d-d. Z&edd/d0 Z'edd1d2 Z(edd3d4 Z)edd5d6 Z*edd7d8 Z+edd9d: Z,edd;d< Z-dS )>    N   )create_engine)exc)inspect)url)configure_follower)	create_db)#drop_all_schema_objects_post_tables)"drop_all_schema_objects_pre_tables)drop_db)follower_url_from_main)generate_driver_url)is_preferred_driver)log)post_configure_engine)post_configure_testing_engine)run_reap_dbs) set_default_schema_on_connection) stop_test_class_outside_fixtures)temp_table_keyword_args)update_db_opts)warn_test_suiteoraclec                 C   sh   |   }| jd||f d}|dv r|ddg}n|ddg}z|  W |S  tjy3   Y d S w )Nz%s+%s)
drivername)oracledboracledb_async)retry_count5)retry_delay2r   r   )get_backend_namesetupdate_query_pairsdifference_update_queryget_dialectr   NoSuchModuleError)r   driver	query_strbackendnew_url r*   p/var/www/www-root/data/www/77.83.87.30/venv/lib/python3.10/site-packages/sqlalchemy/dialects/oracle/provision.py_oracle_generate_driver_url"   s"   

r,   c                 C   s   |  P}|d|  |d|  |d|  |d|f  |d|  |d|  |d|  |d|  |d	|  |d
|  W d    d S 1 sWw   Y  d S )Nzcreate user %s identified by xez#create user %s_ts1 identified by xez#create user %s_ts2 identified by xezgrant dba to %sz grant unlimited tablespace to %sz$grant unlimited tablespace to %s_ts1z$grant unlimited tablespace to %s_ts2zgrant create table to %szgrant create table to %s_ts1zgrant create table to %s_ts2)beginexec_driver_sqlcfgengidentconnr*   r*   r+   _oracle_create_dbC   s   
"r4   c                 C   s   d| | _ d| | _d S N%s_ts1%s_ts2)test_schematest_schema_2)configr2   r*   r*   r+   _oracle_configure_followerV      
r;   c              
   C   sV   z|  d|  td| W dS  tjy* } ztd| W Y d }~dS d }~ww )Nzdrop user %s cascadezReaped db: %sTzcouldn't drop db: %sF)r.   r   infor   DatabaseErrorwarning)r3   dbnameerrr*   r*   r+   _ora_drop_ignore\   s   rB   c                 C   s   t | t || j d S N)_purge_recyclebinr8   r0   r1   r*   r*   r+   '_ora_drop_all_schema_objects_pre_tablesf   s   rF   c              	   C   s   |  K}|j|d d d D ]}|d|d   q|j|| jd d D ]}|d| j d|d   q%t| D ]
}|d|  q<W d    d S 1 sRw   Y  d S )Nzdrop synonym synonym_name.zdrop table )r-   dialect_get_synonymsr.   r8   r   get_temp_table_names)r0   r1   r3   syn	tmp_tabler*   r*   r+   (_ora_drop_all_schema_objects_post_tablesl   s   

"rN   c                 C   sT   |  }t|| t|d|  t|d|  W d    d S 1 s#w   Y  d S r5   )r-   rB   r/   r*   r*   r+   _oracle_drop_db}   s
   

"rO   c              
   C   sD   zt | W d S  tjy! } ztd| W Y d }~d S d }~ww )Nz#purge recyclebin command failed: %s)rD   r   r>   r   r?   )r:   dbclsrA   r*   r*   r+   %_ora_stop_test_class_outside_fixtures   s   rR   c                 C   s   |   >}|d u r|d n#|dd|j|i D ]\}}}|d| d| d| d qW d    d S W d    d S 1 sEw   Y  d S )Nzpurge recyclebinzWselect owner, object_name,type from dba_recyclebin where owner=:schema and type='TABLE'schemazpurge  z."")r-   r.   rI   denormalize_nameall)r1   rS   r3   ownerobject_nametype_r*   r*   r+   rD      s   
 "rD   c                 C   s   |j jdko
|j j S )ztestablish oracledb as the preferred driver to use for tests, even
    though cx_Oracle is still the "default" driverr   )rI   r&   is_async)r0   enginer*   r*   r+   _oracle_is_preferred_driver   s   r]   c                 C   s   | j dksJ dd }d }tdD ]6}z| jj|i |W   S  | jj| jjfyG } z|}||rBtd td W Y d }~q d }~ww |d urQt	d|d S )N	cx_oraclec                 S   s   dt | v pdt | v S )NzDPY-6005z	ORA-12516)str)rA   r*   r*   r+   _is_couldnt_connect   s   z0_connect_with_retry.<locals>._is_couldnt_connect   zOracle database reconnecting...   z"connect failed after five attempts)
r&   rangeloaded_dbapiconnectr>   OperationalErrorr   timesleep	Exception)rI   conn_reccargscparamsr`   err__rA   r*   r*   r+   _connect_with_retry   s*   

ro   c                 C   s.   ddl m} |jjdkr||dt d S d S )Nr   eventr^   
do_connect) rq   rI   r&   listenro   )r   r\   optionsscoperq   r*   r*   r+   %_oracle_post_configure_testing_engine   s   rw   c                 C   s$   ddl m} ||ddd }d S )Nr   rp   checkinc                 S   s(   z| j }W n   Y d S d| _ || _ d S )Nr   )stmtcachesize)dbapi_connectionconnection_recordscr*   r*   r+   rx      s   

z._oracle_post_configure_engine.<locals>.checkin)rs   rq   listens_for)r   r\   follower_identrq   rx   r*   r*   r+   _oracle_post_configure_engine   s   
r   c                 C   s  t d|  t| }| r}t dd| |d}dd |D }t }|D ]0}|ds5|dr6q)||v rY|| d	| |v rL|d	|  d
| |v rY|d
|  q)d }}	t	|dD ]\}	}
t
||
rp|d7 }qct d||	 W d    d S 1 sw   Y  d S )Nzdb reaper connecting to %rzidentifiers in file: %sz, zselect u.username from all_users u where username like 'TEST_%' and not exists (select username from v$session where username=u.username)c                 S   s   h | ]\}|  qS r*   )lower).0usernamer*   r*   r+   	<setcomp>   s    z#_reap_oracle_dbs.<locals>.<setcomp>_ts1_ts2r6   r7   r      z-Dropped %d out of %d stale databases detected)r   r=   r   r-   joinr.   r!   endswithadd	enumeraterB   )r   identsr1   r3   to_reap	all_namesto_dropnamedroppedtotalr   r*   r*   r+   _reap_oracle_dbs   s8   


"r   c                 C   s   t | } | j|ddS )Nxe)r   password)sa_urlmake_urlr!   )r   r2   r*   r*   r+   _oracle_follower_url_from_main  r<   r   c                 C   s   dgddS )NzGLOBAL TEMPORARYzPRESERVE ROWS)prefixesoracle_on_commitr*   rE   r*   r*   r+   _oracle_temp_table_keyword_args  s   r   c                 C   s"   |  }|d|  |  d S )Nz#ALTER SESSION SET CURRENT_SCHEMA=%s)cursorexecuteclose)r0   rz   schema_namer   r*   r*   r+   (_oracle_set_default_schema_on_connection  s   r   c                 C   s,   |j rt|  dkrd|d< dS dS dS )zCSet database options (db_opts) for a test database that we created.r   T
thick_modeN)oracledb_thick_moder   r   get_driver_name)db_urldb_optsru   r*   r*   r+   _update_db_opts"  s   r   rC   ).rg   rs   r   r   r   r\   r   r   testing.provisionr   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   testing.warningsr   for_dbr,   r4   r;   rB   rF   rN   rO   rR   rD   r]   ro   rw   r   r   r   r   r   r   r*   r*   r*   r+   <module>   sn   
 











 


