o
    8c&                     @   s  d dl 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 eeZdd ZejddZdd Zeddd Zdd Zdd Z dd Z!dd Z"e j#d d! 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d*d+d, Z*d-d. Z+ed/d0d1 Z,ed/d2d3 Z-ed/d4d5 Z.d6d7 Z/d8d9 Z0d:d; Z1d<d= Z2d>d? Z3ed/d@dA Z4ed/dBdC Z5ed*dDdE Z6ed*dFdG Z7dS )H    N)event)inspectschema)types)
OrderedSet)_fk_spec   )_user_defined_render   )util)ops)compat)sqla_compatc                 C   s,   |j d }|jd }t| | || d S )N)upgrade_ops_listdowngrade_ops_list_produce_net_changesreverse_into)autogen_contextmigration_scriptupgrade_opsdowngrade_ops r   R/var/www/html/gps/gps/lib/python3.10/site-packages/alembic/autogenerate/compare.py_populate_migration_script   s   


r   T)uselistc                    s    j } jdd}t|}|jj}|r*t| }|d || |	d  nd g} fdd|D }t
d jj || d S )Ninclude_schemasFinformation_schemac                    s   h | ]}  |d i r|qS r   run_name_filters).0sr   r   r   	<setcomp>2   s
    z'_produce_net_changes.<locals>.<setcomp>r   )
connectionoptsgetr   dialectdefault_schema_namesetget_schema_namesdiscardaddcomparatorsdispatchname)r   r   r%   r   	inspectordefault_schemaschemasr   r#   r   r       s    


r   r   c           	         s    j }t } jj} jj}|D ]#t|jd}|kr&| jjg}| fdd|D  qtdd  j	D ||fg}t
||||  d S )Nr   c                 3   s*    | ]}  |d dir|fV  qdS )tableschema_nameNr   )r!   tnamer   r5   r   r   	<genexpr>M   s    

z&_autogen_for_tables.<locals>.<genexpr>c                 S   s   g | ]}|j |jfqS r   )r   r0   )r!   r4   r   r   r   
<listcomp>V       z'_autogen_for_tables.<locals>.<listcomp>)r1   r*   migration_contextversion_table_schemaversion_tableget_table_names
differenceupdater   sorted_tables_compare_tables)	r   r   r3   r1   conn_table_namesr<   r=   tablesmetadata_table_namesr   r7   r   _autogen_for_tables;   s4   
rF   c              	      s  |j jjtfdd|D }t fddt||D }|}|| D ]K\}}|r1d||f n|}	|||f }
 |
|ddd rp|j	tj
|
 td|	 tj|g |d	}td |||d |
 | sp|j	| q%t }| |D ]c\}}t||}	|	|jv }tj|||d	}|st|d
 jj| t||d   ||ddd rtj|g |d	}td ||||d  | s|j	| |j	tj| td|	 qz| |}t }i }|D ]3\}}t||}	|	|jv }tj|||d	}|st|d
 jj| t||d  ||||f< qt |dd dD ]d\}}|p/d }|r9d||f n|}	|||f }
|j|	 } |
|dd|rtj|g |d	}t!||||
| | td |||||
 W d    n	1 szw   Y  | s|j	| q'd S )Nc                    s$   g | ]\}}| kr|nd |fqS Nr   )r!   r   r6   )r2   r   r   r9   r   s    z#_compare_tables.<locals>.<listcomp>c                 3   s.    | ]\}\}}| j t|| fV  qd S rG   )table_key_to_table	sa_schema_get_table_key)r!   no_dflt_schemar   r6   r#   r   r   r8   {   s    


z"_compare_tables.<locals>.<genexpr>%s.%sr4   FzDetected added table %rr   column_reflectTzDetected removed table %rc                 S   s   | d pd| d fS )Nr    r	   r   )xr   r   r   <lambda>   s    z!_compare_tables.<locals>.<lambda>)key)"bindr(   r)   r   dictzipr?   run_object_filtersr   appendCreateTableOp
from_tableloginfoModifyTableOpsr.   r/   is_emptyrI   MetaDatarJ   rD   Tabler   listenr;   impl_compat_autogen_column_reflectr   _reflect_tableDropTableOpintersectionsorted_compare_columns)rC   rE   r1   r   r   #metadata_table_names_no_dflt_schematname_to_tabler"   r6   r0   metadata_tablemodify_table_opsremoval_metadataexiststexisting_tablesexisting_metadataconn_column_info
conn_tabler   )r   r2   r   rB   b   s   





	






