U
    #iiq                     @  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 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-m0Z0 d d)l-m1Z1 d d*l-m2Z2 d d+l-m3Z3 d d,l4m5Z5 d d-l6m7Z7 dd.lm8Z8 dd/l9m:Z: dd0l;m<Z< dd1l;m=Z= e>e?Z@G d2d3 d3eAZBi ZCd4eDd5< G d6d7 d7eBd8ZEG d9d: d:eZFd;d;d<d=d>d?d@ZGdS )A    )annotationsN)Any)Callable)Dict)Iterable)List)Mapping)
NamedTuple)Optional)Sequence)Set)Tuple)Type)TYPE_CHECKING)Union)castschema)text   )_autogen)base)_constraint_sig)ComparisonResult   )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dddZdS )ImplMetastrzTuple[Type[DefaultImpl]]Dict[str, Any])	classnamebasesdict_c                 C  s(   t | |||}d|kr$| t|d < |S )N__dialect__)type__init___impls)clsr6   r7   r8   Znewtype r>   X/var/www/html/me.goteku.com/backend/venv/lib/python3.8/site-packages/alembic/ddl/impl.pyr;   @   s    zImplMeta.__init__N)__name__
__module____qualname__r;   r>   r>   r>   r?   r3   ?   s   r3   zDict[str, Type[DefaultImpl]]r<   c                   @  sn  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< ddddddddddZedddddZddddd Zd!dd"d#d$Zd%d&dd'd(d)Zedd*d+d,Zd-d-e fd.d/d0d1d2d3d4d5Zdd.d6dd7d8d9Zddddd:d;d<d;dd=d;d<d>ddd?dd@dAdBZdddCdDddEdFdGZdddCd;ddEdHdIZd?ddJdKdLZdMddJdNdOZdddPdDddQdRdSZd&ddTdUdVZd&ddTdWdXZdYd?ddZd[d\Zd&ddTd]d^Z d&ddTd_d`Z!daddbdcddZ"dYd?ddZdedfZ#ddhdidddjdkdlZ$dmdndbdodpZ%dndnddqdrdsZ&dndnddtdudvZ'dCdmddwdxdyZ(dzd{ Z)d|d}d|d}dd~ddZ*dd Z+dddd?ddddZ,dddddZ-ddddddZ.dd Z/dd*ddZ0dd*ddZ1dd*ddZ2ddddddZ3dd Z4dYdYd;dddZ5dd?ddddZ6dd?ddddZ7dYdYddddZ8ddddddZ9dd Z:ddd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;ZNUMERICZDECIMALzTuple[Set[str], ...]type_synonymsr>   zSequence[str]type_arg_extract)orderZon_nullzTuple[str, ...]identity_attrs_ignorer    zOptional[Connection]boolzOptional[bool]zOptional[TextIO]r5   None)dialect
connectionas_sqltransactional_ddloutput_buffercontext_optsreturnc                 C  sZ   || _ || _|| _|dd| _|| _i | _|| _|d k	r@|| _| jrV| jsVt	
dd S )Nliteral_bindsFz3Can't use literal_binds setting without as_sql mode)rL   rM   rN   getrS   rP   memorQ   rO   r   CommandError)selfrL   rM   rN   rO   rP   rQ   r>   r>   r?   r;   h   s    	zDefaultImpl.__init__zType[DefaultImpl])rL   rR   c                 C  s
   t |j S N)r<   name)r=   rL   r>   r>   r?   get_by_dialect   s    zDefaultImpl.get_by_dialectr4   )r   rR   c                 C  s,   | j d k	st| j |d  | j   d S )Nz

)rP   AssertionErrorwriteflush)rW   r   r>   r>   r?   static_output   s    zDefaultImpl.static_outputr2   )batch_oprR   c                 C  s   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>   )rW   r_   r>   r>   r?   requires_recreate_in_batch   s    z&DefaultImpl.requires_recreate_in_batchr1   r+   )
batch_impltablerR   c                 C  s   dS )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>   )rW   ra   rb   r>   r>   r?   prep_table_for_batch   s    z DefaultImpl.prep_table_for_batch)rR   c                 C  s   | j S rX   )rM   rW   r>   r>   r?   bind   s    zDefaultImpl.bindNzUnion[Executable, str]zOptional[Mapping[str, Any]]z%Optional[Sequence[Mapping[str, Any]]]Mapping[str, Any]zOptional[CursorResult])	constructexecution_optionsmultiparamsparamsrR   c                 C  s   t |trt|}| jr|d k	s$|r,td| jrNt |tjsNtddid}ni }t	rdt |t
sdt|jf d| ji|}| t|dd | j  d S | j}|d k	st|r|jf |}|r|d k	rtd|r|||S |||S d S )	Nz&SQL parameters not allowed with as_sqlrS   T)compile_kwargsrL   	z    z2Can't send params and multiparams at the same time)
isinstancer4   r   rN   	TypeErrorrS   r   Z
DDLElementdictr   r#   r[   compilerL   r^   replacestripcommand_terminatorrM   rh   execute)rW   rg   rh   ri   rj   
compile_kwcompiledconnr>   r>   r?   _exec   s>    
 zDefaultImpl._execzOptional[dict[str, Any]])sqlrh   rR   c                 C  s   |  || d S rX   )rx   )rW   ry   rh   r>   r>   r?   rt      s    zDefaultImpl.executez%Union[_ServerDefault, Literal[False]]zOptional[str]zOptional[TypeEngine]z$Optional[Union[str, Literal[False]]]zOptional[_ServerDefault]r   )
