o
    @ju                     @  s  U d dl mZ 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 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r2d 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*l/m1Z1 d d+l2m3Z3 d d,l2m4Z4 d d-l2m5Z5 d d.l2m6Z6 d d/l7m8Z8 d d0l9m:Z: dd1lm;Z; dd2l<m=Z= dd3l>m?Z? dd4l>m@Z@ eAeBZCG d5d6 d6eDZEi ZFd7eGd8< G d9d: d:eEd;ZHG d<d= d=eZIdGdEdFZJdS )H    )annotationsN)Any)Callable)Dict)Iterable)List)Mapping)
NamedTuple)Optional)Sequence)Set)Tuple)Type)TYPE_CHECKING)Union)cast)Column)MetaData)PrimaryKeyConstraintschema)String)Table)text   )_autogen)base)_constraint_sig)ComparisonResult   )util)sqla_compat)Literal)TextIO)
Connection)Dialect)CursorResult)	Inspector)ClauseElement)
Executable)ColumnElement)quoted_name)
Constraint)ForeignKeyConstraint)Index)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)clsr7   r9   r;   newtype rC   _/var/www/www-root/data/www/ai-bot.pdev.uz/venv/lib/python3.10/site-packages/alembic/ddl/impl.pyr?   C   s   zImplMeta.__init__N)r7   r8   r9   r:   r;   r<   )__name__
__module____qualname__r?   rC   rC   rC   rD   r6   B   s    r6   zDict[str, Type[DefaultImpl]]r@   c                   @  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dd1d2Zdd6d7Zedd8d9Zd:d:e fddDdEZ	:dddHdIZ	:		:	:	:	:		:	:	:	:	:ddd\d]Z	:dddadbZ	:dddcddZddfdgZddidjZ	:dddndoZddpdqZddrdsZddvdwZ ddxdyZ!ddzd{Z"dd}d~Z#dddZ$	ddddZ%dddZ&dddZ'dddZ(dddZ)dd Z*dddZ+dd Z,	ddddZ-dddZ.dddZ/dd Z0dddZ1dddZ2dddZ3dddZ4ddÄ Z5d ddǄZ6ddd̈́Z7dddτZ8ddd҄Z9dddׄZ:ddل Z;ddd݄Z<d:S (  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_synonymsrC   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_optsr<   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)rR   rS   rU   getr^   rY   memor[   rW   r    CommandError)selfrR   rS   rU   rW   rY   r[   rC   rC   rD   r?   k   s    	zDefaultImpl.__init__Type[DefaultImpl]c                 C  s
   t |j S N)r@   name)rA   rR   rC   rC   rD   get_by_dialect   s   
zDefaultImpl.get_by_dialectr   r8   c                 C  s,   | j d usJ | j |d  | j   d S )Nz

)rY   writeflush)rb   r   rC   rC   rD   static_output   s   zDefaultImpl.static_outputversion_tableversion_table_schemaOptional[str]version_table_pkkwr   r   c                K  s@   t |t tdtddd|d}|r|td| dd |S )a  Generate a :class:`.Table` object which will be used as the
        structure for the Alembic version table.

        Third party dialects may override this hook to provide an alternate
        structure for this :class:`.Table`; requirements are only that it
        be named based on the ``version_table`` parameter and contains
        at least a single string-holding column named ``version_num``.

        .. versionadded:: 1.14

        version_num    F)nullabler   _pkcre   )r   r   r   r   append_constraintr   )rb   rj   rk   rm   rn   vtrC   rC   rD   version_table_impl   s   
zDefaultImpl.version_table_implbatch_opr5   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.

        FrC   )rb   rw   rC   rC   rD   requires_recreate_in_batch   s   z&DefaultImpl.requires_recreate_in_batch
batch_implr4   tablec                 C  rx   )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.

        NrC   )rb   rz   r{   rC   rC   rD   prep_table_for_batch       z DefaultImpl.prep_table_for_batchc                 C     | j S rd   )rS   rb   rC   rC   rD   bind   s   zDefaultImpl.bindN	constructUnion[Executable, str]execution_optionsOptional[Mapping[str, Any]]multiparams%Optional[Sequence[Mapping[str, Any]]]paramsMapping[str, Any]Optional[CursorResult]c                 C  s   t |tr	t|}| jrO|d us|rtd| jr't |tjs'tddid}ni }t	r2t |t