rB   c                    sN   t j| d g fdd| d D R | d  d}d| v r%| d |jd< |S )Nr0   c                       g | ]} j | qS r   cr!   cnamerq   r   r   r9          z_make_index.<locals>.<listcomp>column_namesunique)rz   _tableduplicates_constraint)rI   IndexrZ   )paramsrq   ixr   rw   r   _make_index   s   r   c                    s@   t j fdd| d D d| d i}d| v r| d |jd< |S )Nc                    rr   r   rs   ru   rw   r   r   r9     rx   z+_make_unique_constraint.<locals>.<listcomp>ry   r0   duplicates_index)rI   UniqueConstraintrZ   )r~   rq   uqr   rw   r   _make_unique_constraint   s   r   c              	      s   | d | d rd| d f |  di }tj fdd| d D fdd| d	 D | d
| d| d| d| d d} | |S )Nreferred_tablereferred_schemarL   optionsc                    rr   r   rs   ru   rw   r   r   r9     rx   z%_make_foreign_key.<locals>.<listcomp>constrained_columnsc                    s   g | ]}d  |f qS )rL   r   )r!   n)r6   r   r   r9     r:   referred_columnsonupdateondelete
deferrable	initiallyr0   )r   r   r   r   r0   )r'   rI   ForeignKeyConstraintappend_constraint)r~   rq   r   constr   )rq   r6   r   _make_foreign_key
  s   

r   c              	   #   sx   r	df n}t dd |jD }dd |jD }	 fdd|jD }
||
D ]"} |	| |ddd rP|jtj|	|  t	d	|| q.|
|
D ]4}|	| }|j| } ||dd|skqVtj|d
}td |||| | r|j| qVd V  t|
|D ]$} |j| |ddd r|jtj|j|  t	d|| qd S )NrL   c                 s   s    | ]	}|j s|jV  qd S rG   systemr0   r!   rt   r   r   r   r8   *  s    
z#_compare_columns.<locals>.<genexpr>c                 S   s   i | ]	}|j s|j|qS r   r   r   r   r   r   
<dictcomp>-  s
    z$_compare_columns.<locals>.<dictcomp>c              	      s*   i | ]}  |jd dr|j|qS )column
table_namer5   )r    r0   r   r   r   r6   r   r   r   1  s    r   FzDetected added column '%s.%s'r   TzDetected removed column '%s.%s')r   rt   r?   rU   r   rV   AddColumnOpfrom_column_and_tablenamerY   rZ   rd   AlterColumnOpr.   r/   has_changesr*   DropColumnOp)r   r6   rq   ri   rj   r   r1   r0   metadata_col_namesmetadata_cols_by_nameconn_col_namesrv   colnamemetadata_colconn_colalter_column_opr   r   r   rf     sn   




rf   c                   @   s,   e Zd Zdd Zdd Zdd Zdd Zd	S )
_constraint_sigc                 C      t | j|jS rG   r   _get_constraint_final_namer   r(   selfcontextr   r   r   md_name_to_sql_namei     z#_constraint_sig.md_name_to_sql_namec                 C   s   | j |j kS rG   r   r   otherr   r   r   __eq__n     z_constraint_sig.__eq__c                 C   s   | j |j kS rG   r   r   r   r   r   __ne__q  r   z_constraint_sig.__ne__c                 C   s
   t | jS rG   )hashr   r   r   r   r   __hash__t  s   
