U
    ÌÜui¢  ã                   @   s(  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 e
 dd¡dd„ ƒZ
e dd¡dd„ ƒZe dd¡dd„ ƒZe	 dd¡dd„ ƒZe dd¡dd„ ƒZe d¡dddœdd„ƒZe dd¡dd„ ƒZe d¡dd „ ƒZdS )!é    Né   )Úevent)Úexc)Úallow_stale_update_impl)Úconfigure_follower)Ú	create_db)Údelete_from_all_tables)Údrop_db)Úgenerate_driver_url)Útemp_table_keyword_args)ÚupsertÚmysqlÚmariadbc                 C   s˜   |   ¡ }|dkr&|  ¡ }| | ¡r&d}| jd||f d |¡}|dkrV| dg¡}n|dkrj| dg¡}z| ¡  W n tjk
rŽ   Y d S X |S d S )	Nr   r   z%s+%s)Z
drivernameZmariadbconnectorÚcharsetZmysqlconnector)Z	collationZutf8mb4_general_ci)	Zget_backend_nameÚget_dialectZ_is_mariadb_from_urlÚsetZupdate_query_stringZdifference_update_queryZupdate_query_pairsr   ZNoSuchModuleError)ÚurlZdriverZ	query_strÚbackendZdialect_clsÚnew_url© r   ú]/home/lhs5088/backend/venv/lib/python3.8/site-packages/sqlalchemy/dialects/mysql/provision.pyr
      s*    

ÿþÿr
   c              	   C   s|   |  ¡ ,}zt| ||ƒ W n tk
r.   Y nX W 5 Q R X |  ¡ 0}| d| ¡ | d| ¡ | d| ¡ W 5 Q R X d S )Nz(CREATE DATABASE %s CHARACTER SET utf8mb4z4CREATE DATABASE %s_test_schema CHARACTER SET utf8mb4z6CREATE DATABASE %s_test_schema_2 CHARACTER SET utf8mb4)ÚbeginÚ_mysql_drop_dbÚ	ExceptionÚexec_driver_sql©ÚcfgÚengÚidentÚconnr   r   r   Ú_mysql_create_db>   s    

ÿÿÿr    c                 C   s   d| | _ d| | _d S )Nz%s_test_schemaz%s_test_schema_2)Ztest_schemaZtest_schema_2)Úconfigr   r   r   r   Ú_mysql_configure_followerR   s    
r"   c              	   C   sB   |  ¡ 0}| d| ¡ | d| ¡ | d| ¡ W 5 Q R X d S )NzDROP DATABASE %s_test_schemazDROP DATABASE %s_test_schema_2zDROP DATABASE %s)r   r   r   r   r   r   r   X   s    
r   c                 C   s
   ddgiS )NÚprefixesÚ	TEMPORARYr   )r   r   r   r   r   Ú_mysql_temp_table_keyword_args`   s    r%   F)Ú
set_lambdaÚsort_by_parameter_orderc                C   s\   ddl m} ||ƒ}|r,|jf ||jƒŽ}n|jjd }| |j|i¡}|j|d|iŽ}|S )Nr   )Úinsertr'   )Zsqlalchemy.dialects.mysqlr(   Zon_duplicate_key_updateZinsertedZprimary_keyÚcÚkeyÚ	returning)r   Útabler+   r&   r'   r(   ÚstmtZpk1r   r   r   Ú_upserte   s    ÿÿr.   c              	   C   s.   |   d¡ zt | ||¡ W 5 |   d¡ X d S )NzSET foreign_key_checks = 0zSET foreign_key_checks = 1)r   r   Zcall_original)Ú
connectionr   Úmetadatar   r   r   Ú_delete_from_all_tablesy   s    
r1   c                    s   t j‡ fdd„ƒ}|ƒ S )Nc                  3   sB   t  ˆ jd¡dd„ ƒ} z
d V  W 5 t  ˆ jd| ¡ ˆ j ¡  X d S )NZengine_connectc                 S   s   |   d¡ |  ¡  d S )Nz%SET innodb_snapshot_isolation = 'OFF')r   Úrollback)r   r   r   r   Úturn_off_snapshot_isolation†   s    
zI_allow_stale_update_impl.<locals>.go.<locals>.turn_off_snapshot_isolation)r   Zlistens_forÚdbÚremoveZdispose)r3   ©r   r   r   Úgo„   s    

z$_allow_stale_update_impl.<locals>.go)Ú
contextlibÚcontextmanager)r   r7   r   r6   r   Ú_allow_stale_update_impl‚   s    r:   )r8   Ú r   r   Ztesting.provisionr   r   r   r   r	   r
   r   r   Zfor_dbr    r"   r   r%   r.   r1   r:   r   r   r   r   Ú<module>   s8   

'







 ÿ