table_namecolumn_namenullableserver_defaultrY   type_r   autoincrementcommentexisting_commentexisting_typeexisting_server_defaultexisting_nullableexisting_autoincrementkwrR   c                 K  s*  |d k	s|d k	rt jddd |d k	rF| tj||||||||
d |dk	ri }t||rftj}n"t||rtj	}| |d< ntj
}| ||||f|||||
d| |d k	r| tj||||||||
d |	dk	r| tj|||	|||||
d |d k	r&| tj|||||||d d S )NzBautoincrement and existing_autoincrement only make sense for MySQL   )
stacklevel)r   r   r   r   r   Fimpl)r   r   r   r   )r   warnrx   r   ZColumnNullabler   Z_server_default_is_computedZComputedColumnDefaultZ_server_default_is_identityZIdentityColumnDefaultZColumnDefaultZ
ColumnTypeZColumnCommentZ
ColumnName)rW   rz   r{   r|   r}   rY   r~   r   r   r   r   r   r   r   r   r   Zcls_r>   r>   r?   alter_column   s      
	
zDefaultImpl.alter_columnzColumn[Any]z!Optional[Union[str, quoted_name]])rz   columnr   rR   c                 C  s   |  tj|||d d S Nr   )rx   r   Z	AddColumn)rW   rz   r   r   r>   r>   r?   
add_columnK  s    zDefaultImpl.add_columnc                 K  s   |  tj|||d d S r   )rx   r   Z
DropColumn)rW   rz   r   r   r   r>   r>   r?   drop_columnS  s    zDefaultImpl.drop_column)constrR   c                 C  s(   |j d ks| | r$| t| d S rX   )Z_create_rulerx   r   ZAddConstraintrW   r   r>   r>   r?   add_constraint\  s    zDefaultImpl.add_constraintr(   c                 C  s   |  t| d S rX   )rx   r   ZDropConstraintr   r>   r>   r?   drop_constraint`  s    zDefaultImpl.drop_constraintzUnion[str, quoted_name])old_table_namenew_table_namer   rR   c                 C  s   |  tj|||d d S r   )rx   r   ZRenameTable)rW   r   r   r   r>   r>   r?   rename_tablec  s    zDefaultImpl.rename_table)rb   rR   c                 C  s   |j j|| jd| d | t| |j j|| jd| d |jD ]}| t| qB| j	j
oh| j	j }|j}|r|r| | |jD ]}|j}|r|r| | qd S NF)Z
checkfirstZ_ddl_runner)dispatchZbefore_createrM   rx   r   ZCreateTableZafter_createZindexesCreateIndexrL   Zsupports_commentsZinline_commentsr   create_table_commentcolumnscreate_column_comment)rW   rb   indexZwith_commentr   r   r>   r>   r?   create_tablem  s0          


zDefaultImpl.create_tablec                 C  s@   |j j|| jd| d | t| |j j|| jd| d d S r   )r   Zbefore_droprM   rx   r   Z	DropTableZ
after_droprW   rb   r>   r>   r?   
drop_table  s          zDefaultImpl.drop_tabler*   )r   r   rR   c                 K  s   |  tj|f| d S rX   )rx   r   r   rW   r   r   r>   r>   r?   create_index  s    zDefaultImpl.create_indexc                 C  s   |  t| d S rX   )rx   r   ZSetTableCommentr   r>   r>   r?   r     s    z DefaultImpl.create_table_commentc                 C  s   |  t| d S rX   )rx   r   ZDropTableCommentr   r>   r>   r?   drop_table_comment  s    zDefaultImpl.drop_table_commentzColumnElement[Any])r   rR   c                 C  s   |  t| d S rX   )rx   r   ZSetColumnComment)rW   r   r>   r>   r?   r     s    z!DefaultImpl.create_column_commentc                 K  s   |  tj|f| d S rX   )rx   r   Z	DropIndexr   r>   r>   r?   
drop_index  s    zDefaultImpl.drop_indexTzUnion[TableClause, Table]z
List[dict])rb   rowsmultiinsertrR   c                   s   t |tstdn|r.t |d ts.td| jrj|D ].}| t jf  fdd|	 D  q8n@|r|r| jt |d n"|D ]}| t jf | qd S )NzList expectedr   zList of dictionaries expectedc                   s:   i | ]2\}}|t |tjs2tj|| j| jd n|qS ))r~   )rm   r   Z_literal_bindparamcr:   ).0kvrb   r>   r?   
<dictcomp>  s   
   
z+DefaultImpl.bulk_insert.<locals>.<dictcomp>)ri   )
rm   listrn   ro   rN   rx   r   Z_insert_inlinevaluesitems)rW   rb   r   r   rowr>   r   r?   bulk_insert  s.    



 zDefaultImpl.bulk_insertr'   Paramsc                 C  s   | j j|j }td|}g }d }|D ] }td|rB|}q,|| q,t	|d |dd  g i }|rtd|D ]>}d|kr|
d\}	}
|
 |j|	 < qx|j|  qx|S )Nz[\w\-_]+|\(.+?\)z^\(.*\)$r   r   z[^(),]+=)rL   Ztype_compilerprocessr:   lowerrefindallmatchappendr   splitrr   kwargsargs)rW   r   Z
definitiontokensZterm_tokensZ
paren_termtokenrj   termkeyvalr>   r>   r?   _tokenize_column_type  s     z!DefaultImpl._tokenize_column_type)inspector_paramsmetadata_paramsrR   c                 C  s|   |j |j krdS dd | jD }d|j g|j }d|j g|j }|D ]*}||h|sp|j |j h|rL dS qLdS )NTc                 S  s   g | ]}d d |D qS )c                 S  s   h | ]}|  qS r>   )r   )r   tr>   r>   r?   	<setcomp>  s     z=DefaultImpl._column_types_match.<locals>.<listcomp>.<setcomp>r>   )r   batchr>   r>   r?   
<listcomp>  s     z3DefaultImpl._column_types_match.<locals>.<listcomp> F)token0rF   joinr   issubset)rW   r   r   ZsynonymsZinspector_all_termsZmetadata_all_termsr   r>   r>   r?   _column_types_match  s$    zDefaultImpl._column_types_match)inspected_paramsmeta_paramsrR   c                 C  s   t |jt |jkr$|j|jkr$dS t |jt |jkrH|j|jkrHdS d|j }d|j }| jD ]>}t||}t||}|rn|rn|d|dkrn dS qnd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   rG   r   searchgroup)rW   r   r   Zinspmetaregmimmr>   r>   r?   _column_args_match  s$    



zDefaultImpl._column_args_match)inspector_columnmetadata_columnrR   c                 C  s8   |  |}|  |}| ||s$dS | ||s4d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   )rW   r   r   r   r   r>   r>   r?   compare_type#  s    

zDefaultImpl.compare_typec                 C  s   ||kS rX   r>   )rW   r   r   Zrendered_metadata_defaultZrendered_inspector_defaultr>   r>   r?   compare_server_default3  s    z"DefaultImpl.compare_server_defaultzSet[UniqueConstraint]z
Set[Index])conn_uniquesconn_indexesmetadata_unique_constraintsmetadata_indexesrR   c                 C  s   d S rX   r>   )rW   r   r   r   r   r>   r>   r?   correct_for_autogen_constraints<  s    z+DefaultImpl.correct_for_autogen_constraintsc                 C  s$   |j j|jk	r t|d ||d< d S )Nexpr)r:   Z_type_affinityr   )rW   existingZexisting_transfernew_typer>   r>   r?   cast_for_batch_migrateE  s
     z"DefaultImpl.cast_for_batch_migrater#   )r   is_server_defaultr   rR   c                 K  s   ddd}t |j| j|dS )zdRender a SQL expression that is typically a server default,
        index expression, etc.

        TF)rS   Zinclude_table)rL   rk   )r4   rp   rL   )rW   r   r   r   ru   r>   r>   r?   render_ddl_sql_exprK  s    
zDefaultImpl.render_ddl_sql_exprr"   r   )	inspectorrR   c                 C  s   | j S rX   )autogen_column_reflect)rW   r   r>   r>   r?   _compat_autogen_column_reflectY  s    z*DefaultImpl._compat_autogen_column_reflectzSet[ForeignKeyConstraint])conn_fksmetadata_fksrR   c                 C  s   d S rX   r>   )rW   r   r   r>   r>   r?   correct_for_autogen_foreignkeys\  s    z+DefaultImpl.correct_for_autogen_foreignkeysc                 C  s   dS )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>   )rW   r   rb   Zcolumn_infor>   r>   r?   r   c  s    z"DefaultImpl.autogen_column_reflectc                 C  s   dS )zA hook called when :meth:`.EnvironmentContext.run_migrations`
        is called.

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

        Nr>   rd   r>   r>   r?   start_migrationsl  s    zDefaultImpl.start_migrationsc                 C  s   |  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`.

        ZBEGINNr^   rs   rd   r>   r>   r?   
