o
    LDi                     @   s  d dl Z 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 h 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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*d+d,d-Z!dS ).    N   event)exc)url)config)	create_db)drop_db)follower_url_from_main)generate_driver_url)log)post_configure_engine)post_configure_testing_engine)run_reap_dbs) stop_test_class_outside_fixtures)temp_table_keyword_args)upsert>   pysqlite	aiosqlitepysqlcipherpysqlite_dollarpysqlite_numericc           	      C   s  t | } |du r|  }| j}|dk}d}|rp|dkrpd|vs"J td|}|D ]}|tv r7|du r6|}q*|dv r<q*|du rE|d}q*|sPJ d| j | d| }|r`|d| 7 }|d	7 }|rj|d
7 }| j|d} |rx| jdd} | jd|f d} | S )zUgiven a sqlite url + desired driver + ident, make a canonical
    URL out of it

    Nr   :memory:test_schemaz[_\.])dbenc_z#sqlite filename has no name token: .dbz.enc)databasetest)passwordz	sqlite+%s)
drivername)	sa_urlmake_urlget_driver_namer   resplit_drivernamesstripset)	r   driveridentfilename	needs_enc
name_tokentokenstokennew_filename r2   p/var/www/www-root/data/www/77.83.87.30/venv/lib/python3.10/site-packages/sqlalchemy/dialects/sqlite/provision.py_format_url&   s>   

r4   sqlitec                 C   s2   t | |d } z|   W | S  tjy   Y d S w N)r4   get_dialectr   NoSuchModuleError)r   r*   	query_strr2   r2   r3   r   U   s   
r   c                 C   s   t | d |S r6   )r4   )r   r+   r2   r2   r3   _sqlite_follower_url_from_maina      r:   c                    sd   ddl m} |r| d|j d n|j d ||d fdd}||d fd	d
}d S )Nr   r   r   z_test_schema.dbconnectc                    s   |  d  d d S )NzATTACH DATABASE "z" AS test_schema)executedbapi_connectionconnection_recordattach_pathr2   r3   r<   o   s   

z._sqlite_post_configure_engine.<locals>.connectengine_disposedc                    sP   t j rt   | jj}|r"|dkr$t j|r&t | dS dS dS dS )zmost databases should be dropped using
        stop_test_class_outside_fixtures

        however a few tests like AttachedDBTest might not get triggered on
        that main hook

        r   N)ospathexistsremover   r   )enginer,   rA   r2   r3   dispose}   s   

z._sqlite_post_configure_engine.<locals>.dispose)
sqlalchemyr   r*   listens_for)r   rH   follower_identr   r<   rI   r2   rA   r3   _sqlite_post_configure_enginef   s   

rM   c                 C   s   | dd}| dd}|r'|jdkr't|ddd }t|dd	d
 }|r=t|jdr?d|d< |jtjj d S d S d S )Nsqlite_savepointFsqlite_share_poolr5   r<   c                 S   s
   d | _ d S r6   )isolation_levelr>   r2   r2   r3   
do_connect      
z9_sqlite_post_configure_testing_engine.<locals>.do_connectbeginc                 S   s   |  d d S )NBEGIN)exec_driver_sql)connr2   r2   r3   do_begin   s   z7_sqlite_post_configure_testing_engine.<locals>.do_begin_transfer_from
use_reaper)	getnamer   rK   hasattrpoolrX   r   r   )r   rH   optionsscoperN   rO   rQ   rW   r2   r2   r3   %_sqlite_post_configure_testing_engine   s   



r`   c                 C   s   d S r6   r2   cfgengr+   r2   r2   r3   _sqlite_create_db   s   rd   c                 C   s   t |jj|j| d S r6   )_drop_dbs_w_identr   r   r*   ra   r2   r2   r3   _sqlite_drop_db   s   rf   c                 C   sJ   t dD ]}t j|\}}||v r"|dv r"td| t | qd S )N.)r   z.db.encz!deleting SQLite database file: %s)rD   listdirrE   r&   r   inforG   )databasenamer*   r+   rE   fnameextr2   r2   r3   re      s   
re   c                 C   s   |   d S r6   )rI   )r   r   clsr2   r2   r3   r      r;   r   c                 C   s
   ddgiS )Nprefixes	TEMPORARYr2   )rb   rc   r2   r2   r3   _sqlite_temp_table_keyword_args   rR   rp   c                 C   sN   t d|  t dd| t| } |D ]}tD ]	}t| j|| qqd S )Nzdb reaper connecting to %rzidentifiers in file: %sz, )r   ri   joinr"   r#   r'   re   r   )r   identsr+   r!   r2   r2   r3   _reap_sqlite_dbs   s   
rs   F)
set_lambdasort_by_parameter_orderc                C   sH   ddl m} ||}|r|j||jd}n| }|j|d|i}|S )Nr   )insert)set_ru   )sqlalchemy.dialects.sqliterv   on_conflict_do_updateexcludedon_conflict_do_nothing	returning)rb   tabler|   rt   ru   rv   stmtr2   r2   r3   _upsert   s   r   )"rD   r%    r   r   rH   r   r"   testingr   testing.provisionr   r	   r
   r   r   r   r   r   r   r   r   r'   r4   for_dbr:   rM   r`   rd   rf   re   rp   rs   r   r2   r2   r2   r3   <module>   sR   	/


)





	