
v^                 @   s^   d  d l  Z  d  d l Z d  d l Z d  d l m Z d  d l m Z Gd 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
 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   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)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             C   s   t  | t j t j t j f  r) d | St  | t  rX d | j d d  j d d  St  | t t t f  r~ d | j	   St  | t
  r | r d Sd St |  Sd  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-8lau8j11/django/django/db/backends/oracle/schema.pyquote_value   s    ! z DatabaseSchemaEditor.quote_valuec                sK   |  j  | j j | j  r4 |  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                s@   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 | | | |  Wn t k
 r } z t |  } d | k sV d | k rl |  j | | |  n d | k r |  j | j j | j  |  j | | | |  nA d | k r | j	 r |  j
 | d d |  j | | |  n   WYd  d  } ~ Xn Xd  S)Nz	ORA-22858z	ORA-22859z	ORA-30675z	ORA-30673strictT)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                sT  t  j |  } | j   d k | _ |  j | j  | _ |  j | |  |  j | j  } | j |  j	  } t
 j d |  r d | } d } t
 j d |  r | j   } | d k r d	 | } n/ | d
 k r d | } n | d k r d | } |  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BigAutoFieldSmallAutoFieldz^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/   r0   )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   sC   |  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;   )r5   )r   namennr   r   r   normalize_name}   s     z#DatabaseSchemaEditor.normalize_namec             C   s7   t  t |   j   d d  } |  j | d |  S)z@Generate temporary names for workarounds that need temp columns.r:   N_)r   hashupperr>   )r   Zfor_namesuffixr   r   r   r4      s    "z(DatabaseSchemaEditor._generate_temp_namec             C   s   |  j  |  S)N)r   )r   r   r   r   r   prepare_default   s    z$DatabaseSchemaEditor.prepare_defaultc                sS   t    j | |  } | j |  j  } | d  k	 rO | j   |  j j k rO d S| S)NF)r   _field_should_be_indexedr6   r%   lowerZ_limited_data_types)r   r    r!   Zcreate_indexr6   )r"   r   r   rD      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   rF      s    z,DatabaseSchemaEditor._unique_should_be_addedc             C   sc   |  j  j   M } | j d |  j |  |  j |  g  | j   } | rT | d Sd SWd  QRXd  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_namerG   rowr   r   r   r      s
    "z(DatabaseSchemaEditor._is_identity_columnc             C   s3   |  j  d d |  j |  d |  j |  i  d  S)Nz5ALTER TABLE %(table)s MODIFY %(column)s DROP IDENTITYtabler   )r$   r5   )r   rH   rI   r   r   r   r      s    	z#DatabaseSchemaEditor._drop_identity)__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_create_column_inline_fkZsql_delete_tableZsql_create_indexr   r   r#   r(   r)   r>   r4   rC   rD   rF   r   r   r   r   )r"   r   r   	   s,   .
r   )r1   r
   r7   Zdjango.db.backends.base.schemar   Zdjango.db.utilsr   r   r   r   r   r   <module>   s
   