o
    oo™i¢  ã                   @   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r+| dg¡}n
|dkr5| dg¡}z| ¡  W |S  tjyG   Y d S w )	Nr   r   z%s+%s)Ú
drivernameÚmariadbconnectorÚcharsetÚmysqlconnector)Ú	collationÚutf8mb4_general_ci)	Úget_backend_nameÚget_dialectÚ_is_mariadb_from_urlÚsetÚupdate_query_stringÚdifference_update_queryÚupdate_query_pairsr   ÚNoSuchModuleError)ÚurlÚdriverÚ	query_strÚbackendÚdialect_clsÚnew_url© r#   úW/home/ubuntu/.local/lib/python3.10/site-packages/sqlalchemy/dialects/mysql/provision.pyr
      s,   

ÿþÿ
ýÿr
   c              	   C   s¤   |  ¡ }zt| ||ƒ W n	 ty   Y nw W d   ƒ n1 s!w   Y  |  ¡ }| d| ¡ | d| ¡ | d| ¡ W d   ƒ d S 1 sKw   Y  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)Útest_schemaÚtest_schema_2)Úconfigr,   r#   r#   r$   Ú_mysql_configure_followerR   s   
r2   c                 C   sX   |  ¡ }| d| ¡ | d| ¡ | d| ¡ W d   ƒ d S 1 s%w   Y  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   
r5   F)Ú
set_lambdaÚsort_by_parameter_orderc                C   s`   ddl m} ||ƒ}|r|jdi ||jƒ¤Ž}n|jjd }| |j|i¡}|j|d|iŽ}|S )Nr   )Úinsertr7   r#   )Úsqlalchemy.dialects.mysqlr8   Úon_duplicate_key_updateÚinsertedÚprimary_keyÚcÚkeyÚ	returning)r*   Útabler?   r6   r7   r8   ÚstmtÚpk1r#   r#   r$   Ú_upserte   s   ÿÿrC   c              	   C   s6   |   d¡ zt | ||¡ W |   d¡ d S |   d¡ w )NzSET foreign_key_checks = 0zSET foreign_key_checks = 1)r(   r   Úcall_original)Ú
connectionr*   Úmetadatar#   r#   r$   Ú_delete_from_all_tablesy   s   
rG   c                    s   t j‡ fdd„ƒ}|ƒ S )Nc                  3   s\    t  ˆ jd¡dd„ ƒ} zd V  W t  ˆ jd| ¡ ˆ j ¡  d S t  ˆ jd| ¡ ˆ j ¡  w )NÚ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   Úlistens_forÚdbÚremoveÚdispose)rJ   ©r*   r#   r$   Úgo„   s   €
ýz$_allow_stale_update_impl.<locals>.go)Ú
contextlibÚcontextmanager)r*   rP   r#   rO   r$   Ú_allow_stale_update_impl‚   s   rS   )rQ   Ú r   r   Útesting.provisionr   r   r   r   r	   r
   r   r   Úfor_dbr.   r2   r&   r5   rC   rG   rS   r#   r#   r#   r$   Ú<module>   s8   


'






ÿ

