3
7^                 @   sD   d dl Z d dlZd dlZd dlmZ d dlmZ G dd deZdS )    N)BaseDatabaseSchemaEditor)DatabaseErrorc                   s   e Zd 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 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 CONSTRAINTSz9CREATE INDEX %(name)s ON %(table)s (%(columns)s)%(extra)sc             C   s~   t |tjtjtjfrd| S t |tr@d|jddjdd S t |tttfr\d|j	  S t |t
rr|rndS dS t|S d S )Nz'%s''z''%z%%10)
isinstancedatetimedatetimestrreplacebytes	bytearray
memoryviewhexbool)selfvalue r   B/tmp/pip-build-8app2_gc/Django/django/db/backends/oracle/schema.pyquote_value   s    

z DatabaseSchemaEditor.quote_valuec                s6   | j |jj|jr$| j|jj|j t j|| 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  j| | jdd| j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  j|||| W n tk
r } zt|}d|ks@d|krP| j||| nZd|kr|| j|jj|j | j|||| n.d|kr|j	r| j
|dd | j||| n W Y d d }~X 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(   8   s    z DatabaseSchemaEditor.alter_fieldc                s   t j|}|j dk|_| j|j|_| j|| | j|j}|j| j	}t
jd|rbd| }d}t
jd|r|j }|dkrd| }n"|d	krd
| }n|dkrd| }| jd| j|jj| j|j|f  | j|| t j||| 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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)r.   r/   )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)   N   s.    




z1DatabaseSchemaEditor._alter_field_type_workaroundc             C   s2   | 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   "   r:   )r4   )r   namennr   r   r   normalize_name|   s    
z#DatabaseSchemaEditor.normalize_namec             C   s*   t t|j dd }| j|d | S )z@Generate temporary names for workarounds that need temp columns.r9   N_)r   hashupperr=   )r   Zfor_namesuffixr   r   r   r3      s    z(DatabaseSchemaEditor._generate_temp_namec             C   s
   | j |S )N)r   )r   r   r   r   r   prepare_default   s    z$DatabaseSchemaEditor.prepare_defaultc                s:   t  j||}|j| j}|d k	r6|j | jjkr6dS |S )NF)r   _field_should_be_indexedr5   r%   lowerZ_limited_data_types)r   r    r!   Zcreate_indexr5   )r"   r   r   rC      s
    z-DatabaseSchemaEditor._field_should_be_indexedc                s   t  j||o| j|| S )N)r   _unique_should_be_addedZ_field_became_primary_key)r   r*   r+   )r"   r   r   rE      s    z,DatabaseSchemaEditor._unique_should_be_addedc             C   sJ   | j j 6}|jd| j|| j|g |j }|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_namerF   rowr   r   r   r      s
    z(DatabaseSchemaEditor._is_identity_columnc             C   s$   | j d| j|| j|d  d S )Nz5ALTER TABLE %(table)s MODIFY %(column)s DROP IDENTITY)tabler   )r$   r4   )r   rG   rH   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_tableZsql_create_indexr   r   r#   r(   r)   r=   r3   rB   rC   rE   r   r   __classcell__r   r   )r"   r   r   	   s*   .
r   )r0   r
   r6   Zdjango.db.backends.base.schemar   Zdjango.db.utilsr   r   r   r   r   r   <module>   s
   