
    hfP                         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  G d
 de      Zy)    N)Decimal)Apps)NotSupportedError)BaseDatabaseSchemaEditor)	Statement)strip_quotes)UniqueConstraint)atomicc                        e Zd ZdZdZdZdZdZ fdZ fdZ	d Z
dd	Zd fd
	Zd fd	ZddZd fd	Zd Zd Z	 ddZd Z fdZ fdZ xZS )DatabaseSchemaEditorzDROP TABLE %(table)sNzEREFERENCES %(to_table)s (%(to_column)s) DEFERRABLE INITIALLY DEFERREDz7CREATE UNIQUE INDEX %(name)s ON %(table)s (%(columns)s)zDROP INDEX %(name)sc                 j    | j                   j                         st        d      t        |          S )NzSQLite schema editor cannot be used while foreign key constraint checks are enabled. Make sure to disable them before entering a transaction.atomic() context because SQLite does not support disabling them in the middle of a multi-statement transaction.)
connectiondisable_constraint_checkingr   super	__enter__)self	__class__s    d/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/schema.pyr   zDatabaseSchemaEditor.__enter__   s7     ::<#1  w ""    c                     | j                   j                          t        |   |||       | j                   j	                          y N)r   check_constraintsr   __exit__enable_constraint_checking)r   exc_type	exc_value	tracebackr   s       r   r   zDatabaseSchemaEditor.__exit__"   s4    ))+9i8224r   c                    	 dd l }|j                  |      }t	        |t
              rt        t        |            S t	        |t        t        t        f      rt        |      S t	        |t              rd|j                  dd      z  S |yt	        |t        t        t        f      rd|j                         z  S t        d|dt!        |            # t        $ r Y j                  $ r Y w xY w)	Nr   z'%s''z''NULLzX'%s'zCannot quote parameter value z	 of type )sqlite3adaptImportErrorProgrammingError
isinstanceboolstrintr   floatreplacebytes	bytearray
memoryviewhex
ValueErrortype)r   valuer!   s      r   quote_valuez DatabaseSchemaEditor.quote_value'   s    	MM%(E eT"s5z?"45u:s#EMM$777]y*=> UYY[((UTXY^T_`aa'  	'' 		s   C 	C-C-,C-c                    | j                   j                         5 }| j                   j                  j                  |      D ]y  }|r|j                  |k(  r| j                   j                  j                  ||j                        }|j                         D ]"  }|d   \  }}	||k(  s||	|k(  s  ddd       y { 	 ddd       y# 1 sw Y   yxY w)a  
        Return whether or not the provided table name is referenced by another
        one. If `column_name` is specified, only references pointing to that
        column are considered. If `ignore_self` is True, self-referential
        constraints are ignored.
        foreign_keyNTF)r   cursorintrospectionget_table_listname_get_foreign_key_constraintsvalues)
r   
table_namecolumn_nameignore_selfr5   other_tableconstraints
constraintconstraint_tableconstraint_columns
             r   _is_referenced_by_fk_constraintz4DatabaseSchemaEditor._is_referenced_by_fk_constraintC   s     __##% 		$#<<KKFS $;#3#3z#A"oo;;XXY_alaqaqr"-"4"4"6 $J:D]:S7$&7(J6(04E4T#		$ 		$
$	$		$ 		$ s   BC'C/C:CCc                 b   | j                   j                  j                  s}|r{| j                  |      rj| j                   j                  rt        d|z        | j                   j                          t        | !  |||       | j                   j                          y t        | !  |||       y )NzRenaming the %r table while in a transaction is not supported on SQLite < 3.26 because it would break referential integrity. Try adding `atomic = False` to the Migration class.)
r   features!supports_atomic_references_renamerC   in_atomic_blockr   r   r   alter_db_tabler   )r   modelold_db_tablenew_db_tabledisable_constraintsr   s        r   rH   z#DatabaseSchemaEditor.alter_db_tableV   s    ((JJ#(L(L\(Z..'U !	)! " "
 OO668G"5,EOO779G"5,Er   c                 L   |j                   }|j                  j                  }|j                         \  }}|j                   |k7  r| j                  j
                  j                  s| j                  ||d      rq| j                  j                  r&t        d|j                  j                  d|d      t        | j                  j                        5  t        | 5  ||||       | j                  j                         5 }	|	j                  d      j!                         d   }
