
    [h                         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 Z ej        d          d             Z e
j        d          d             Z ej        d          d             Z ej        d          d             Z e	j        d          d             Zd Z ej        d          d             Z ej        d          d             Z ej        d          d             Z ej        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                    t          j        |           } ||                                 }| j        }|dk    }d}|r|dk    rd|vsJ t	          j        d|          }| }|D ],}|t          v r||}|dv r||                    d          }-|sJ d| j                     | d| }|r|d| z  }|d	z  }|r|d
z  }|                     |          } |r|                     d          } |                     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+)
drivername)	sa_urlmake_urlget_driver_namer   resplit_drivernamesstripset)	r   driveridentfilename	needs_enc
name_tokentokensnew_filenametokens	            s/var/www/api.easyaligner.net/htdocs/venv_linux/lib/python3.11/site-packages/sqlalchemy/dialects/sqlite/provision.py_format_urlr1   $   sz   
 /#

C~$$&&|H-'IJ -H
**H,,,,(H-- { 	. 	.E$$>"F-''#"[[--
OOOOOOOO$//v// 	(KKK'L 	#F"Lgg|g,, 'ggvg&&
'''FF4'
5
5CJ    sqlitec                 ~    t          | |d           } 	 |                                  | S # t          j        $ r Y d S w xY wN)r1   get_dialectr   NoSuchModuleError)r   r(   	query_strs      r0   r	   r	   U   sV    
c64
(
(C 
     tts   ) <<c                 $    t          | d |          S r5   )r1   )r   r)   s     r0   _sqlite_follower_url_from_mainr:   a   s    sD%(((r2   c                     ddl m} |r| d|j         dn
|j         d|                    |d          fd            }|                    |d          fd            }d S )	Nr   )eventr   z_test_schema.dbconnectc                 :    |                      d d           d S )NzATTACH DATABASE "z" AS test_schema)execute)dbapi_connectionconnection_recordattach_paths     r0   r=   z._sqlite_post_configure_engine.<locals>.connecto   s5     	  ====	
 	
 	
 	
 	
r2   engine_disposedc                    t           j                                      rt          j                   | j        j        }|r;|dk    r7t           j                            |          rt          j        |           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*   rB   s     r0   disposez._sqlite_post_configure_engine.<locals>.dispose}   s     7>>+&& 	#Ik""":& 	 J..27>>(3K3K.Ih	  	 ....r2   )
sqlalchemyr<   r(   listens_for)r   rI   follower_identr<   r=   rJ   rB   s         @r0   _sqlite_post_configure_enginerN   f   s           8'HH&-HHH777
vy))
 
 
 
 *)
 v011        21     r2   c                     d S r5    cfgengr)   s      r0   _sqlite_create_dbrT      s    Dr2   c                 F    t          |j        j        |j        |           d S r5   )_drop_dbs_w_identr   r   r(   rQ   s      r0   _sqlite_drop_dbrW      s!    cg&
E:::::r2   c                     t          j        d          D ]U}t           j                            |          \  }}||v r-|dv r)t	          j        d|           t          j        |           Vd S )N.)r   z.db.encz!deleting SQLite database file: %s)rE   listdirrF   r$   r
   inforH   )databasenamer(   r)   rF   fnameexts         r0   rV   rV      so    
3  W]]4((
sE>>c%777H8$???IdOOO	 r2   c                 .    |                                  d S r5   )rJ   )configr   clss      r0   r   r      s    JJLLLLLr2   c                     ddgiS )Nprefixes	TEMPORARYrP   )rR   rS   s     r0   _sqlite_temp_table_keyword_argsre      s    &&r2   c                     t          j        d|            t          j        dd                    |                     t          j        |           } |D ]"}t
          D ]}t          | j        ||           #d S )Nzdb reaper connecting to %rzidentifiers in file: %sz, )r
   r[   joinr    r!   r%   rV   r   )r   identsr)   r   s       r0   _reap_sqlite_dbsri      s    H)3///H&		&(9(9:::
/#

C ? ?& 	? 	?JclJ>>>>	?? ?r2   F)
set_lambdasort_by_parameter_orderc                    ddl m}  ||          }|r%|                     ||j                            }n|                                } |j        |d|i}|S )Nr   )insert)set_rk   )sqlalchemy.dialects.sqliterm   on_conflict_do_updateexcludedon_conflict_do_nothing	returning)rR   tablers   rj   rk   rm   stmts          r0   _upsertrv      s     2111116%==D -))zz$-/H/H)II**,,4>	,C D Kr2   )rE   r#    r   rI   r   r    testing.provisionr   r   r   r	   r
   r   r   r   r   r   r%   r1   for_dbr:   rN   rT   rW   rV   re   ri   rv   rP   r2   r0   <module>rz      s   
			 				       # # # # # # * * * * * * ( ( ( ( ( ( 7 7 7 7 7 7 4 4 4 4 4 4 $ $ $ $ $ $ 6 6 6 6 6 6 - - - - - - A A A A A A 8 8 8 8 8 8 ' ' ' ' ' '  . . .b H%%  &% x(() ) )() h''&  &  ('& R (	 	 	 ; ; ;   )!(22  32  ))' ' *)' X? ? ? x)-u      r2   