
    g)                     Z    d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	  G d de      Z
y)    N)DatabaseError)BaseDatabaseSchemaEditor_related_non_m2m_objects)duration_iso_stringc                        e Zd ZdZdZdZdZdZdZeZ	dZ
dZd	Zd
Zd Z fdZ fdZd fd	Z fdZ fdZd Zd Zd Z fdZd Zd Zd Zd fd	Z xZS )DatabaseSchemaEditorz3ALTER TABLE %(table)s ADD %(column)s %(definition)sz'MODIFY %(column)s %(type)s%(collation)szMODIFY %(column)s NULLzMODIFY %(column)s NOT NULLz%MODIFY %(column)s DEFAULT %(default)szMODIFY %(column)s DEFAULT NULLz,ALTER TABLE %(table)s DROP COLUMN %(column)szHCONSTRAINT %(name)s REFERENCES %(to_table)s(%(to_column)s)%(deferrable)sz(DROP TABLE %(table)s CASCADE CONSTRAINTSz9CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)sc                    t        |t        j                  t        j                  t        j                  f      rd|z  S t        |t        j                        rdt        |      z  S t        |t              rd|j                  dd      z  S t        |t        t        t        f      rd|j                         z  S t        |t              r|rdS dS t        |      S )Nz'%s''z''10)
isinstancedatetimedatetime	timedeltar   strreplacebytes	bytearray
memoryviewhexboolselfvalues     x/var/www/python.vincentserveurtest.ovh/public_html/venv/lib/python3.12/site-packages/django/db/backends/oracle/schema.pyquote_valuez DatabaseSchemaEditor.quote_value   s    ehmmX]]H<M<MNOE>!x112/666s#EMM#t444y*=>EIIK''t$3(S(u:    c                     | j                  |j                  j                  |j                        r0| j	                  |j                  j                  |j                         t
        |   ||       y N)_is_identity_column_metadb_tablecolumn_drop_identitysuperremove_field)r   modelfield	__class__s      r   r'   z!DatabaseSchemaEditor.remove_field+   sP     ##EKK$8$8%,,G 4 4ellCUE*r   c                     t         |   |       | j                  dd| j                  j                  j                  |j                  j                        iz         y )NaK  
            DECLARE
                i INTEGER;
            BEGIN
                SELECT COUNT(1) INTO i FROM USER_SEQUENCES
                    WHERE SEQUENCE_NAME = '%(sq_name)s';
                IF i = 1 THEN
                    EXECUTE IMMEDIATE 'DROP SEQUENCE "%(sq_name)s"';
                END IF;
            END;
        /sq_name)r&   delete_modelexecute
connectionops_get_no_autofield_sequence_namer"   r#   )r   r(   r*   s     r   r-   z!DatabaseSchemaEditor.delete_model2   sT    U#
 4??..NNKK((	
r   c                    	 t         |   ||||       y # t        $ r+}t        |      }d|v sd|v r| j	                  |||       nd|v rE| j                  |j                  j                  |j                         | j                  ||||       nd|v r3|j                  r'| j                  |d       | j	                  |||       npd|v ra|j                  rU| j                  |d       | j                  ||||       |j                  r(| j                  | j                  ||             n Y d }~y Y d }~y Y d }~y Y d }~y Y d }~y d }~ww xY w)Nz	ORA-22858z	ORA-22859z	ORA-30675z	ORA-30673T)strictz	ORA-43923)r&   alter_fieldr   r   _alter_field_type_workaroundr%   r"   r#   r$   primary_key_delete_primary_keyr.   _create_primary_key_sql)r   r(   	old_field	new_fieldr3   edescriptionr*   s          r   r4   z DatabaseSchemaEditor.alter_fieldI   sG   	Gy)VD 	a&K k)[K-G11%IN +##EKK$8$8):J:JK  	9fE +	0E0E((t(<11%IN +	0E0E((t(<  	9fE((LL!=!=eY!OP Q ) O F O	s    
EDEEc                 X   t        j                  |      }|j                         dv|_        | j	                  |j
                        |_        | j                  ||       | j                  |j
                        }|j                  | j                        }t        j                  d|      rd|z  }d}t        j                  d|      r5|j                         }|dk(  rd|z  }n|dk(  rd	|z  }n|d
k(  r
d|z  }d	|z  }| j                  d| j                  |j                  j                        d| j                  |j
                        d|       | j                  ||       t         | E  |||       |j                  | j                        }|j$                  r|j$                  s|j&                  ru|j&                  rh||k7  rbt)        ||      D ]R  \  }	}
|
j*                  j,                  s| j                  | j/                  |
j0                  |
j*                  d             T yyyy)a  
        Oracle refuses to change from some type to other type.
        What we need to do instead is:
        - Add a nullable version of the desired field with a temporary name. If
          the new column is an auto field, then the temporary column can't be
          nullable.
        - Update the table to transfer values from old to new
        - Drop old column
        - Rename the new column and possibly drop the nullable property
        )	AutoFieldBigAutoFieldSmallAutoFieldz^N?CLOBzTO_CHAR(%s)VARCHAR2z^N?VARCHAR2	DateFieldzTO_DATE(%s, 'YYYY-MM-DD')DateTimeFieldz,TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS.FF')	TimeFieldzCONCAT('1900-01-01 ', %s)zUPDATE z set =_fkN)copydeepcopyget_internal_typenull_generate_temp_namer$   	add_field
