o
    hc                     @  s^  U d dl mZ 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 er
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*m0Z0 d d)l1m2Z2 d d*l3m4Z4 dd+lm5Z5 dd,l6m7Z7 dd-l8m9Z9 dd.l8m:Z: G d/d0 d0e;Z<i Z=d1e>d2< ed3g d4Z?G d5d6 d6e<d7Z@dAd?d@ZAdS )B    )annotations)
namedtupleN)Any)Callable)Dict)Iterable)List)Mapping)Optional)Sequence)Set)Tuple)Type)TYPE_CHECKING)Union)castschema)text   )base   )util)sqla_compat)Literal)TextIO)
Connection)Dialect)CursorResult)	Inspector)ClauseElement)
Executable)ColumnElement)quoted_name)Column)
Constraint)ForeignKeyConstraint)Index)Table)UniqueConstraint)TableClause)
TypeEngine)_ServerDefault)AutogenContext)ApplyBatchImpl)BatchOperationsImplc                   @  s   e Zd Zd
ddZd	S )ImplMeta	classnamestrbasesTuple[Type[DefaultImpl]]dict_Dict[str, Any]c                 C  s(   t | |||}d|v r| t|d < |S )N__dialect__)type__init___impls)clsr1   r3   r5   newtype r=   S/var/www/html/aiguide_backend/venv/lib/python3.10/site-packages/alembic/ddl/impl.pyr9   7   s   zImplMeta.__init__N)r1   r2   r3   r4   r5   r6   )__name__
__module____qualname__r9   r=   r=   r=   r>   r0   6   s    r0   zDict[str, Type[DefaultImpl]]r:   Params)token0tokensargskwargsc                   @  s(  e Zd ZU dZdZdZdZddhfZded< d	Z	d
ed< dZ
ded< dddZedd d!Zdd$d%Zdd(d)Zdd.d/Zedd0d1Zd2d	e fdd;d<Z	2ddd>d?Z	2		2	2	2	2		2	2	2	2	2dddUdVZ	2dddZd[Z	2ddd\d]Zdd_d`ZddbdcZ	2dddgdhZddidjZddkdlZddodpZddqdrZ ddsdtZ!ddvdwZ"ddxdyZ#	zddddZ$dddZ%dddZ&dddZ'dddZ(dd Z)dddZ*dd Z+	ddddZ,dddZ-dddZ.dd Z/dddZ0dddZ1dddZ2dddZ3dd Z4dddZ5dddZ6ddĄ Z7dddȄZ8d2S )DefaultImpla  Provide the entrypoint for major migration operations,
    including database-specific behavioral variances.

    While individual SQL/DDL constructs already provide
    for database-specific implementations, variances here
    allow for entirely different sequences of operations
    to take place for a particular migration, such as
    SQL Server's special 'IDENTITY INSERT' step for
    bulk inserts.

    defaultF;NUMERICDECIMALzTuple[Set[str], ...]type_synonymsr=   zSequence[str]type_arg_extract)orderon_nullzTuple[str, ...]identity_attrs_ignoredialectr   
connectionOptional[Connection]as_sqlbooltransactional_ddlOptional[bool]output_bufferOptional[TextIO]context_optsr6   returnNonec                 C  s^   || _ || _|| _|dd| _|| _i | _|| _|d ur || _| jr+| js-t	
dd S d S )Nliteral_bindsFz3Can't use literal_binds setting without as_sql mode)rQ   rR   rT   getr]   rX   memorZ   rV   r   CommandError)selfrQ   rR   rT   rV   rX   rZ   r=   r=   r>   r9   b   s    	zDefaultImpl.__init__Type[DefaultImpl]c                 C  s
   t |j S N)r:   name)r;   rQ   r=   r=   r>   get_by_dialect|   s   
zDefaultImpl.get_by_dialectr   r2   c                 C  s,   | j d usJ | j |d  | j   d S )Nz

)rX   writeflush)ra   r   r=   r=   r>   static_output   s   zDefaultImpl.static_outputbatch_opr/   c                 C     dS )zReturn True if the given :class:`.BatchOperationsImpl`
        would need the table to be recreated and copied in order to
        proceed.

        Normally, only returns True on SQLite when operations other
        than add_column are present.

        Fr=   )ra   ri   r=   r=   r>   requires_recreate_in_batch   s   z&DefaultImpl.requires_recreate_in_batch
batch_implr.   tabler(   c                 C  rj   )zperform any operations needed on a table before a new
        one is created to replace it in batch mode.

        the PG dialect uses this to drop constraints on the table
        before the new one uses those same names.

        Nr=   )ra   rl   rm   r=   r=   r>   prep_table_for_batch       z DefaultImpl.prep_table_for_batchc                 C     | j S rc   )rR   ra   r=   r=   r>   bind   s   zDefaultImpl.bindN	constructUnion[Executable, str]execution_optionsOptional[dict[str, Any]]multiparamsSequence[dict]paramsOptional[CursorResult]c                 C  s   t |tr	t|}| jrM|s|rtd| jr%t |tjs%tddid}ni }t	r0t |t
s0J |jdd| ji|}| t|dd | j  d S | j}|d usVJ |r`|jdi |}|rnt |tsiJ ||f7 }|||S )	Nz+Execution arguments not allowed with as_sqlr]   T)compile_kwargsrQ   	z    r=   )
isinstancer2   r   rT   	Exceptionr]   r   
DDLElementdictr   r    compilerQ   rh   replacestripcommand_terminatorrR   ru   tupleexecute)ra   rs   ru   rw   ry   
compile_kwcompiledconnr=   r=   r>   _exec   s6   