|	j                  d	       d
|z  }|j                         d   }||z  }||z  }|	j                  d||f       |	j                  d|
dz   z         |	j                  d       |	j                  d       d d d        d d d        | j                  j                         5 }	|	j                  d       d d d        y t        | 5  ||||       y # 1 sw Y   ZxY w# 1 sw Y   ^xY w# 1 sw Y   y xY w)NT)r=   zRenaming the .z column while in a transaction is not supported on SQLite < 3.26 because it would break referential integrity. Try adding `atomic = False` to the Migration class.)strictzPRAGMA schema_versionr   zPRAGMA writable_schema = 1z REFERENCES "%s" ("%%s")    z3UPDATE sqlite_master SET sql = replace(sql, %s, %s)zPRAGMA schema_version = %dzPRAGMA writable_schema = 0zPRAGMA integrity_checkVACUUM)r8   _metadb_tableget_attname_columnr   rE   rF   rC   rG   r   r
   aliasr   alter_fieldr5   executefetchone)r   rI   	old_field	new_fieldrO   old_field_namer;   _old_column_namer5   schema_versionreferences_templatenew_column_namesearchreplacementr   s                  r   rV   z DatabaseSchemaEditor.alter_fielde   s   "[[))
&99;?NNn,OO,,NN44Z^b4c..' [[))>	); < <
 --. =#E9i#O __++- =%+^^4K%L%U%U%WXY%ZNNN#?@*E
*R'&/&B&B&DQ&GO0?BF"5"GKNN#X[acnZopNN#?>TUCU#VWNN#?@ NN#;<==* '') )Vx() ) Gy)FK'= == =*) )s1   .HB#H)HHH	HHH#c                     fd}j                   j                  D ci c]'  }|j                   ||      r|j                         n|) }}j                   j                  D ci c](  }|j                   j                  |j                        * }}i }	d}
t        |dd      s|rdt        |d   dd      rTt        |j                               D ]8  \  }}|j                  sd|_	        |}
|j                  s)||= ||j                  = : |rT|||j                  <   |j                  s9|j                  r- j                   j                  |            ||j                  <   |r|\  }}|j                  |j                  d       |j                  |j                  d       |||j                  <   |j                   r[|j                   sOd j                  |j                         j                   j                  |            dz  }|||j                  <   n( j                  |j                        ||j                  <   |j                  |	|j                  <   |ru||j                  = ||j                  = |j                  rO|j"                  j$                  j                   j                  r% j'                  |j"                  j$                        S t)               }j                   j*                  D cg c]"  }|D cg c]  }|	j-                  ||       c}$ }}}j                   j.                  D cg c]"  }|D cg c]  }|	j-                  ||       c}$ }}}j                   j0                  }|r'|D cg c]  }|j                  |j2                  vr| }}t        j                   j4                        }t7        j8                  |      }j                   j:                  j                   j<                  |||||d}t?        d	d
|      }||d	<   j@                  |d<   t?        j                   jB                  jD                  |       t7        j8                  |      }j                   j:                  dtG        j                   j<                        z  |||||d}t?        d	d
|      }||d	<   j@                  |d<   t?        dj                   jB                  z  jD                  |      } jI                  |        jK                  d j                  |j                   j<                        ddjM                   fd|D              ddjM                  |jO                               d j                  j                   j<                                j'                  d        jQ                  ||j                   j<                  j                   j<                  d        jR                  D ]  } jK                  |        g  _)        |
rd|
_	        yyc c}w c c}w c c}w c c}}w c c}w c c}}w c c}w )a|  
        Shortcut to transform a model from old_model into new_model

        This follows the correct procedure to perform non-rename or column
        addition operations based on SQLite's documentation

        https://www.sqlite.org/lang_altertable.html#caution

        The essential steps are:
          1. Create a table with the updated definition called "new__app_model"
          2. Copy the data from the existing "app_model" table to the new table
          3. Drop the "app_model" table
          4. Rename the "new__app_model" table to "app_model"
          5. Restore any index of the previous "app_model" table.
        c                 P    | j                   xr | j                  j                  u S r   )is_relationremote_fieldrI   )frI   s    r   is_self_referentialz?DatabaseSchemaEditor._remake_table.<locals>.is_self_referential   s!    ==BQ^^%9%9U%BBr   Nprimary_keyFrP   zcoalesce(%(col)s, %(default)s))coldefault)	app_labelrS   unique_togetherindex_togetherindexesr?   appsMeta 
