o
    h#A                     @  sL  d dl m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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rd 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* G d d! d!eZ+G d"d# d#e+Z,G d$d% d%eZ-G d&d' d'eZ.G d(d) d)e.Z/eed*d+eed*d+eed*d+eed*d+d,d- Z0ee-d*d+dGd3d4Z1ee/d*d+dHd5d6Z2ee.d*d+dId7d8Z3dJdBdCZ4ee	j%d*d+dKdEdFZ5dS )L    )annotationsN)Any)Optional)TYPE_CHECKING)Unionschema)types)compiles   )alter_table)AlterColumn)ColumnDefault)
ColumnName)ColumnNullable)
ColumnType)format_column_name)format_server_default)DefaultImpl   )util)compare)sqla_compat)_is_mariadb)_is_type_bound)Literal)MySQLDDLCompiler)DropConstraint)
Constraint)
TypeEngine)_ServerDefaultc                      s   e Zd ZdZdZejddhddhf ZddgZ																						d2d3 fd#d$Zd4 fd'd(Z	d5d*d+Z
d,d- Zd.d/ Zd0d1 Z  ZS )6	MySQLImplmysqlFBOOLTINYINTJSONLONGTEXTzcharacter set ([\w\-_]+)zcollate ([\w\-_]+)N
table_namestrcolumn_namenullableOptional[bool]server_default%Union[_ServerDefault, Literal[False]]nameOptional[str]type_Optional[TypeEngine]r   existing_typeexisting_server_defaultOptional[_ServerDefault]existing_nullableautoincrementexisting_autoincrementcomment$Optional[Union[str, Literal[False]]]existing_commentkwr   returnNonec                   s  t ||	st ||	rt j||f|||||
||	d| |d us/| |d ur+|n||rk| t||||d ur;|n||d urB|n|
d urH|
nd|d urO|n||durV|n|	|d ur]|n||durd|n|d	 d S |d us{|d us{|d us{|dur| t||||d ur|n||d ur|n|
d ur|
nd|d ur|n||dur|n|	|d ur|n||dur|n|d	 d S |dur| t	||||d d S d S )N)r*   r0   r   r2   r5   r,   r3   TF)r   newnamer*   r0   defaultr6   r8   r   )
r   _server_default_is_identity_server_default_is_computedsuperalter_column$_is_mysql_allowed_functional_default_execMySQLChangeColumnMySQLModifyColumnMySQLAlterDefault)selfr'   r)   r*   r,   r.   r0   r   r2   r3   r5   r6   r7   r8   r:   r;   	__class__ T/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/alembic/ddl/mysql.pyrC   1   s   
zMySQLImpl.alter_columnconstr   c                   s(   t |tjrt|rd S t | d S N)
isinstancer   CheckConstraintr   rB   drop_constraint)rI   rN   rJ   rL   rM   rR      s   zMySQLImpl.drop_constraintboolc                 C  s   |d uo|j tju o|d uS rO   )_type_affinitysqltypesDateTime)rI   r0   r,   rL   rL   rM   rD      s   z.MySQLImpl._is_mysql_allowed_functional_defaultc                 C  s  |j jtju r|jr|js|s|dkrdS |r/|j jtju r/|d ur)tdd|nd }||kS |rG|j jtju rGtdd|}|d| dkS |r|rt	d|
 }t	d|
 }|rw|sadS |d|dkrmdS |d	}|d	}td
d|
 td
d|
 kS ||kS )Nz'0'Fz^'|'$ 'z(.*) (on update.*?)(?:\(\))?$Tr   r   z(.*?)(?:\(\))?$z\1)typerT   rU   Integerprimary_keyr6   resubStringmatchlowergroup)rI   inspector_columnmetadata_columnrendered_metadata_defaultrendered_inspector_defaultmetadata_defaultonupdate_insonupdate_metrL   rL   rM   compare_server_default   s\   



z MySQLImpl.compare_server_defaultc           	      C  s   t  }t|D ]?}|jrq|jD ]5}|j|jkr%|| ||j  n!|jD ]}|j|jkr=|| ||j  nq(|j|v rE nqqt|D ]}|j|v rW|| qKd S rO   )setlistuniquecolumnsr.   removeaddforeign_keys)	rI   conn_unique_constraintsconn_indexesmetadata_unique_constraintsmetadata_indexesremovedidxcolfkrL   rL   rM   correct_for_autogen_constraints   s0   	