z_constraint_sig.__hash__N)__name__
__module____qualname__r   r   r   r   r   r   r   r   r   h  s
    r   c                   @   s(   e Zd ZdZdZdd Zedd ZdS )_uq_constraint_sigFTc                 C   s,   || _ |j| _ttdd |jD | _d S )Nc                 S      g | ]}|j qS r   r0   r!   colr   r   r   r9         z/_uq_constraint_sig.__init__.<locals>.<listcomp>)r   r0   tuplere   columnssigr   r   r   r   r   __init__|  s   z_uq_constraint_sig.__init__c                 C   s   dd | j jD S )Nc                 S   r   r   r   r   r   r   r   r9     r   z3_uq_constraint_sig.column_names.<locals>.<listcomp>)r   r   r   r   r   r   ry     s   z_uq_constraint_sig.column_namesN)r   r   r   is_index	is_uniquer   propertyry   r   r   r   r   r   x  s    r   c                   @   s,   e Zd ZdZdd Zdd Zedd ZdS )	_ix_constraint_sigTc                 C   s8   || _ |j| _ttdd |jD | _t|j| _d S )Nc                 S   r   r   r   r   r   r   r   r9     r   z/_ix_constraint_sig.__init__.<locals>.<listcomp>)	r   r0   r   re   r   r   boolrz   r   r   r   r   r   r     s   z_ix_constraint_sig.__init__c                 C   r   rG   r   r   r   r   r   r     r   z&_ix_constraint_sig.md_name_to_sql_namec                 C   s   t | jS rG   )r   _get_index_column_namesr   r   r   r   r   ry     s   z_ix_constraint_sig.column_namesN)r   r   r   r   r   r   r   ry   r   r   r   r   r     s    r   c                   @   s   e Zd ZdddZdS )_fk_constraint_sigFc                 C   s   || _ |j| _t|\
| _| _| _| _| _| _}}}}| j| jt	| j| j| jt	| jf| _
|rf|  j
|rA| dkr=d n| nd |rP| dkrLd n| nd |r[| dkr[dn|r_dndf7  _
d S d S )Nz	no actiondeferredinitially_deferrabler   znot deferrable)r   r0   r   source_schemasource_tablesource_columnstarget_schematarget_tabletarget_columnsr   r   lower)r   r   include_optionsr   r   r   r   r   r   r   r     sL   
z_fk_constraint_sig.__init__N)F)r   r   r   r   r   r   r   r   r     s    r   r4   c           "         sd   j }d u |d u |d urtdd |jD }t|j}nt }t }t  }	}
dd}d urt|drkz|j	d}	dW n tyK   Y n  tyS   Y nw  	fdd|	D }	|	D ]	}|	d	rjd}qaz	|j
	d}