__module__znew__%szNew%sINSERT INTO  (, c              3   @   K   | ]  }j                  |        y wr   )
quote_name).0xr   s     r   	<genexpr>z5DatabaseSchemaEditor._remake_table.<locals>.<genexpr>  s     :Qdooa(:s   	) SELECT  FROM )handle_autom2m)rL   T)*rR   local_concrete_fieldsr8   clonecolumnrx   getattrlistitemsri   auto_createdmany_to_manyconcreter2   effective_defaultpopnullrf   throughdelete_modelr   rm   getrn   ro   fieldsr?   copydeepcopyrl   rS   r0   rs   object_name	__bases__r   create_modelrW   joinr:   rH   deferred_sql)r   rI   create_fielddelete_fieldrV   rh   rg   bodymappingrename_mappingrestore_pk_fieldr8   fieldrY   rZ   case_sqlrp   uniquenrm   indexrn   ro   r?   	body_copymeta_contentsmeta	new_modelsqls   ``                           r   _remake_tablez"DatabaseSchemaEditor._remake_table   s   &	C
 [[66
 FF!4Q!7AGGIQ>
 
 AF@a@ab1188T__QXX66bb  <6Au M#DJJL1 2e$$(-E%',$)) J#ELL12 &2D""#,,1F1F/3/?/?**<80++, #. IyHHY^^T*KK	(($/#,D ~~inn;??9+;+;<#//0F0Fy0QR?  -5	((),0OOI<L<L,M	(()-6^^N9>>*\&&'++,((\-F-F-N-N-T-T-a-a(()B)B)J)JKKv  ++55
 066!^1%6
 
 33
 055!^1%5
 

 ++%%#*$$ELL8 G 
 5;;223
 MM$'	 ..,,.,&
 FB. 	&"'"2"2	,U[[$$eooyA MM$'	..!L1E1E$FF.,&
 FB. 	&"'"2"2	,5;;#:#::EOOYW	 	)$ 	OOIOO445II:'::IIgnn&'OOEKK001	
 	 	%6 	y//1E1E % 	 	
 $$ 	CLL	+/( ]
 cf 7
 6
sA   ,X&-X$2	X.;X)X.5	X9>X4X9;!X?)X.4X9c                    |rt         |   |       y | j                  | j                  d| j	                  |j
                  j                        iz         t        | j                        D ]T  }t        |t              s|j                  |j
                  j                        s:| j                  j                  |       V y )Ntable)r   r   rW   sql_delete_tablerx   rR   rS   r   r   r%   r   references_tableremove)r   rI   r~   r   r   s       r   r   z!DatabaseSchemaEditor.delete_model3  s    G ' LL..)=)=>2   D--. 2c9-#2F2Fu{{G[G[2\%%,,S12r   c                     |j                   rO|j                  j                  j                  j                  r%| j                  |j                  j                        S | j                  ||       y)z
        Create a field on a model. Usually involves adding a column, but may
        involve adding a table instead (for M2M fields).
        )r   N)r   rf   r   rR   r   r   r   r   rI   r   s      r   	add_fieldzDatabaseSchemaEditor.add_field@  sW     %"4"4"<"<"B"B"O"O$$U%7%7%?%?@@5u5r   c                 $   |j                   rQ|j                  j                  j                  j                  r&| j                  |j                  j                         yy|j                  | j                        d   y| j                  ||       y)z
        Remove a field from a model. Usually involves deleting a column,
        but for M2Ms may involve deleting a table.
        )r   r0   N)r   )	r   rf   r   rR   r   r   db_parametersr   r   r   s      r   remove_fieldz!DatabaseSchemaEditor.remove_fieldJ  s|     !!))//<<!!%"4"4"<"<= = ""doo">vFNu59r   c	                    | j                   j                  j                  r|j                  |j                  k7  r| j	                  ||      | j	                  ||      k(  rg|j
                  r|j                  sO|j
                  r|j                  s7| j                  | j                  |j                  j                  |||            S | j                  |||f       |j                  ri||k7  rbt               }	|j                  j                  }
