o
    Šåg   ã                   @   sf  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 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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)Úupsert>   ÚpysqliteÚ	aiosqliteÚpysqlcipherÚpysqlite_dollarÚpysqlite_numericc           	      C   s  t  | ¡} |du r|  ¡ }| j}|dk}d}|rs|dkrsd|vs"J ‚t d|¡}|› }|D ]}|tv r:|du r9|}q-|dv r?q-|du rH| d¡}q-|sSJ d| j› �ƒ‚|› d|› �}|rc|d|› �7 }|d	7 }|rm|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:Ú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Únew_filenameÚtoken© r.   ú`/var/www/html/flaskapp/venv/lib/python3.10/site-packages/sqlalchemy/dialects/sqlite/provision.pyÚ_format_url$   s@   

€r0   Úsqlitec                 C   s2   t | |d ƒ} z|  ¡  W | S  tjy   Y d S w ©N)r0   Úget_dialectr   ÚNoSuchModuleError)r   r&   Ú	query_strr.   r.   r/   r   U   s   
ýÿr   c                 C   s   t | d |ƒS r2   )r0   )r   r'   r.   r.   r/   Ú_sqlite_follower_url_from_maina   ó   r6   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)Úexecute)Údbapi_connectionÚconnection_record©Úattach_pathr.   r/   r9   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 )z¼most 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)Ú
sqlalchemyr8   r&   Úlistens_for)r   rD   Úfollower_identr8   r9   rE   r.   r=   r/   Ú_sqlite_post_configure_enginef   s   

rI   c                 C   s   d S r2   r.   ©ÚcfgÚengr'   r.   r.   r/   Ú_sqlite_create_db�   s   rM   c                 C   s   t |jj|j|ƒ d S r2   )Ú_drop_dbs_w_identr   r   r&   rJ   r.   r.   r/   Ú_sqlite_drop_db•   s   rO   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)r@   ÚlistdirrA   r"   r	   ÚinforC   )Údatabasenamer&   r'   rA   ÚfnameÚextr.   r.   r/   rN   š   s   
€ürN   c                 C   s   |  ¡  d S r2   )rE   )Úconfigr   Úclsr.   r.   r/   r   ¢   r7   r   c                 C   s
   ddgiS )NÚprefixesÚ	TEMPORARYr.   )rK   rL   r.   r.   r/   Ú_sqlite_temp_table_keyword_args§   s   
rZ   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	   rR   Újoinr   r   r#   rN   r   )r   Ú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_   )Úsqlalchemy.dialects.sqliter`   Úon_conflict_do_updateÚexcludedÚon_conflict_do_nothingÚ	returning)rK   Útablerf   r^   r_   r`   Ústmtr.   r.   r/   Ú_upsert¶   s   ÿÿri   )r@   r!   Ú r   rD   r   r   Útesting.provisionr   r   r   r   r	   r
   r   r   r   r   r#   r0   Úfor_dbr6   rI   rM   rO   rN   rZ   r]   ri   r.   r.   r.   r/   Ú<module>   sH   	1


)




	ÿ