W n	 ty}   Y nw  	fd
d|
D }
rt }	ntfdd|	D }	tfdd|
D }
|rt|	|
|| j  jj|	|
|| tdd |D }tdd |D }tdd |	D }tdd |
D }
t fdd||D }tdd |D tdd |
D tdd ||
D }tfddtD }tdd |D }tdd |D }tdd |D }t fdd|D } fdd} 	fdd} 	fdd}tt||D ]8}|| }|jsy|j|v ryqg||v r|j|vr|j|vr|| \}}|| || qg|| qgtt||D ]`}|| }||v r|| \}}|jr|}n|}n|| }|j|jkr|| || qg }|j|jkr|d |j|jf  |j|jkr|d!|j|jf  |r|||| qtt||D ]}|| } ||  q|D ]}!|!|vr.|||!  q!d S )"Nc                 s        | ]}t |tjr|V  qd S rG   )
isinstancerI   r   r!   r   r   r   r   r8         

z/_compare_indexes_and_uniques.<locals>.<genexpr>Fget_unique_constraintsr   Tc              	      (   g | ]}  |d  ddr|qS )r0   unique_constraintr   r   r   r   r   r   r9         z0_compare_indexes_and_uniques.<locals>.<listcomp>r   c              	      r   )r0   indexr   r   r!   r   r   r   r   r9      r   c                 3       | ]}t | V  qd S rG   )r   )r!   uq_defrw   r   r   r8     s
    
c                 3   r   rG   )r   r   rw   r   r   r8         c                 s       | ]}t |V  qd S rG   r   r   r   r   r   r8   1      
c                 s   r   rG   r   r   r   r   r   r8   5      c                 s   r   rG   r   r   r   r   r   r8   7  r   c                 s   r   rG   r   r   r   r   r   r8   ;  r   c                 3   s8    | ]}t |tst|j jr| |fV  qd S rG   )r   r   r   _constraint_is_namedr   r(   r   r   r#   r   r   r8   >  s    
c                 s       | ]}|j |fV  qd S rG   r   r   r   r   r   r8   E  r   c                 s   r   rG   r   r   r   r   r   r8   F  r   c                 s   $    | ]}|j d ur|j |fV  qd S rG   r   r   r   r   r   r8   G      
c                 3   s$    | ]}||  | ffV  qd S rG   r   )r!   r0   )conn_indexes_by_nameconn_uniques_by_namer   r   r8   M  s
    
c                 s   r   rG   r   r   r   r   r   r8   V  r   c                 s   r   rG   r   r   r   r   r   r8   W  s    

c                 s   r   rG   r   r   r   r   r   r8   Z  r   c                 3   s*    | ]}t |j js|j|fV  qd S rG   )r   r   r   r(   r   r   r#   r   r   r8   [  s    
c                    s   | j r, | j| jddd r*jtj| j t	d| jd
d| j g d S d S s0d S s4r6d S  | j| jddd r]jtj| j t	d| jd
d| j g d S d S )Nr   FzDetected added index '%s' on %s, z'%s'r   z+Detected added unique constraint '%s' on %s)r   rU   r   r0   r   rV   CreateIndexOp
from_indexrY   rZ   joinry   AddConstraintOpfrom_constraintobj)r   is_create_tableis_drop_table
modify_opssupports_unique_constraintsr   r   	obj_addedk  s6   
z/_compare_indexes_and_uniques.<locals>.obj_addedc                    s   | j r,| jr
s
d S  | j| jddd r*jtj| j t	
d| j d S d S s0r2d S  | j| jddd rRjtj| j t	
d| j d S d S )Nr   Tz#Detected removed index '%s' on '%s'r   z/Detected removed unique constraint '%s' on '%s')r   r   rU   r   r0   r   rV   DropIndexOpr   rY   rZ   DropConstraintOpr   r   )r   r   r   r   r   r6   r   r   obj_removed  s2   
z1_compare_indexes_and_uniques.<locals>.obj_removedc                    s   | j r5 |j|jdd| jr3td| jd| jtj	
| j jtj
|j d S d S  |j|jdd| jretd| jd| jtj| j jtj|j d S d S )Nr   Fz&Detected changed index '%s' on '%s':%sr   r   z2Detected changed unique constraint '%s' on '%s':%s)r   rU   r   r0   rY   rZ   r   r   rV   r   r   r   r   r   r   )oldnewmsg)r   r   r6   r   r   obj_changed  s:   z1_compare_indexes_and_uniques.<locals>.obj_changedz unique=%r to unique=%rz columns %r to %r)r1   r*   constraintsindexes	frozensethasattrr   NotImplementedError	TypeErrorr'   get_indexes_correct_for_uq_duplicates_uixr(   r;   r`   correct_for_autogen_constraintsrS   unionrd   re   r?   r   r   r   rV   )"r   r   r   r6   rq   ri   r1   metadata_unique_constraintsmetadata_indexesconn_uniquesconn_indexes+unique_constraints_duplicate_unique_indexesr   conn_unique_constraintsmetadata_names
conn_namesdoubled_constraintsconn_uniques_by_sigmetadata_uniques_by_sigmetadata_indexes_by_sigunnamed_metadata_uniquesr   r   r  removed_nameconn_objconn_uqconn_idxexisting_namemetadata_objr  
added_namer   uq_sigr   )
r   r   rq   r   r   r   r   r   r   r6   r   _compare_indexes_and_uniques  s  

	
	 