|
j                  D ]  }|j                   |k(  r|j"                  s6|j$                  |j&                  k(  s9|	j)                  |j                          U|j*                  sb|j,                  j                  j.                  s|	j)                  |j,                          |j*                  rq|
j"                  D ]b  }|j                   |k(  r|j
                  j,                  j                  j.                  s>|	j)                  |j
                  j,                         d |	D ]  }| j                  |        yyy)z3Perform a "physical" (non-ManyToMany) field update.rV   N)r   rE   can_alter_table_rename_columnr   
column_sqlrf   db_constraintrW   _rename_field_sqlrR   rS   r   r   setrI   related_objectsrelated_modelr   
field_namer8   addri   r   r   )r   rI   rY   rZ   old_typenew_typeold_db_paramsnew_db_paramsrO   related_modelsoptsrf   r   r   s                 r   _alter_fieldz!DatabaseSchemaEditor._alter_field\  s   
 OO$$BB	 0 00OOE9-	1RR''I,C,C''I,C,C<< 6 6u{{7K7KYXack lmm5y).DEH 4 UN??((D $ 4 4 =--6#00#..)..@&**<+E+EF**|/C/C/I/I/V/V"&&|';';<= $$$($5$5 NL#11U: #0088>>KK&**<+D+D+L+LMN "0 2""=12' !5r   c                 P   |j                   j                  j                  j                  |j                   j                  j                  j                  k(  r| j	                  |j                   j                  |j                   j                  j                  j                  |j                               |j                   j                  j                  j                  |j                               f       y| j                  |j                   j                         | j                  d| j                  |j                   j                  j                  j                        ddj                  d|j                         |j                         g      ddj                  d|j                         |j                         g      d| j                  |j                   j                  j                  j                               | j                  |j                   j                         y)	z*Alter M2Ms to repoint their to= endpoints.r   Nrt   ru   rv   idr|   r}   )rf   r   rR   rS   r   	get_fieldm2m_reverse_field_namer   rW   rx   r   m2m_column_namem2m_reverse_namer   )r   rI   rY   rZ   rO   s        r   _alter_many_to_manyz(DatabaseSchemaEditor._alter_many_to_many  s   !!))//88I<R<R<Z<Z<`<`<i<ii&&.. **2288BB9CcCcCef**2288BB9CcCcCef	    	)00889OOI22::@@IIJII))+**, 
 II))+**, 
 OOI22::@@IIJ
 	 	)00889r   c                     t        |t              r|j                  rt        |   ||       y | j                  |       y r   )r%   r	   	conditionr   add_constraintr   r   rI   r@   r   s      r   r   z#DatabaseSchemaEditor.add_constraint  s3    j"23
8L8LG"5*5u%r   c                     t        |t              r|j                  rt        |   ||       y | j                  |       y r   )r%   r	   r   r   remove_constraintr   r   s      r   r   z&DatabaseSchemaEditor.remove_constraint  s3    j"23
8L8LG%eZ8u%r   )NF)T)F)NNN)__name__rs   __qualname__r   sql_create_fksql_create_inline_fksql_create_uniquesql_delete_uniquer   r   r2   rC   rH   rV   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      sy    -MbQ-#5
b8&F%LNe0N26:& ;@"2H!:F&& &r   r   )r   decimalr   django.apps.registryr   	django.dbr   django.db.backends.base.schemar   !django.db.backends.ddl_referencesr   django.db.backends.utilsr   django.db.modelsr	   django.db.transactionr
   r   rr   r   r   <module>r      s/      % ' C 7 1 - (`&3 `&r   