
    Evg)                     b    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
dS )    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|                    dd          z  S t          |t          t          t          f          rd|                                z  S t          |t                    r|rdndS t          |          S )Nz'%s''z''10)
isinstancedatetimedatetime	timedeltar   strreplacebytes	bytearray
memoryviewhexboolselfvalues     ]/var/www/pixelcanvas.ch/venv/lib/python3.11/site-packages/django/db/backends/oracle/schema.pyquote_valuez DatabaseSchemaEditor.quote_value   s    ehmX]H<MNOO 	E>!x122 		/6666s## 	EMM#t4444y*=>> 	EIIKK''t$$ 	(33S(u::    c                     |                      |j        j        |j                  r%|                     |j        j        |j                   t                                          ||           d S N)_is_identity_column_metadb_tablecolumn_drop_identitysuperremove_field)r   modelfield	__class__s      r   r'   z!DatabaseSchemaEditor.remove_field+   sb     ##EK$8%,GG 	D 4elCCCUE*****r   c                     t                                          |           |                     dd| j        j                            |j        j                  iz             d S )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   sn    U###
 4?.NNK( 	
 	
 	
 	
 	
r   Fc                    	 t                                          ||||           d S # t          $ r4}t          |          }d|v sd|v r|                     |||           nd|v r>|                     |j        j        |j                   |                     ||||           nd|v r6|j	        r/| 
                    |d           |                     |||           nxd|v rg|j	        r`| 
                    |d           |                     ||||           |j	        r)|                     |                     ||                     n Y d }~d S Y d }~d S Y d }~d S Y d }~d S 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   s   	GGy)VDDDDD 	 	 	a&&K k))[K-G-G11%INNNN ++##EK$8):JKKK  	9fEEEE ++	0E+((t(<<<11%INNNN ++	0E+((t(<<<  	9fEEE( QLL!=!=eY!O!OPPP) ONNNNN
 FEEEEE
 ONNNNN      	s   $) E(DE##E(c                 Z   t          j        |          }|                                dv|_        |                     |j                  |_        |                     ||           |                     |j                  }|                    | j	                  }t          j        d|          rd|z  }d}t          j        d|          r<|                                }|dk    rd|z  }n|dk    rd	|z  }n|d
k    r
d|z  }d	|z  }|                     d|                     |j        j                  d|                     |j                  d|           |                     ||           t!                                          |||           |                    | j	                  }|j        r|j        s|j        re|j        r`||k    rVt)          ||          D ]K\  }	}
|
j        j        r4|                     |                     |
j        |
j        d                     FdS dS dS dS )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1'99;; D
 

 !% 8 89I J Jun--- OOI$455	$$T_558Ix(( 	"%	1I!H8M8,, 		W ) ; ; = = K//7)C		"o55JYV		"k117)C	JYV	  45555 56666			
 	
 	
 	%+++E>9=== $$T_55"	'0'<	 	%.%5	 (""2>9MM  39* LL++C,=sy%PP   #"	 	 	 	 r   c                 D   h d}|                                 |v r`|                                 |vrJ|                     |j        j        |j                  r%|                     |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JJ ''))-===++--5EEE(()=y?OPP F  4i6FGGGww--9i=-
 
 	
r   c                 t    |                      |          }|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   s@    
 __T""a5C<<BrFcMMAbDB	r   c                     t          t          |                                                    dd         }|                     |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   sG    T(^^$$**,,QRR0""8c>F#:;;;r   c                 ,    |                      |          S r    )r   r   s     r   prepare_defaultz$DatabaseSchemaEditor.prepare_default   s    &&&r   c                     t                                          ||          }|                    | j                  }|"|                                | j        j        v rdS |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   sX    ww77uEE--004?#FFF5r   c                 $   | j                                         5 }|                    d|                     |          |                     |          g           |                                }|r|d         ndcd d d            S # 1 swxY w Y   d S )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   s    _##%% 	,NN $$Z00$2E2Ek2R2RS	 	 	 //##C +3q66e	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	, 	,s   ABB	B	c                     |                      d|                     |          |                     |          dz             d S )Nz5ALTER TABLE %(table)s MODIFY %(column)s DROP IDENTITY)tabler$   )r.   rM   )r   rx   ry   s      r   r%   z#DatabaseSchemaEditor._drop_identity   sR    C44//+66 	
 	
 	
 	
 	
r   c                     | j                                         5 }|                    d|                     |          g           |                                d         cd d d            S # 1 swxY w Y   d S )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   s    _##%% 	(NN $$Z001	   ??$$Q'	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	( 	(s   AA++A/2A/Nc                 |    |||                      |          }t                                          |||          S r    )r~   r&   _collate_sql)r   	collationr^   rx   r*   s       r   r   z!DatabaseSchemaEditor._collate_sql   s=    !:33J??Iww##I}jI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 A A A AF
 
 
 
 
  < < <
' ' '    , , ,
 
 
( ( (J J J J J J J J 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 5 5 5 5 5mJ mJ mJ mJ mJ3 mJ mJ mJ mJ mJr   