
    `?i(                     F    d dl mZ d dlmZmZmZ d dlmZ  G d de      Zy)    )BaseDatabaseSchemaEditor)NOT_PROVIDEDFUniqueConstraint)
LOOKUP_SEPc                       e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZed        Zd Zd Zd Zd Zd Zed        Z fdZ fdZ fdZ fdZ fdZdddZ fdZ d Z! fd Z" fd!Z# fd"Z$d# Z% fd$Z& fd%Z' xZ(S )&DatabaseSchemaEditorz+RENAME TABLE %(old_table)s TO %(new_table)szMODIFY %(column)s %(type)s NULLz#MODIFY %(column)s %(type)s NOT NULLz2MODIFY %(column)s %(type)s%(collation)s%(comment)sz(ALTER COLUMN %(column)s SET DEFAULT NULLz)ALTER TABLE %(table)s DROP INDEX %(name)szY, ADD CONSTRAINT %(name)s FOREIGN KEY (%(column)s) REFERENCES %(to_table)s(%(to_column)s)z/ALTER TABLE %(table)s DROP FOREIGN KEY %(name)sz DROP INDEX %(name)s ON %(table)sz?ALTER TABLE %(table)s RENAME INDEX %(old_name)s TO %(new_name)szGALTER TABLE %(table)s ADD CONSTRAINT %(name)s PRIMARY KEY (%(columns)s)z&ALTER TABLE %(table)s DROP PRIMARY KEYz9CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)sz+ALTER TABLE %(table)s COMMENT = %(comment)sNc                 2    | j                   j                  ryy)Nz8ALTER TABLE %(table)s DROP CONSTRAINT IF EXISTS %(name)sz)ALTER TABLE %(table)s DROP CHECK %(name)s)
connectionmysql_is_mariadbselfs    q/home/cursorai/projects/django-cronjob-utils/venv/lib/python3.12/site-packages/django/db/backends/mysql/schema.pysql_delete_checkz%DatabaseSchemaEditor.sql_delete_check"   s    ??++ N:    c                 "   | j                   j                          | j                   j                   j                  || j                   j                   j                        }t	        |t
              r t	        |t              r|j                         }|S N)r   ensure_connectionescapeencoders
isinstancestrbytesdecode)r   valuequoteds      r   quote_valuez DatabaseSchemaEditor.quote_value+   sf    ))+++224??--66
 eS!j&?]]_Fr   c                     |j                  | j                        }|d uxr& |j                         | j                  j                  v S r   )db_typer   lower_limited_data_typesr   fieldr   s      r   _is_limited_data_typez*DatabaseSchemaEditor._is_limited_data_type5   s?    --04 G4??#F#FF	
r   c                 ~    |j                  | j                        }|xr |j                         j                  d      S )N)blobtext)r   r   r    endswithr"   s      r   _is_text_or_blobz%DatabaseSchemaEditor._is_text_or_blob<   s1    --0E7==?334DEEr   c                     | j                  |      dv }|r| j                  |      ry| j                  s| j                  |      S yN) r   TF)effective_defaultr)   $_supports_limited_data_type_defaultsr$   r   r#   default_is_emptys      r   skip_defaultz!DatabaseSchemaEditor.skip_default@   sH    11%8IE 5 5e <88--e44r   c                     | j                  |      dv }|r| j                  |      ry| j                  |      r| j                  j                  syyr+   )r-   r)   r$   r   r   r/   s      r   skip_default_on_alterz*DatabaseSchemaEditor.skip_default_on_alterH   sM    11%8IE 5 5e <%%e,T__5U5U r   c                 b    | j                   j                  ry| j                   j                  dk\  S )NT)   r      )r   r   mysql_versionr   s    r   r.   z9DatabaseSchemaEditor._supports_limited_data_type_defaultsR   s)     ??++,,
::r   c                     | j                   j                  s| j                  r| j                  |      ryt        |   |      S )Nz(%s))r   r   r.   r$   super_column_default_sql)r   r#   	__class__s     r   r:   z(DatabaseSchemaEditor._column_default_sqlY   s<    0099**51 w*511r   c                 @   t         |   ||       | j                  |      r||j                  d t        fvrg| j                  |      }| j                  d| j                  |j                  j                        | j                  |j                        dz  |g       y y y )Nz%UPDATE %(table)s SET %(column)s = %%s)tablecolumn)r9   	add_fieldr1   defaultr   r-   execute
quote_name_metadb_tabler>   )r   modelr#   r-   r;   s       r   r?   zDatabaseSchemaEditor.add_fieldd   s    %' U#dL=Q(Q $ 6 6u =LL7!__U[[-A-AB"ooell;
 ## )R#r   c                     t        |t              r:|j                  ||       (| j                  ||j                  |j
                         t        |   ||       y N)fieldsexpressions)r   r   
create_sql_create_missing_fk_indexrH   rI   r9   remove_constraint)r   rE   
constraintr;   s      r   rL   z&DatabaseSchemaEditor.remove_constraintt   sZ    z#34%%eT2>))!((&22 * 
 	!%4r   c           	          | j                  ||j                  D cg c]  \  }}|	 c}}|j                         t        |   ||       y c c}}w rG   )rK   fields_ordersrI   r9   remove_index)r   rE   index
field_name_r;   s        r   rP   z!DatabaseSchemaEditor.remove_index   sW    %%494G4GH4G=:qJ4GH)) 	& 	

 	UE* Is   Ac                 8   t         |   ||      sy| j                  j                  j	                  | j                  j                         |j                  j                        }|dk(  r |j                         dk(  r|j                  ry| j                  |       S )NFInnoDB
ForeignKey)r9   _field_should_be_indexedr   introspectionget_storage_enginecursorrC   rD   get_internal_typedb_constraintr$   )r   rE   r#   storager;   s       r   rW   z-DatabaseSchemaEditor._field_should_be_indexed   s    w/u=////BBOO""$ekk&:&:
 x'')\9##--e444r   )rI   c                0   d}|r|d   }nY|rW| j                   j                  j                  r7t        |d   t              r$t
        |d   j                  vr|d   j                  }|sy|j                  j                  |      }|j                         dk(  r| j                   j                  j                  |j                        }| j                   j                         5 }| j                   j                  j                  ||j                  j                        j!                         D 	cg c]  \  }}	|	d   r|	d   d   |k(  r| }
}}	ddd       t#        
      dk(  r%| j%                  | j'                  ||gd             yyyc c}	}w # 1 sw Y   DxY w)	a  
        MySQL can remove an implicit FK index on a field when that field is
        covered by another index like a unique_together. "covered" here means
        that the more complex index has the FK field as its first field (see
        https://bugs.mysql.com/bug.php?id=37910).

        Manually create an implicit FK index to make it possible to remove the
        composed index.
        Nr   rV   rQ   columns   r,   )rH   suffix)r   featuressupports_expression_indexesr   r   r   namerC   	get_fieldr[   rX   identifier_converterr>   rZ   get_constraintsrD   itemslenrA   _create_index_sql)r   rE   rH   rI   first_field_namefirst_fieldr>   rZ   rd   infodictconstraint_namess              r   rK   z-DatabaseSchemaEditor._create_missing_fk_index   s      %ay((DD;q>1-+a."5"55*1~22kk++,<=((*l:__22GG""F '')V +///*G*G*W*W 4 4+eg+$+h  (Xi-@-Cv-M	 + ! $ * #$)**5+r*R * ;
$ *)s   AF*FFFFc                 L    | j                  ||       t        |   ||g| S )N)rH   )rK   r9   _delete_composed_index)r   rE   rH   argsr;   s       r   rp   z+DatabaseSchemaEditor._delete_composed_index   s-    %%eF%;w-eVCdCCr   c                      |j                         r3 j                  |      \  }}|t         fd|D              z  }|d| z  }|j                  r|dz  }|S |dz  }|S )z
        Keep the NULL and DEFAULT properties of the old field. If it has
        changed, it will be handled separately.
        c              3   @   K   | ]  }j                  |        y wr   )r   ).0pr   s     r   	<genexpr>z;DatabaseSchemaEditor._set_field_new_type.<locals>.<genexpr>   s      Ef!1!1!!4fs   z	 DEFAULT z NULLz	 NOT NULL)has_db_defaultdb_default_sqltuplenull)r   r#   new_typedefault_sqlparamss   `    r   _set_field_new_typez(DatabaseSchemaEditor._set_field_new_type   su    
 !"&"5"5e"<K5 Ef EEEK)K=11H::H  #Hr   c                 P    | j                  ||      }t        | 	  ||||||      S r   )r~   r9   _alter_column_type_sql)r   rE   	old_field	new_fieldr{   old_collationnew_collationr;   s          r   r   z+DatabaseSchemaEditor._alter_column_type_sql   s6     ++Ix@w-9i=-
 	