s2J |jd	d| ji|}| t|dd | j  d S | j}|d usXJ |rb|jd	i |}|rl|d urltd|rt|||S |||S )
Nz&SQL parameters not allowed with as_sqlr^   T)compile_kwargsrR   	z    z2Can't send params and multiparams at the same timerC   )
isinstancer8   r   rU   	TypeErrorr^   r   
DDLElementdictr   r(   compilerR   ri   replacestripcommand_terminatorrS   r   execute)rb   r   r   r   r   
compile_kwcompiledconnrC   rC   rD   _exec   s<   
zDefaultImpl._execsqlOptional[dict[str, Any]]c                 C  s   |  || d S rd   )r   )rb   r   r   rC   rC   rD   r      s   zDefaultImpl.execute
table_namecolumn_namerq   server_default%Union[_ServerDefault, Literal[False]]re   type_Optional[TypeEngine]r   autoincrementcomment$Optional[Union[str, Literal[False]]]existing_commentexisting_typeexisting_server_defaultOptional[_ServerDefault]existing_nullableexisting_autoincrementc                 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)rb   r   r   rq   r   re   r   r   r   r   r   r   r   r   r   rn   cls_rC   rC   rD   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)rb   r   r   r   rC   rC   rD   
add_columnp  s   zDefaultImpl.add_columnc                 K  r   r   )r   r   
DropColumn)rb   r   r   r   rn   rC   rC   rD   drop_columnx  s   zDefaultImpl.drop_columnconstc                 C  s,   |j d u s
| | r| t| d S d S rd   )_create_ruler   r   AddConstraintrb   r   rC   rC   rD   add_constraint  s   zDefaultImpl.add_constraintr,   c                 C     |  t| d S rd   )r   r   DropConstraintr   rC   rC   rD   drop_constraint     zDefaultImpl.drop_constraintold_table_namenew_table_nameUnion[str, quoted_name]c                 C  r   r   )r   r   RenameTable)rb   r   r   r   rC   rC   rD   rename_table  s   zDefaultImpl.rename_tablec                 K  s   |j j|| jd| d | tj|fi | |j j|| jd| d |jD ]
}| t| q%| j	j
o8| j	j }|j}|rE|rE| | |jD ]}|j}|rV|rV| | qHd S NF)
checkfirst_ddl_runner)dispatchbefore_createrS   r   r   CreateTableafter_createindexesCreateIndexrR   supports_commentsinline_commentsr   create_table_commentcolumnscreate_column_comment)rb   r{   rn   indexwith_commentr   r   rC   rC   rD   create_table  s(   





zDefaultImpl.create_tablec                 K  sH   |j j|| jd| d | tj|fi | |j j|| jd| d d S r   )r   before_droprS   r   r   	DropTable
after_drop)rb   r{   rn   rC   rC   rD   
drop_table  s   


zDefaultImpl.drop_tabler   r.   c                 K     |  tj|fi | d S rd   )r   r   r   rb   r   rn   rC   rC   rD   create_index     zDefaultImpl.create_indexc                 C  r   rd   )r   r   SetTableCommentrb   r{   rC   rC   rD   r     r   z DefaultImpl.create_table_commentc                 C  r   rd   )r   r   DropTableCommentr   rC   rC   rD   drop_table_comment  r   zDefaultImpl.drop_table_commentColumnElement[Any]c                 C  r   rd   )r   r   SetColumnComment)rb   r   rC   rC   rD   r     r   z!DefaultImpl.create_column_commentc                 K  r   rd   )r   r   	DropIndexr   rC   rC   rD   
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cr>   ).0kvr{   rC   rD   
<dictcomp>  s    
z+DefaultImpl.bulk_insert.<locals>.<dictcomp>)r   rC   )
r   listr   r   rU   r   r!   _insert_inlinevaluesitems)rb   r{   r   r   rowrC   r   rD   bulk_insert  s2   




zDefaultImpl.bulk_insertr   Paramsc                 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[^(),]+=)rR   type_compilerprocessr>   lowerrefindallmatchappendr  splitr   kwargsargs)rb   r   
definitiontokensterm_tokens
paren_termtokenr   termkeyvalrC   rC   rD   _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 rC   )r  )r   trC   rC   rD   	<setcomp>      z=DefaultImpl._column_types_match.<locals>.<listcomp>.<setcomp>rC   )r   batchrC   rC   rD   
<listcomp>  s    z3DefaultImpl._column_types_match.<locals>.<listcomp> F)token0rM   joinr  issubset)rb   r  r  synonymsinspector_all_termsmetadata_all_termsr  rC   rC   rD   _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)	lenr  r  r   r  rN   r  searchgroup)rb   r&  r'  inspmetaregmimmrC   rC   rD   _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%  r0  )rb   r1  r2  r  r  rC   rC   rD   compare_typeH  s   