quote_namedb_typer/   rematchr.   r"   r#   r'   r&   r4   r6   uniquer   r)   db_constraint_create_fk_sqlrelated_model)r   r(   r9   r:   new_temp_field	new_valueold_typenew_internal_typenew_type_relr*   s              r   r5   z1DatabaseSchemaEditor._alter_field_type_workaroundg   s    y1'99; D
 

 !% 8 89I9I Jun- OOI$4$45	$$T__588Ix(%	1I!H88M8, ) ; ; = K/7)C	"o5JYV	"k17)C	JYV	  4 45 5 56		
 	%+E>9= $$T__5""y'<'<  Y%5%5("2>9M399**LL++C,=,=syy%P N # &6 r   c                 <   h d}|j                         |v rr|j                         |vr`| j                  |j                  j                  |j                        r0| j                  |j                  j                  |j                         t        |   ||||||      S )N>   r>   r?   r@   )rI   r!   r"   r#   r$   r%   r&   _alter_column_type_sql)	r   r(   r9   r:   rY   old_collationnew_collationauto_field_typesr*   s	           r   r]   z+DatabaseSchemaEditor._alter_column_type_sql   s     K '')-==++-5EE(()=)=y?O?OP 4 4i6F6FGw-9i=-
 	
r   c                 R    | j                  |      }|d   dk(  r|d   dk(  r|dd }|S )z
        Get the properly shortened and uppercased identifier as returned by
        quote_name() but without the quotes.
        r   "   )rM   )r   namenns      r   normalize_namez#DatabaseSchemaEditor.normalize_name   s7    
 __T"a5C<BrFcMAbB	r   c                 z    t        t        |            j                         dd }| j                  |dz   |z         S )z@Generate temporary names for workarounds that need temp columns.rd   NrZ   )r   hashupperrg   )r   for_namesuffixs      r   rK   z(DatabaseSchemaEditor._generate_temp_name   s:    T(^$**,QR0""8c>F#:;;r   c                 $    | j                  |      S r    )r   r   s     r   prepare_defaultz$DatabaseSchemaEditor.prepare_default   s    &&r   c                     t         |   ||      }|j                  | j                        }|'|j	                         | j                  j
                  v ry|S )NF)r&   _field_should_be_indexedrN   r/   lower_limited_data_types)r   r(   r)   create_indexrN   r*   s        r   rp   z-DatabaseSchemaEditor._field_should_be_indexed   sM    w7uE--04??#F#FFr   c                     | j                   j                         5 }|j                  d| j                  |      | j                  |      g       |j	                         }|r|d   ndcd d d        S # 1 sw Y   y xY w)Nz
                SELECT
                    CASE WHEN identity_column = 'YES' THEN 1 ELSE 0 END
                FROM user_tab_cols
                WHERE table_name = %s AND
                      column_name = %s
                r   Fr/   cursorr.   rg   fetchone)r   
table_namecolumn_namerv   rows        r   r!   z(DatabaseSchemaEditor._is_identity_column   sj    __##%NN $$Z0$2E2Ek2RS	 //#C 3q6e &%%s   AA00A9c                 n    | j                  d| j                  |      | j                  |      dz         y )Nz5ALTER TABLE %(table)s MODIFY %(column)s DROP IDENTITY)tabler$   )r.   rM   )r   rx   ry   s      r   r%   z#DatabaseSchemaEditor._drop_identity   s3    C4//+6	
r   c                     | j                   j                         5 }|j                  d| j                  |      g       |j	                         d   cd d d        S # 1 sw Y   y xY w)Nza
                SELECT default_collation FROM user_tables WHERE table_name = %s
                r   ru   )r   rx   rv   s      r   _get_default_collationz+DatabaseSchemaEditor._get_default_collation   sU    __##%NN $$Z01	 ??$Q' &%%s   5AA#c                 P    ||| j                  |      }t        | 	  |||      S r    )r~   r&   _collate_sql)r   	collationr^   rx   r*   s       r   r   z!DatabaseSchemaEditor._collate_sql   s2    !:33J?Iw#I}jIIr   )F)NN)__name__
__module____qualname__sql_create_columnsql_alter_column_typesql_alter_column_nullsql_alter_column_not_nullsql_alter_column_defaultsql_alter_column_no_default sql_alter_column_no_default_nullsql_delete_columnsql_create_column_inline_fksql_delete_tablesql_create_indexr   r'   r-   r4   r5   r]   rg   rK   rn   rp   r!   r%   r~   r   __classcell__)r*   s   @r   r   r      s    ME4 <F"B'B$FR   BR+
.<AF
<
',
(J Jr   r   )rG   r   rO   	django.dbr   django.db.backends.base.schemar   r   django.utils.durationr   r    r   r   <module>r      s,      	 # 6mJ3 mJr   