z)MySQLImpl.correct_for_autogen_constraintsc                 C  s   dd |D }dd |D }t ||D ]2}|| }|| }|jd ur3|j dkr3|jd u r3d|_|jd urG|j dkrG|jd u rGd|_qd S )Nc                 S     i | ]	}t |j|qS rL   r   _fk_constraint_sigsig.0rx   rL   rL   rM   
<dictcomp>      z=MySQLImpl.correct_for_autogen_foreignkeys.<locals>.<dictcomp>c                 S  rz   rL   r{   r~   rL   rL   rM   r     r   restrictRESTRICT)rj   intersectionondeleter`   onupdate)rI   conn_fksmetadata_fksconn_fk_by_sigmetadata_fk_by_sigr}   mdfkcnfkrL   rL   rM   correct_for_autogen_foreignkeys  s&   



z)MySQLImpl.correct_for_autogen_foreignkeys)NFNNNNNNNNFN) r'   r(   r)   r(   r*   r+   r,   r-   r.   r/   r0   r1   r   r/   r2   r1   r3   r4   r5   r+   r6   r+   r7   r+   r8   r9   r:   r/   r;   r   r<   r=   )rN   r   r<   r=   )r0   r1   r,   r-   r<   rS   )__name__
__module____qualname____dialect__transactional_ddlr   type_synonymstype_arg_extractrC   rR   rD   ri   ry   r   __classcell__rL   rL   rJ   rM   r!   '   s4    c
	C%r!   c                   @  s   e Zd ZdZdS )MariaDBImplmariadbN)r   r   r   r   rL   rL   rL   rM   r   -  s    r   c                      s"   e Zd Z	dd fddZ  ZS )rH   Nr.   r(   r)   r?   r    r   r/   r<   r=   c                   s$   t t| j||d || _|| _d S )Nr   )rB   r   __init__r)   r?   )rI   r.   r)   r?   r   rJ   rL   rM   r   2  s   
zMySQLAlterDefault.__init__rO   )
r.   r(   r)   r(   r?   r    r   r/   r<   r=   r   r   r   r   r   rL   rL   rJ   rM   rH   1  s    rH   c                      s.   e Zd Z							dd fddZ  ZS )rF   NFr.   r(   r)   r   r/   r>   r0   r1   r*   r+   r?   /Optional[Union[_ServerDefault, Literal[False]]]r6   r8   r9   r<   r=   c
           
        sZ   t t| j||d || _|| _|| _|| _|| _|	| _|d u r%t	
dt|| _d S )Nr   zDAll MySQL CHANGE/MODIFY COLUMN operations require the existing type.)rB   r   r   r)   r*   r>   r?   r6   r8   r   CommandErrorrU   to_instancer0   )
rI   r.   r)   r   r>   r0   r*   r?   r6   r8   rJ   rL   rM   r   ?  s   zMySQLChangeColumn.__init__)NNNNFNF)r.   r(   r)   r(   r   r/   r>   r/   r0   r1   r*   r+   r?   r   r6   r+   r8   r9   r<   r=   r   rL   rL   rJ   rM   rF   >  s    rF   c                   @  s   e Zd ZdS )rG   N)r   r   r   rL   rL   rL   rM   rG   [  s    rG   r"   r   c                 K  s   t d)Nz9Individual alter column constructs not supported by MySQL)NotImplementedErrorelementcompilerr;   rL   rL   rM    _mysql_doesnt_support_individual_  s   r   r   r   r   r<   r(   c                 K  s@   dt || j| jt|| j| jd urdt|| j f S df S )Nz%s ALTER COLUMN %s %szSET DEFAULT %szDROP DEFAULT)r   r'   r   r   r)   r?   r   r   rL   rL   rM   _mysql_alter_defaulti  s   

r   c                 K  s<   dt || j| jt|| jt|| j| j| j| j	| j
df S )Nz%s MODIFY %s %sr*   r,   r0   r6   r8   )r   r'   r   r   r)   _mysql_colspecr*   r?   r0   r6   r8   r   rL   rL   rM   _mysql_modify_columnv  s   
r   c                 K  sF   dt || j| jt|| jt|| jt|| j| j| j	| j
| jdf S )Nz%s CHANGE %s %s %sr   )r   r'   r   r   r)   r>   r   r*   r?   r0   r6   r8   r   rL   rL   rM   _mysql_change_column  s   

r   r*   r+   r,   r   r0   r   r6   r8   r9   c                 C  sn   d| j j||rdndf }|r|d7 }|dur&|d ur&|dt| | 7 }|r5|d| j|t  7 }|S )Nz%s %sNULLzNOT NULLz AUTO_INCREMENTFz DEFAULT %sz COMMENT %s)dialecttype_compilerprocessr   sql_compilerrender_literal_valuerU   r^   )r   r*   r,   r0   r6   r8   specrL   rL   rM   r     s   

r   r   c                 K  s   | j }t|tjtjtjfr|rJ || S t|tjr@t|j	r1d|j
|j|j
|f S d|j
|j|j
|f S td)zVRedefine SQLAlchemy's drop constraint to
    raise errors for invalid constraint type.z!ALTER TABLE %s DROP CONSTRAINT %szALTER TABLE %s DROP CHECK %szFNo generic 'DROP CONSTRAINT' in MySQL - please specify constraint type)r   rP   r   ForeignKeyConstraintPrimaryKeyConstraintUniqueConstraintvisit_drop_constraintrQ   r   r   preparerformat_tabletableformat_constraintr   )r   r   r;   
constraintrL   rL   rM   _mysql_drop_constraint  s.   



r   )r   rH   r   r   r<   r(   )r   rG   r   r   r<   r(   )r   rF   r   r   r<   r(   )r   r   r*   r+   r,   r   r0   r   r6   r+   r8   r9   r<   r(   )r   r   r   r   r<   r(   )6
__future__r   r\   typingr   r   r   r   
sqlalchemyr   r	   rU   sqlalchemy.ext.compilerr
   baser   r   r   r   r   r   r   r   implr   rW   r   autogenerater   r   util.sqla_compatr   r   r   sqlalchemy.dialects.mysql.baser   sqlalchemy.sql.ddlr   sqlalchemy.sql.schemar   sqlalchemy.sql.type_apir   r    r!   r   rH   rF   rG   r   r   r   r   r   r   rL   rL   rL   rM   <module>   sf      