zDefaultImpl.compare_typec                 C  s   ||kS rd   rC   )rb   r1  r2  rendered_metadata_defaultrendered_inspector_defaultrC   rC   rD   compare_server_defaultX  s   z"DefaultImpl.compare_server_defaultconn_uniquesSet[UniqueConstraint]conn_indexes
Set[Index]metadata_unique_constraintsmetadata_indexesc                 C     d S rd   rC   )rb   r7  r9  r;  r<  rC   rC   rD   correct_for_autogen_constraintsa  s   z+DefaultImpl.correct_for_autogen_constraintsc                 C  s(   |j j|jurt|d ||d< d S d S )Nexpr)r>   _type_affinityr   )rb   existingexisting_transfernew_typerC   rC   rD   cast_for_batch_migratej  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)rR   r   )r8   r   rR   )rb   r?  rE  rn   r   rC   rC   rD   render_ddl_sql_exprp  s   
zDefaultImpl.render_ddl_sql_expr	inspectorr'   r   c                 C  r~   rd   )autogen_column_reflect)rb   rH  rC   rC   rD   _compat_autogen_column_reflect~  s   z*DefaultImpl._compat_autogen_column_reflectconn_fksSet[ForeignKeyConstraint]metadata_fksc                 C  r=  rd   rC   )rb   rK  rM  rC   rC   rD   correct_for_autogen_foreignkeys  s   z+DefaultImpl.correct_for_autogen_foreignkeysc                 C  rx   )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.

        NrC   )rb   rH  r{   column_inforC   rC   rD   rI    r}   z"DefaultImpl.autogen_column_reflectc                 C  rx   )zA hook called when :meth:`.EnvironmentContext.run_migrations`
        is called.

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

        NrC   r   rC   rC   rD   start_migrations  r}   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ri   r   r   rC   rC   rD   
