B
    ©0H[¾  ć               @   sX   d dl Z 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	 G dd deZ
dS )é    N)ŚBaseDatabaseSchemaEditor)ŚDatabaseError)Ś
force_textc                   s   e Zd ZdZdZdZdZdZdZdZ	dZ
d	d
 Z fddZ fddZd  fdd	Z fddZdd Zdd Zdd Z fddZdd Zdd Z  ZS )!ŚDatabaseSchemaEditorz3ALTER TABLE %(table)s ADD %(column)s %(definition)szMODIFY %(column)s %(type)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)sz(DROP TABLE %(table)s CASCADE CONSTRAINTSc             C   s|   t |tjtjtjfrd| S t |tr8d| dd” S t |tttfrZdt	t
 |” S t |trp|rldS dS t|S d S )Nz'%s'ś'z''Ś1Ś0)Ś
isinstanceŚdatetimeŚdateŚtimeŚstrŚreplaceŚbytesŚ	bytearrayŚ
memoryviewr   ŚbinasciiŚhexlifyŚbool)ŚselfŚvalue© r   śdC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\db\backends\oracle\schema.pyŚquote_value   s    

z DatabaseSchemaEditor.quote_valuec                s6   |   |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__r   r   r    "   s    z!DatabaseSchemaEditor.remove_fieldc                s0   t   |” |  dd| jj |jj”i ” 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;
        /Zsq_name)r   Śdelete_modelŚexecuteŚ
connectionŚopsZ_get_no_autofield_sequence_namer   r   )r   r!   )r#   r   r   r$   )   s    
z!DatabaseSchemaEditor.delete_modelFc          
      sĄ   yt   ||||” W n¤ tk
rŗ } zt|}d|ks@d|krP|  |||” nZd|kr||  |jj|j” |  ||||” n.d|krØ|j	rØ| j
|dd |  |||” n W d d }~X Y nX d S )Nz	ORA-22858z	ORA-22859z	ORA-30675z	ORA-30673T)Śstrict)r   Śalter_fieldr   r   Ś_alter_field_type_workaroundr   r   r   r   Zprimary_keyZ_delete_primary_key)r   r!   Ś	old_fieldŚ	new_fieldr(   ŚeŚdescription)r#   r   r   r)   9   s    z DatabaseSchemaEditor.alter_fieldc                sš   t  |”}| ” dk|_|  |j”|_|  ||” |  |j”}| | j	”}t
 d|”rbd| }d}t
 d|”rŖ| ” }|dkrd| }n"|dkrd	| }n|d
krŖd| }|  d|  |jj”|  |j”|f ” |  ||” t  |||” 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
        )Z	AutoFieldZBigAutoFieldz^N?CLOBzTO_CHAR(%s)ZVARCHAR2z^N?VARCHAR2Z	DateFieldzTO_DATE(%s, 'YYYY-MM-DD')ZDateTimeFieldz,TO_TIMESTAMP(%s, 'YYYY-MM-DD HH24:MI:SS.FF')Z	TimeFieldzCTO_TIMESTAMP(CONCAT('1900-01-01 ', %s), 'YYYY-MM-DD HH24:MI:SS.FF')zUPDATE %s set %s=%sN)ŚcopyŚdeepcopyZget_internal_typeŚnullŚ_generate_temp_namer   Z	add_fieldŚ
quote_nameŚdb_typer&   ŚreŚmatchr%   r   r   r    r   r)   )r   r!   r+   r,   Znew_temp_fieldZ	new_valueZold_typeZnew_internal_type)r#   r   r   r*   O   s.    




z1DatabaseSchemaEditor._alter_field_type_workaroundc             C   s2   |   |”}|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   ś"é’’’’é   )r3   )r   ŚnameŚnnr   r   r   Śnormalize_name|   s    
z#DatabaseSchemaEditor.normalize_namec             C   s*   t t| ” dd }|  |d | ”S )z@Generate temporary names for workarounds that need temp columns.r9   NŚ_)ŚhexŚhashŚupperr<   )r   Zfor_nameŚsuffixr   r   r   r2      s    z(DatabaseSchemaEditor._generate_temp_namec             C   s
   |   |”S )N)r   )r   r   r   r   r   Śprepare_default   s    z$DatabaseSchemaEditor.prepare_defaultc                s:   t   ||”}| | j”}|d k	r6| ” | jjkr6dS |S )NF)r   Ś_field_should_be_indexedr4   r&   ŚlowerZ_limited_data_types)r   r!   r"   Zcreate_indexr4   )r#   r   r   rC      s
    z-DatabaseSchemaEditor._field_should_be_indexedc          	   C   sJ   | j  ” 6}| d|  |”|  |”g” | ” }|r<|d S dS Q R X 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%   r<   Zfetchone)r   Ś
table_nameŚcolumn_namerE   Śrowr   r   r   r      s
    z(DatabaseSchemaEditor._is_identity_columnc             C   s$   |   d|  |”|  |”d ” d S )Nz5ALTER TABLE %(table)s MODIFY %(column)s DROP IDENTITY)Śtabler   )r%   r3   )r   rF   rG   r   r   r   r   ”   s    z#DatabaseSchemaEditor._drop_identity)F)Ś__name__Ś
__module__Ś__qualname__Zsql_create_columnZsql_alter_column_typeZsql_alter_column_nullZsql_alter_column_not_nullZsql_alter_column_defaultZsql_alter_column_no_defaultZsql_delete_columnZsql_delete_tabler   r    r$   r)   r*   r<   r2   rB   rC   r   r   Ś__classcell__r   r   )r#   r   r      s&   -
r   )r   r/   r
   r5   Zdjango.db.backends.base.schemar   Zdjango.db.utilsr   Zdjango.utils.encodingr   r   r   r   r   r   Ś<module>   s   