U
    [h                     @   sl  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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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   )exc)url)	create_db)drop_db)follower_url_from_main)generate_driver_url)log)post_configure_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)databaseZtest)Zpasswordz	sqlite+%s)
drivername)
sa_urlmake_urlZget_driver_namer   AssertionErrorresplit_drivernamesstripset)	r   driveridentfilenameZ	needs_encZ
name_tokentokenstokenZnew_filename r$   J./venv/lib/python3.8/site-packages/sqlalchemy/dialects/sqlite/provision.py_format_url$   s<    
r&   Zsqlitec                 C   s:   t | |d } z|   W n tjk
r0   Y d S X | S d S N)r&   Zget_dialectr   ZNoSuchModuleError)r   r   Z	query_strr$   r$   r%   r   S   s    r   c                 C   s   t | d |S r'   )r&   )r   r    r$   r$   r%   _sqlite_follower_url_from_main_   s    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   )eventr   z_test_schema.dbconnectc                    s   |  d  d d S )NzATTACH DATABASE "z" AS test_schema)Zexecute)Zdbapi_connectionZconnection_recordZattach_pathr$   r%   r*   m   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!   r+   r$   r%   dispose{   s
    

z._sqlite_post_configure_engine.<locals>.dispose)Z
sqlalchemyr)   r   Zlistens_for)r   r0   Zfollower_identr)   r*   r1   r$   r+   r%   _sqlite_post_configure_engined   s    

r2   c                 C   s   d S r'   r$   cfgengr    r$   r$   r%   _sqlite_create_db   s    r6   c                 C   s   t |jj|j| d S r'   )_drop_dbs_w_identr   r   r   r3   r$   r$   r%   _sqlite_drop_db   s    r8   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)r,   listdirr-   r   r	   infor/   )Zdatabasenamer   r    r-   fnameextr$   r$   r%   r7      s
    r7   c                 C   s   |   d S r'   )r1   )Zconfigr   clsr$   r$   r%   r      s    r   c                 C   s
   ddgiS )NprefixesZ	TEMPORARYr$   )r4   r5   r$   r$   r%   _sqlite_temp_table_keyword_args   s    r@   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	   r;   joinr   r   r   r7   r   )r   Zidentsr    r   r$   r$   r%   _reap_sqlite_dbs   s    
rB   F)
set_lambdasort_by_parameter_orderc                C   sH   ddl m} ||}|r,|j||jd}n| }|j|d|i}|S )Nr   )insert)Zset_rD   )Zsqlalchemy.dialects.sqliterE   Zon_conflict_do_updateZexcludedZon_conflict_do_nothing	returning)r4   tablerF   rC   rD   rE   Zstmtr$   r$   r%   _upsert   s    rH   )r,   r    r   r0   r   r   Ztesting.provisionr   r   r   r   r	   r
   r   r   r   r   r   r&   Zfor_dbr(   r2   r6   r8   r7   r@   rB   rH   r$   r$   r$   r%   <module>	   sR   	/


)




	 