zDefaultImpl._execsqlc                 C  s   |  || d S rc   )r   )ra   r   ru   r=   r=   r>   r      s   zDefaultImpl.execute
table_namecolumn_namenullableserver_default%Union[_ServerDefault, Literal[False]]rd   Optional[str]type_Optional[TypeEngine]r   autoincrementcomment$Optional[Union[str, Literal[False]]]existing_commentexisting_typeexisting_server_defaultOptional[_ServerDefault]existing_nullableexisting_autoincrementkwr   c                 K  s,  |d us|d urt jddd |d ur#| tj||||||||
d |durWi }t||r3tj}nt||rAtj	}| |d< ntj
}| ||||f|||||
d| |d urk| tj||||||||
d |	dur| tj|||	|||||
d |d ur| tj|||||||d d S d S )NzBautoincrement and existing_autoincrement only make sense for MySQL   )
stacklevel)r   r   r   r   r   Fimpl)r   r   r   r   )r   warnr   r   ColumnNullabler   _server_default_is_computedComputedColumnDefault_server_default_is_identityIdentityColumnDefaultColumnDefault
ColumnTypeColumnComment
ColumnName)ra   r   r   r   r   rd   r   r   r   r   r   r   r   r   r   r   cls_r=   r=   r>   alter_column   s   
	zDefaultImpl.alter_columncolumnColumn[Any]!Optional[Union[str, quoted_name]]c                 C     |  tj|||d d S Nr   )r   r   	AddColumn)ra   r   r   r   r=   r=   r>   
add_columnA  s   zDefaultImpl.add_columnc                 K  r   r   )r   r   
DropColumn)ra   r   r   r   r   r=   r=   r>   drop_columnI  s   zDefaultImpl.drop_columnconstc                 C  s,   |j d u s
| | r| t| d S d S rc   )_create_ruler   r   AddConstraintra   r   r=   r=   r>   add_constraintR  s   zDefaultImpl.add_constraintr%   c                 C     |  t| d S rc   )r   r   DropConstraintr   r=   r=   r>   drop_constraintV     zDefaultImpl.drop_constraintold_table_namenew_table_nameUnion[str, quoted_name]c                 C  r   r   )r   r   RenameTable)ra   r   r   r   r=   r=   r>   rename_tableY  s   zDefaultImpl.rename_tablec                 C  s   |j j|| jd| d | t| |j j|| jd| d |jD ]
}| t| q!| j	j
o4| j	j }|j}|rA|rA| | |jD ]}|j}|rR|rR| | qDd S NF)
checkfirst_ddl_runner)dispatchbefore_createrR   r   r   CreateTableafter_createindexesCreateIndexrQ   supports_commentsinline_commentsr   create_table_commentcolumnscreate_column_comment)ra   rm   indexwith_commentr   r   r=   r=   r>   create_tablec  s(   





zDefaultImpl.create_tablec                 C  s@   |j j|| jd| d | t| |j j|| jd| d d S r   )r   before_droprR   r   r   	DropTable
after_dropra   rm   r=   r=   r>   
drop_tablez  s   