r$  c                    s    fdd|D }t dd |D }t dd |D }t  fdd|D }tdd |D }	tdd | D }
|
D ]"}||vrQt|
| j|vrP| |
|  q:||vr\||	|  q:d S )	Nc                    s   g | ]
}t | |fqS r   )r   r   r!   consr(   r   r   r9     s    z2_correct_for_uq_duplicates_uix.<locals>.<listcomp>c                 s   s     | ]\}}|d ur|V  qd S rG   r   r!   r0   r&  r   r   r   r8     s    
z1_correct_for_uq_duplicates_uix.<locals>.<genexpr>c                 S   s"   g | ]\}}|d u rt |jqS rG   )r   r   r(  r   r   r   r9     s    c                    s   g | ]}|j rt| qS r   )rz   r   r   r%  r'  r   r   r9   "  s    
c                 s   s     | ]}|j r|j|fV  qd S rG   )rz   r0   r%  r   r   r   r8   +  s    
c                 s   s$    | ]}|j d  r|j|fV  qdS )r   N)rZ   r0   r%  r   r   r   r8   /  r   )r*   rS   r   r   r,   )r  r  r  r  r(   metadata_cons_namesmetadata_uq_namesunnamed_metadata_uqsmetadata_ix_namesconn_ix_namesuqs_dupe_indexesoverlapr   r'  r   r    sD   


r  r   c           	      C   s|   |j }|j }||_||ur<t|j|jrt|s"t|j|jr+td|| d S ||_	td|r5dnd|| d S d S )Nz3Ignoring nullable change on identity column '%s.%s'zDetected %s on column '%s.%s'NULLzNOT NULL)
nullableexisting_nullabler   _server_default_is_computedserver_default_nullability_might_be_unset_server_default_is_identityrY   rZ   modify_nullable)	r   r   r   r6   rv   r   r   metadata_col_nullableconn_col_nullabler   r   r   _compare_nullableA  s6   
r:  c                 C   sN   |j j|u rd|jd< d S |jdu rd|jd< d S |jdu r%d|jd< d S d S )NTautoincrementF)r4   _autoincrement_columnkwr;  )r   r   r   r6   rv   r   r   r   r   r   _setup_autoincrementk  s   

r>  c           
      C   s   |j }||_|j }|jtju rtd|| d S |jtju r'td|| d S | j||}	|	r>||_	td|||| d S d S )Nz3Couldn't determine database type for column '%s.%s'z:Column '%s.%s' has no type within the model; can't comparez-Detected type change from %r to %r on '%s.%s')