r   c                 Z    | j                   j                  rt        |   ||      S |d   S )Ncheck)r   r   r9   _field_db_check)r   r#   field_db_paramsr;   s      r   r   z$DatabaseSchemaEditor._field_db_check   s/    ??++7*5/BB w''r   c                 L    | j                  ||      }t        | 	  ||||      S r   )r~   r9   _rename_field_sql)r   r=   r   r   r{   r;   s        r   r   z&DatabaseSchemaEditor._rename_field_sql   s+    ++Ix@w(	9hOOr   c                 
    dg fS )Nr,    )r   rE   r   r{   new_db_comments        r   _alter_column_comment_sqlz.DatabaseSchemaEditor._alter_column_comment_sql   s    2vr   c                 ,    t         |   |      }d| S )Nz	 COMMENT )r9   _comment_sql)r   commentcomment_sqlr;   s      r   r   z!DatabaseSchemaEditor._comment_sql   s    g*73;-((r   c                     |j                         st        | 	  |||      S |j                  | j                        }| j                  ||d         }d| j                  |j                        |dz  g fS )N)r   typezMODIFY %(column)s %(type)s)r>   r   )rw   r9   _alter_column_null_sqldb_parametersr   r~   rB   r>   )r   rE   r   r   new_db_paramstype_sqlr;   s         r   r   z+DatabaseSchemaEditor._alter_column_null_sql   s    '')71%INN!//4??/K++I}V7LM(//)*:*:; 
 
 	
r   ))__name__
__module____qualname__sql_rename_tablesql_alter_column_nullsql_alter_column_not_nullsql_alter_column_type sql_alter_column_no_default_nullsql_delete_uniquesql_create_column_inline_fksql_delete_fksql_delete_indexsql_rename_indexsql_create_pksql_delete_pksql_create_indexsql_alter_table_commentsql_alter_column_commentpropertyr   r   r$   r)   r1   r3   r.   r:   r?   rL   rP   rW   rK   rp   r~   r   r   r   r   r   r   __classcell__)r;   s   @r   r	   r	      s    D= EP'Q$C	1   FM9X 	R  =MRK#; ;
F ; ;	2 
5+5. 0dD
(P)
 
r   r	   N)	django.db.backends.base.schemar   django.db.modelsr   r   r   django.db.models.constantsr   r	   r   r   r   <module>r      s     C > > 1A
3 A
r   