zDefaultImpl.drop_tabler   r'   c                 K     |  tj|fi | d S rc   )r   r   r   ra   r   r   r=   r=   r>   create_index     zDefaultImpl.create_indexc                 C  r   rc   )r   r   SetTableCommentr   r=   r=   r>   r     r   z DefaultImpl.create_table_commentc                 C  r   rc   )r   r   DropTableCommentr   r=   r=   r>   drop_table_comment  r   zDefaultImpl.drop_table_commentColumnElement[Any]c                 C  r   rc   )r   r   SetColumnComment)ra   r   r=   r=   r>   r     r   z!DefaultImpl.create_column_commentc                 K  r   rc   )r   r   	DropIndexr   r=   r=   r>   
drop_index  r   zDefaultImpl.drop_indexTUnion[TableClause, Table]rows
List[dict]multiinsertc              	     s   t |ts	td|rt |d tstd| jr7|D ]}| t jdi  fdd|	 D  qd S |rZ|rG| jt |d d S |D ]}| t jdi | qId S d S )NzList expectedr   zList of dictionaries expectedc                   s:   i | ]\}}|t |tjstj|| j| jd n|qS ))r   )r}   r   _literal_bindparamcr8   ).0kvrm   r=   r>   
<dictcomp>  s    z+DefaultImpl.bulk_insert.<locals>.<dictcomp>)rw   r=   )
r}   list	TypeErrorr   rT   r   r   _insert_inlinevaluesitems)ra   rm   r   r   rowr=   r   r>   bulk_insert  s2   



zDefaultImpl.bulk_insertr$   rB   c                 C  s   | j j|j }td|}g }d }|D ]}td|r!|}q|| qt	|d |dd  g i }|r\td|D ]}d|v rS|
d\}	}
|
 |j|	 < q<|j|  q<|S )Nz[\w\-_]+|\(.+?\)z^\(.*\)$r   r   z[^(),]+=)rQ   type_compilerprocessr8   lowerrefindallmatchappendrB   splitr   rF   rE   )ra   r   
definitionrD   term_tokens
paren_termtokenry   termkeyvalr=   r=   r>   _tokenize_column_type  s    z!DefaultImpl._tokenize_column_typeinspector_paramsmetadata_paramsc                 C  s|   |j |j krdS dd | jD }d|j g|j }d|j g|j }|D ]}||h|s8|j |j h|r; dS q&dS )NTc                 S  s   g | ]	}d d |D qS )c                 S  s   h | ]}|  qS r=   )r   )r   tr=   r=   r>   	<setcomp>      z=DefaultImpl._column_types_match.<locals>.<listcomp>.<setcomp>r=   )r   batchr=   r=   r>   
<listcomp>  s    z3DefaultImpl._column_types_match.<locals>.<listcomp> F)rC   rL   joinrD   issubset)ra   r  r	  synonymsinspector_all_termsmetadata_all_termsr  r=   r=   r>   _column_types_match  s&   zDefaultImpl._column_types_matchinspected_paramsmeta_paramsc                 C  s   t |jt |jkr|j|jkrdS t |jt |jkr$|j|jkr$dS d|j }d|j }| jD ]}t||}t||}|rV|rV|d|dkrV dS q7dS )a  We want to compare column parameters. However, we only want
        to compare parameters that are set. If they both have `collation`,
        we want to make sure they are the same. However, if only one
        specifies it, dont flag it for being less specific
        Fr  r   T)	lenrD   rE   r  r   rM   r   searchgroup)ra   r  r  inspmetaregmimmr=   r=   r>   _column_args_match  s   

zDefaultImpl._column_args_matchinspector_columnmetadata_columnc                 C  s8   |  |}|  |}| ||sdS | ||sdS dS )zReturns True if there ARE differences between the types of the two
        columns. Takes impl.type_synonyms into account between retrospected
        and metadata types
        TF)r  r  r   )ra   r!  r"  r  r	  r=   r=   r>   compare_type  s   