emit_begin     zDefaultImpl.emit_beginc                 C  rQ  )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`.

        COMMITNrS  r   rC   rC   rD   emit_commit  rU  zDefaultImpl.emit_committype_objr1   autogen_contextr3   Union[str, Literal[False]]c                 C  rx   NFrC   )rb   rX  rY  rC   rC   rD   render_type  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getattrrV   adddifference_updaterQ   )rb   metadata_identityinspector_identitydiffignoredmeta_alwaysinspector_alwaysrC   rC   rD   _compare_identity_default  s   

z%DefaultImpl._compare_identity_defaultmetadata_indexreflected_indexc                 C  s0   t |j}t |j}||krd| d| S d S )Nzunique=z to unique=)rV   unique)rb   rk  rl  conn_uniquemeta_uniquerC   rC   rD   _compare_index_unique  s
   

z!DefaultImpl._compare_index_unique
constraint_autogen._Copts_constraint_sig[_autogen._C]c                 K     t jd| |fi |S )NTr   from_constraintrb   rq  rs  rC   rC   rD   _create_metadata_constraint_sig     z+DefaultImpl._create_metadata_constraint_sigc                 K  ru  r[  rv  rx  rC   rC   rD    _create_reflected_constraint_sig  rz  z,DefaultImpl._create_reflected_constraint_sigr   c                 C  s   g }|  ||}|r|| | |}| |}t|s J t|s'J ||fD ]}|jr7td|j	 q+|j
|j
krK|d|j
 d|j
  |rRt|S t S )zCompare two indexes by comparing the signature generated by
        ``create_index_sig``.

        This method returns a ``ComparisonResult``.
        zGenerating approximate signature for index %s. The dialect implementation should either skip expression indexes or provide a custom implementation.expression  to )rp  r
  ry  r{  r   is_index_sighas_expressionslogwarningr   column_namesr   	DifferentEqual)rb   rk  rl  msg
unique_msgm_sigr_sigsigrC   rC   rD   compare_indexes  s0   




zDefaultImpl.compare_indexesmetadata_constraintr/   reflected_constraintc                 C  sF   |  |}| |}|j}|j}||krtd| d| S t S )a  Compare two unique constraints by comparing the two signatures.

        The arguments are two tuples that contain the unique constraint and
        the signatures generated by ``create_unique_constraint_sig``.

        This method returns a ``ComparisonResult``.
        r|  r}  )ry  r{  unnamedr   r  r  )rb   r  r  metadata_tupreflected_tupmeta_sigconn_sigrC   rC   rD   compare_unique_constraint  s   z%DefaultImpl.compare_unique_constraintc              
   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 rC   rs   )r   r   rC   rC   rD   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   re   r!   is_expression_indexr    r   r=   sqlalchemy_versiondiscard)rb   r<  r9  conn_indexes_by_nameidxiexrC   rC   rD   _skip_functional_indexes)  s$   


z$DefaultImpl._skip_functional_indexesreflected_objectkindc                 C  s   | di S )Ndialect_options)r_   )rb   r  r  rC   rC   rD    adjust_reflected_dialect_options:  s   z,DefaultImpl.adjust_reflected_dialect_options)rR   r%   rS   rT   rU   rV   rW   rX   rY   rZ   r[   r<   r\   r]   )rR   r%   r\   rc   )r   r8   r\   r]   )
rj   r8   rk   rl   rm   rV   rn   r   r\   r   )rw   r5   r\   rV   )rz   r4   r{   r   r\   r]   )r\   rT   )
r   r   r   r   r   r   r   r   r\   r   rd   )r   r   r   r   r\   r]   )NFNNNNFNNNNN) r   r8   r   r8   rq   rX   r   r   re   rl   r   r   r   rl   r   rX   r   r   r   rl   r   r   r   r   r   rX   r   rX   rn   r   r\   r]   )r   r8   r   r   r   r   r\   r]   )r   r8   r   r   r   rl   r\   r]   )r   r   r\   r]   )r   r,   r\   r]   )r   r8   r   r   r   r   r\   r]   )r{   r   rn   r   r\   r]   )r   r.   rn   r   r\   r]   )r{   r   r\   r]   )r   r   r\   r]   )T)r{   r   r   r   r   rV   r\   r]   )r   r   r\   r  )r  r  r  r  r\   rV   )r&  r  r'  r  r\   rV   )r1  r   r2  r   r\   rV   )
r7  r8  r9  r:  r;  r8  r<  r:  r\   r]   )F)r?  r(   rE  rV   rn   r   r\   r8   )rH  r'   r\   r   )rK  rL  rM  rL  r\   r]   )r\   r]   )rX  r1   rY  r3   r\   rZ  )rk  r.   rl  r.   r\   rl   )rq  rr  rs  r   r\   rt  )rk  r.   rl  r.   r\   r   )r  r/   r  r/   r\   r   )r  r<   r  r8   r\   r<   )=rE   rF   rG   __doc__r=   rW   r   rM   __annotations__rN   rQ   r?   classmethodrf   ri   rv   ry   r|   propertyr   r    immutabledictr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r%  r0  r3  r6  r>  rD  rG  rJ  rN  rI  rP  rT  rW  r\  rj  rp  ry  r{  r  r  r  r  rC   rC   rC   rD   rH   R   s   
 



"
0t
	



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




+rH   )	metaclassc                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	r  r8   r  z	List[str]r  r  zDict[str, str]r  N)rE   rF   rG   r  rC   rC   rC   rD   r  @  s
   
 r  metadata_io-Union[schema.Identity, schema.Sequence, None]inspector_io
default_io'Union[schema.Identity, schema.Sequence]r^  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_dictr   	insp_dictdefault_dictattrsIterable[str]c                   s\   t |D ]$}| |}||}||kr+||}||kr&| q | qd S rd   )set
differencer_   rb  )r  r  r  r  attr
meta_value
insp_valuedefault_valuerf  ignored_attrr^  rC   rD   check_dictsV  s   



z._compare_identity_options.<locals>.check_dictsdialect_kwargs)r  r   r  r   r  r   r  r  )r!   _get_identity_options_dictr  unionidentity_has_dialect_kwargsra  r  )r  r  r  r^  meta_dinsp_dr  rC   r  rD   r_  G  s&   
	



r_  )r  r  r  r  r  r  r^  r  )K
__future__r   loggingr  typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   
sqlalchemyr   r   r   r   r   r   r   r    r   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/   sqlalchemy.sql.selectabler0   sqlalchemy.sql.type_apir1   r2   autogenerate.apir3   operations.batchr4   r5   	getLoggerrE   r  r>   r6   r@   r  rH   r  r_  rC   rC   rC   rD   <module>   s~   
     s