typeexisting_type_type_affinitysqltypesNullTyperY   rZ   r;   _compare_typemodify_type)
r   r   r   r6   rv   r   r   	conn_typemetadata_typeisdiffr   r   r   rD  ~  s<   rD  c                 C   s   t d| |}|dur|S t| tjr*t| jtjr| j} nt| jj|j	ddid} t| tjrD|j
jtju rBtdd| } t| S | S d S )Nr4  Fliteral_bindsTr(   compile_kwargsz^'|'$rN   )r
   r   rI   DefaultClauseargr   string_typesstrcompiler(   r?  rA  rB  Stringresubrepr)metadata_defaultr   r   renderedr   r   r   "_render_server_default_for_compare  s(   rW  c                 C   s   t dd|  S )zwe want to warn if a computed sql expression has changed.  however
    we don't want false positives and the warning is not that critical.
    so filter out most forms of variability from the SQL text.

    z[ \(\)'\"`\[\]]rN   )rR  rS  r   )sqltextr   r   r   _normalize_computed_default  s   rY  c           	      C   s   t |jjj| jddid}t|}t|jtjr3t |jjj| jddid}|d u r.d}nt|}nd}||kr@t	|| d S d S )NrI  TrJ  rN   )
rO  r4  rX  rP  r(   rY  r   rI   Computed_warn_computed_not_supported)	r   r   r   r6   rv   r   r   rendered_metadata_defaultrendered_conn_defaultr   r   r   _compare_computed_default  s2   	r^  c                 C   s   t d| |f  d S )Nz,Computed default on %s.%s cannot be modified)r   warn)r6   rv   r   r   r   r[    s   r[  c                 C   s&   | j j}||j|j\}}	}
||
fS rG   )r;   r`   _compare_identity_defaultr4  )r   r   r   r6   rv   r   r   r`   diffignored_attris_alterr   r   r   r`    s
   	
r`  c                 C   s  |j }|j }|d u r|d u rdS t|r$tjsdS t| ||||||S t|r0t|| dS t||r\||_t| ||||||\}	}
|
rX||_	|	rZt
d||t|	 d S d S d S t||| }|rh|jjnd }||_| j||||}|r||_	t
d|| d S d S )NFzIDetected server default on column '%s.%s': identity options attributes %sz)Detected server default on column '%s.%s')r4  r   r3  has_computed_reflectionr^  r[  r6  existing_server_defaultr`  modify_server_defaultrY   rZ   re   rW  rM  textr;   _compare_server_default)r   r   r   r6   rv   r   r   rU  conn_col_defaultra  rc  r\  r]  is_diffr   r   r   rh    sv   

	
		rh  c           	      C   sV   | j jsd S |j}|j}|d u r|d u rdS ||_||kr)||_td|| d S d S )NFzDetected column comment '%s.%s')r(   supports_commentscommentexisting_commentmodify_commentrY   rZ   )	r   r   r   r6   rv   r   r   metadata_commentconn_col_commentr   r   r   _compare_column_commentg  s   rq  c                    s  d u s|d u r
d S  j }tdd |jD } fdd|jdD }|o.d|d v tfdd|D } jj|| tfd	d|D }tfd
d|D }tdd |D }	tdd |D }
tdd |D }tdd |D } fdd} fdd}t|	|
D ]}|	| ||
vrj	|v r|j	 j
nd }|| qt|
|	D ]}|
| ||	vr҈j	|v r|j	 j
nd }|| qd S )Nc                 s   r   rG   )r   rI   r   r!   fkr   r   r   r8     r   z(_compare_foreign_keys.<locals>.<genexpr>c              	      r   )r0   foreign_key_constraintr   r   rr  r   r   r   r9     r   z)_compare_foreign_keys.<locals>.<listcomp>r   r   r   c                 3   r   rG   )r   )r!   r   rw   r   r   r8     r   c                 3       | ]	}t | d V  qdS )r   Nr   rr  backend_reflects_fk_optionsr   r   r8     
    

c                 3   ru  rv  rw  rr  rx  r   r   r8     rz  c                 s   r   rG   r   r   r   r   r   r8     r   c                 s   r   rG   r   r   r   r   r   r8     r   c                 s   r   rG   r   r   r   r   r   r8         

c                 s   r   rG   r   r   r   r   r   r8     r{  c                    sh     | j| jdd|r2jtjj tdd	| j
d	| j| jr+d| j nd| j d S d S )Nrt  Fz1Detected added foreign key (%s)(%s) on table %s%sr   %s.rN   )rU   r   r0   r   rV   CreateForeignKeyOpr   rY   rZ   r   r   r   r   r   r   
compare_to)r   r   rj   r   r   _add_fk  s   

z&_compare_foreign_keys.<locals>._add_fkc                    sh     | j| jdd|r2jtj| j tdd	| j
d	| j| jr+d| j nd| j d S d S )Nrt  Tz3Detected removed foreign key (%s)(%s) on table %s%sr   r|  rN   )rU   r   r0   r   rV   r   r   rY   rZ   r   r   r   r   r   r~  )r   rj   r   r   
_remove_fk  s   

z)_compare_foreign_keys.<locals>._remove_fk)r1   r*   r  get_foreign_keysr;   r`   correct_for_autogen_foreignkeysrS   r?   r0   r   )r   rj   r   r6   rq   ri   r1   metadata_fksconn_fksconn_fks_by_sigmetadata_fks_by_sigmetadata_fks_by_nameconn_fks_by_namer  r  removed_sigr  	added_sigr   )r   ry  rq   r   rj   r   r6   r   _compare_foreign_keys  sb   


r  c                 C   s   | j jsd S |d u s|d u rd S |jd u r|jd u rd S |jd u r5|jd ur5|jtj||j|d d S |j|jkrL|jtj||j|j|d d S d S )N)rm  r   )r(   rk  rl  r   rV   DropTableCommentOpCreateTableCommentOp)r   rj   r   r6   rq   ri   r   r   r   _compare_table_comment  s,   
r  )8
contextlibloggingrR  
sqlalchemyr   r   r   rI   r   rB  sqlalchemy.utilr   alembic.ddl.baser   renderr
   rN   r   
operationsr   r   r   	getLoggerr   rY   r   
Dispatcherr.   r   dispatch_forrF   rB   r   r   r   contextmanagerrf   objectr   r   r   r   r$  r  r:  r>  rD  rW  rY  r^  r[  r`  rh  rq  r  r  r   r   r   r   <module>   sn    

& 
H+
  ;C
)

+
,
T

t