zDefaultImpl.compare_typec                 C  s   ||kS rc   r=   )ra   r!  r"  rendered_metadata_defaultrendered_inspector_defaultr=   r=   r>   compare_server_default%  s   z"DefaultImpl.compare_server_defaultconn_uniquesSet[UniqueConstraint]conn_indexes
Set[Index]metadata_unique_constraintsmetadata_indexesc                 C     d S rc   r=   )ra   r'  r)  r+  r,  r=   r=   r>   correct_for_autogen_constraints.  s   z+DefaultImpl.correct_for_autogen_constraintsc                 C  s(   |j j|jurt|d ||d< d S d S )Nexpr)r8   _type_affinityr   )ra   existingexisting_transfernew_typer=   r=   r>   cast_for_batch_migrate7  s
   z"DefaultImpl.cast_for_batch_migrater/  r    is_server_defaultc                 K  s   ddd}t |j| j|dS )zdRender a SQL expression that is typically a server default,
        index expression, etc.

        TF)r]   include_table)rQ   r{   )r2   r   rQ   )ra   r/  r5  r   r   r=   r=   r>   render_ddl_sql_expr=  s   
zDefaultImpl.render_ddl_sql_expr	inspectorr   r   c                 C  rp   rc   )autogen_column_reflect)ra   r8  r=   r=   r>   _compat_autogen_column_reflectK  s   z*DefaultImpl._compat_autogen_column_reflectconn_fksSet[ForeignKeyConstraint]metadata_fksc                 C  r-  rc   r=   )ra   r;  r=  r=   r=   r>   correct_for_autogen_foreignkeysN  s   z+DefaultImpl.correct_for_autogen_foreignkeysc                 C  rj   )zA hook that is attached to the 'column_reflect' event for when
        a Table is reflected from the database during the autogenerate
        process.

        Dialects can elect to modify the information gathered here.

        Nr=   )ra   r8  rm   column_infor=   r=   r>   r9  U  ro   z"DefaultImpl.autogen_column_reflectc                 C  rj   )zA hook called when :meth:`.EnvironmentContext.run_migrations`
        is called.

        Implementations can set up per-migration-run state here.

        Nr=   rq   r=   r=   r>   start_migrations^  ro   zDefaultImpl.start_migrationsc                 C     |  d| j  dS )zEmit the string ``BEGIN``, or the backend-specific
        equivalent, on the current connection context.

        This is used in offline mode and typically
        via :meth:`.EnvironmentContext.begin_transaction`.

        BEGINNrh   r   rq   r=   r=   r>   
emit_beginf     zDefaultImpl.emit_beginc                 C  rA  )zEmit the string ``COMMIT``, or the backend-specific
        equivalent, on the current connection context.

        This is used in offline mode and typically
        via :meth:`.EnvironmentContext.begin_transaction`.

        COMMITNrC  rq   r=   r=   r>   emit_commitp  rE  zDefaultImpl.emit_committype_objr+   autogen_contextr-   Union[str, Literal[False]]c                 C  rj   )NFr=   )ra   rH  rI  r=   r=   r>   render_typez  s   zDefaultImpl.render_typec                 C  sv   t ||t dhd\}}t|dd }t|dd }t|t|kr&|d || j ||t|p9t|t|kfS )Nalways)skip)_compare_identity_optionsr   IdentitygetattrrU   adddifference_updaterP   )ra   metadata_identityinspector_identitydiffignoredmeta_alwaysinspector_alwaysr=   r=   r>   _compare_identity_default  s   

z%DefaultImpl._compare_identity_defaultTuple[Any, ...]c                 C  s   t dd |jD S )Nc                 s  s    | ]}|j V  qd S rc   rd   r   colr=   r=   r>   	<genexpr>  s    z/DefaultImpl.create_index_sig.<locals>.<genexpr>)r   r   )ra   r   r=   r=   r>   create_index_sig  s   zDefaultImpl.create_index_sigr)   c                 C  s   t tdd |jD S )Nc                 S  s   g | ]}|j qS r=   r[  r\  r=   r=   r>   r    s    z<DefaultImpl.create_unique_constraint_sig.<locals>.<listcomp>)r   sortedr   r   r=   r=   r>   create_unique_constraint_sig  s   z(DefaultImpl.create_unique_constraint_sigc              
   C  sh   dd |D }t |D ]&}|j|v rqt|}|r1td|jd| jdtj d || qd S )Nc                 S  s   i | ]}|j |qS r=   r[  )r   r   r=   r=   r>   r     r  z8DefaultImpl._skip_functional_indexes.<locals>.<dictcomp>z@autogenerate skipping metadata-specified expression-based index z