emit_begint  s    zDefaultImpl.emit_beginc                 C  s   |  d| j  dS )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`.

        ZCOMMITNr   rd   r>   r>   r?   emit_commit~  s    zDefaultImpl.emit_commitr.   r0   zUnion[str, Literal[False]])type_objautogen_contextrR   c                 C  s   dS NFr>   )rW   r   r   r>   r>   r?   render_type  s    zDefaultImpl.render_typec                 C  sv   t ||t dhd\}}t|dd }t|dd }t|t|krL|d || j ||t|prt|t|kfS )Nalways)skip)_compare_identity_optionsr   ZIdentitygetattrrJ   adddifference_updaterI   )rW   Zmetadata_identityZinspector_identitydiffZignoredZmeta_alwaysZinspector_alwaysr>   r>   r?   _compare_identity_default  s    

z%DefaultImpl._compare_identity_default)metadata_indexreflected_indexrR   c                 C  s4   t |j}t |j}||kr,d| d| S d S d S )Nzunique=z to unique=)rJ   unique)rW   r   r   Zconn_uniqueZmeta_uniquer>   r>   r?   _compare_index_unique  s
    

z!DefaultImpl._compare_index_uniquez_autogen._Cz_constraint_sig[_autogen._C])
constraintoptsrR   c                 K  s   t jd| |f|S )NTr   Zfrom_constraintrW   r  r  r>   r>   r?   _create_metadata_constraint_sig  s    z+DefaultImpl._create_metadata_constraint_sigc                 K  s   t jd| |f|S r   r  r  r>   r>   r?    _create_reflected_constraint_sig  s    z,DefaultImpl._create_reflected_constraint_sigr   c                 C  s   g }|  ||}|r|| | |}| |}t|s@tt|sNt||fD ]}|jrVt	d|j
 qV|j|jkr|d|j d|j  |rt|S t S d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 N)r   r   r  r  r   Zis_index_sigr[   Zhas_expressionslogwarningr   Zcolumn_namesr   	DifferentEqual)rW   r   r   msgZ
unique_msgZm_sigZr_sigsigr>   r>   r?   compare_indexes  s0    
 



zDefaultImpl.compare_indexesr,   )metadata_constraintreflected_constraintrR   c                 C  sJ   |  |}| |}|j}|j}||kr>td| d| S t S d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  N)r  r  unnamedr   r  r  )rW   r  r  Zmetadata_tupZreflected_tupZmeta_sigZconn_sigr>   r>   r?   compare_unique_constraint  s    z%DefaultImpl.compare_unique_constraintc              
   C  sh   dd |D }t |D ]L}|j|kr&qt|}|rtd|jd| jdtj d || qd S )Nc                 S  s   i | ]}|j |qS r>   )rY   )r   r   r>   r>   r?   r     s      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   rY   r   Zis_expression_indexr   r   r9   Zsqlalchemy_versiondiscard)rW   r   r   Zconn_indexes_by_nameidxiexr>   r>   r?   _skip_functional_indexes  s    

z$DefaultImpl._skip_functional_indexes)reflected_objectkindrR   c                 C  s   | di S )NZdialect_options)rT   )rW   r  r  r>   r>   r?    adjust_reflected_dialect_options  s    z,DefaultImpl.adjust_reflected_dialect_options)N)NFNNNNFNNNNN)N)N)N)T)F)<r@   rA   rB   __doc__r9   rO   rs   rF   __annotations__rG   rI   r;   classmethodrZ   r^   r`   rc   propertyre   r   Zimmutabledictrx   rt   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r  r  r>   r>   r>   r?   rC   O   s   
0             .t  	 
	 ((!		 	


+rC   )	metaclassc                   @  s.   e Zd ZU ded< ded< ded< ded< dS )	r   r4   r   z	List[str]r   r   zDict[str, str]r   N)r@   rA   rB   r  r>   r>   r>   r?   r     s   
r   z-Union[schema.Identity, schema.Sequence, None]z'Union[schema.Identity, schema.Sequence]zSet[str])metadata_ioinspector_io
default_ior   c                   s   t | }t |}t  t ddddd fdd}|||t |t|| t jr|t| di t|di |jt|di   fS )Nrf   zIterable[str])	meta_dict	insp_dictdefault_dictattrsc                   s\   t |D ]H}| |}||}||kr||}||krL| q | qd S rX   )set
differencerT   r   )r#  r$  r%  r&  attrZ
meta_valueZ
insp_valuedefault_valuer   Zignored_attrr   r>   r?   check_dicts1  s    


z._compare_identity_options.<locals>.check_dictsdialect_kwargs)r   Z_get_identity_options_dictr'  unionZidentity_has_dialect_kwargsr   r-  )r   r!  r"  r   Zmeta_dZinsp_dr,  r>   r+  r?   r   "  s&    	




r   )H
__future__r   loggingr   typingr   r   r   r   r   r   r	   r
   r   r   r   r   r   r   Z
sqlalchemyr   r   r    r   r   r   r   r   r   r   r   Zsqlalchemy.enginer   r    Zsqlalchemy.engine.cursorr!   Zsqlalchemy.engine.reflectionr"   Zsqlalchemy.sqlr#   r$   Zsqlalchemy.sql.elementsr%   r&   Zsqlalchemy.sql.schemar'   r(   r)   r*   r+   r,   Zsqlalchemy.sql.selectabler-   Zsqlalchemy.sql.type_apir.   r/   Zautogenerate.apir0   Zoperations.batchr1   r2   	getLoggerr@   r	  r:   r3   r<   r  rC   r   r   r>   r>   r>   r?   <module>   sx    
     Q