U
    ui                     @   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 dddddh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/d0d1Z!dS )2    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)upsertZpysqliteZ	aiosqlitepysqlcipherZpysqlite_numericZpysqlite_dollarc           	      C   s
  t | } |dkr|  }| j}|dk}d}|r|dkrd|ksDttd|}|D ]:}|tkrp|dkrT|}qTqT|dkr|qTqT|dkrT|d}qT|std| j | d| }|r|d| 7 }|d	7 }|r|d
7 }| j	|d} |r| j	dd} | j	d|f d} | S )zUgiven a sqlite url + desired driver + ident, make a canonical
    URL out of it

    Nr   :memory:Ztest_schemaz[_\.])dbenc_z#sqlite filename has no name token: .dbz.enc)databasetest)passwordz	sqlite+%s)
drivername)
sa_urlmake_urlZget_driver_namer   AssertionErrorresplit_drivernamesstripset)	r   driveridentfilenameZ	needs_enc
name_tokentokenstokenZnew_filename r+   ^/home/lhs5088/backend/venv/lib/python3.8/site-packages/sqlalchemy/dialects/sqlite/provision.py_format_url&   s<    
r-   sqlitec                 C   s:   t | |d } z|   W n tjk
r0   Y d S X | S d S N)r-   get_dialectr   ZNoSuchModuleError)r   r%   Z	query_strr+   r+   r,   r   U   s    r   c                 C   s   t | d |S r/   )r-   )r   r&   r+   r+   r,   _sqlite_follower_url_from_maina   s    r1   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Zdbapi_connectionZconnection_recordZattach_pathr+   r,   r2   o   s    

z._sqlite_post_configure_engine.<locals>.connectZengine_disposedc                    sD   t j rt   | jj}|r@|dkr@t j|r@t | 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'   r5   r+   r,   dispose}   s
    

z._sqlite_post_configure_engine.<locals>.dispose)Z
sqlalchemyr   r%   listens_for)r   r:   Zfollower_identr   r2   r;   r+   r5   r,   _sqlite_post_configure_enginef   s    

r=   c                 C   sz   | dd}| dd}|rN|jdkrNt|ddd }t|dd	d
 }|rvt|jdrvd|d< |jtjj d S )Nsqlite_savepointFsqlite_share_poolr.   r2   c                 S   s
   d | _ d S r/   )Zisolation_levelr4   r+   r+   r,   
do_connect   s    z9_sqlite_post_configure_testing_engine.<locals>.do_connectbeginc                 S   s   |  d d S )NZBEGIN)Zexec_driver_sql)connr+   r+   r,   do_begin   s    z7_sqlite_post_configure_testing_engine.<locals>.do_begin_transfer_fromZ
use_reaper)	getnamer   r<   hasattrpoolrD   r   r   )r   r:   optionsscoper>   r?   r@   rC   r+   r+   r,   %_sqlite_post_configure_testing_engine   s    



rK   c                 C   s   d S r/   r+   cfgengr&   r+   r+   r,   _sqlite_create_db   s    rO   c                 C   s   t |jj|j| d S r/   )_drop_dbs_w_identr   r   r%   rL   r+   r+   r,   _sqlite_drop_db   s    rQ   c                 C   sJ   t dD ]:}t j|\}}||kr
|dkr
td| t | q
d S )N.)r   z.db.encz!deleting SQLite database file: %s)r6   listdirr7   r!   r   infor9   )Zdatabasenamer%   r&   r7   fnameextr+   r+   r,   rP      s
    rP   c                 C   s   |   d S r/   )r;   )r   r   clsr+   r+   r,   r      s    r   c                 C   s
   ddgiS )Nprefixes	TEMPORARYr+   )rM   rN   r+   r+   r,   _sqlite_temp_table_keyword_args   s    rZ   c                 C   sN   t d|  t dd| t| } |D ]}tD ]}t| j|| q4q,d S )Nzdb reaper connecting to %rzidentifiers in file: %sz, )r   rT   joinr   r   r"   rP   r   )r   Zidentsr&   r   r+   r+   r,   _reap_sqlite_dbs   s    
r\   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_r^   )Zsqlalchemy.dialects.sqliter_   Zon_conflict_do_updateexcludedZon_conflict_do_nothing	returning)rM   tablerb   r]   r^   r_   stmtr+   r+   r,   _upsert   s    re   )"r6   r     r   r   r:   r   r   Ztestingr   Ztesting.provisionr   r	   r
   r   r   r   r   r   r   r   r   r"   r-   Zfor_dbr1   r=   rK   rO   rQ   rP   rZ   r\   re   r+   r+   r+   r,   <module>	   s\   	/


)





	 