; dialect z under SQLAlchemy z6 can't reflect these indexes so they can't be compared)	r   rd   r   is_expression_indexr   r   r7   sqlalchemy_versiondiscard)ra   r,  r)  conn_indexes_by_nameidxiexr=   r=   r>   _skip_functional_indexes  s$   


z$DefaultImpl._skip_functional_indexesreflected_objectkindc                 C  s   | di S )Ndialect_options)r^   )ra   ri  rj  r=   r=   r>    adjust_reflected_dialect_options  s   z,DefaultImpl.adjust_reflected_dialect_options)rQ   r   rR   rS   rT   rU   rV   rW   rX   rY   rZ   r6   r[   r\   )rQ   r   r[   rb   )r   r2   r[   r\   )ri   r/   r[   rU   )rl   r.   rm   r(   r[   r\   )r[   rS   )
rs   rt   ru   rv   rw   rx   ry   r6   r[   rz   rc   )r   rt   ru   rv   r[   r\   )NFNNNNFNNNNN) r   r2   r   r2   r   rW   r   r   rd   r   r   r   r   r   r   rW   r   r   r   r   r   r   r   r   r   rW   r   rW   r   r   r[   r\   )r   r2   r   r   r   r   r[   r\   )r   r2   r   r   r   r   r[   r\   )r   r   r[   r\   )r   r%   r[   r\   )r   r2   r   r   r   r   r[   r\   )rm   r(   r[   r\   )r   r'   r   r   r[   r\   )r   r   r[   r\   )T)rm   r   r   r   r   rU   r[   r\   )r   r$   r[   rB   )r  rB   r	  rB   r[   rU   )r  rB   r  rB   r[   rU   )r!  r   r"  r$   r[   rU   )
r'  r(  r)  r*  r+  r(  r,  r*  r[   r\   )F)r/  r    r5  rU   r   r   r[   r2   )r8  r   r[   r   )r;  r<  r=  r<  r[   r\   )r[   r\   )rH  r+   rI  r-   r[   rJ  )r   r'   r[   rZ  )r   r)   r[   rZ  )ri  r6   rj  r2   r[   r6   )9r?   r@   rA   __doc__r7   rV   r   rL   __annotations__rM   rP   r9   classmethodre   rh   rk   rn   propertyrr   r   immutabledictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r#  r&  r.  r4  r7  r:  r>  r9  r@  rD  rG  rK  rY  r_  ra  rh  rl  r=   r=   r=   r>   rG   H   s   
 



,t
	




	




&
&

!
		


	






rG   )	metaclassmetadata_io-Union[schema.Identity, schema.Sequence, None]inspector_io
default_io'Union[schema.Identity, schema.Sequence]rM  Set[str]c                   s   t | }t |}t  t d
 fdd}|||t |t|| t jr?|t| d	i t|d	i |jt|d	i   fS )N	meta_dictMapping[str, Any]	insp_dictdefault_dictattrsIterable[str]c                   s\   t |D ]$}| |}||}||kr+||}||kr&| q | qd S rc   )set
differencer^   rQ  )ry  r{  r|  r}  attr
meta_value
insp_valuedefault_valuerU  ignored_attrrM  r=   r>   check_dicts  s   



z._compare_identity_options.<locals>.check_dictsdialect_kwargs)ry  rz  r{  rz  r|  rz  r}  r~  )r   _get_identity_options_dictr  unionidentity_has_dialect_kwargsrP  r  )rs  ru  rv  rM  meta_dinsp_dr  r=   r  r>   rN    s&   
	



rN  )rs  rt  ru  rt  rv  rw  rM  rx  )B
__future__r   collectionsr   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   
sqlalchemyr   r   r    r   r   r   r   r   sqlalchemy.enginer   r   sqlalchemy.engine.cursorr   sqlalchemy.engine.reflectionr   sqlalchemy.sqlr    r!   sqlalchemy.sql.elementsr"   r#   sqlalchemy.sql.schemar$   r%   r&   r'   r(   r)   sqlalchemy.sql.selectabler*   sqlalchemy.sql.type_apir+   r,   autogenerate.apir-   operations.batchr.   r/   r8   r0   r:   rn  rB   rG   rN  r=   r=   r=   r>   <module>   sl        x