
 X                 @   s   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	 d  d l
 m Z Gd d   d e  Z d S)    N)BaseDatabaseSchemaEditor)DatabaseError)six)
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 d   f d d  Z   f d d   Z 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)sz(DROP TABLE %(table)s CASCADE CONSTRAINTSc             C   s   t  | t j t j t j f  r) d | St  | t j  rX d t j |  j d d  St  | t j  r d t	 t
 j |   St  | t  r | r d Sd St |  Sd  S)Nz'%s''z''10)
isinstancedatetimedatetimer   string_types	text_typereplaceZbuffer_typesr   binasciihexlifyboolstr)selfvalue r   N/home/ubuntu/projects/ifolica/build/django/django/db/backends/oracle/schema.pyquote_value   s    !z DatabaseSchemaEditor.quote_valuec                sG   t  t |   j |  |  j d i |  j j j | j j  d 6 d  S)Nab  
            DECLARE
                i INTEGER;
            BEGIN
                SELECT COUNT(*) INTO i FROM USER_CATALOG
                    WHERE TABLE_NAME = '%(sq_name)s' AND TABLE_TYPE = 'SEQUENCE';
                IF i = 1 THEN
                    EXECUTE IMMEDIATE 'DROP SEQUENCE "%(sq_name)s"';
                END IF;
            END;
        /Zsq_name)	superr   delete_modelexecute
connectionopsZ_get_sequence_name_metadb_table)r   model)	__class__r   r   r   #   s    
z!DatabaseSchemaEditor.delete_modelFc                s   y# t  t |   j | | | |  Wnb t k
 r } zB t |  } d | k s\ d | k rr |  j | | |  n   WYd  d  } ~ Xn Xd  S)Nz	ORA-22858z	ORA-22859)r   r   alter_fieldr   r   _alter_field_type_workaround)r   r!   	old_field	new_fieldstrictedescription)r"   r   r   r#   3   s    #z DatabaseSchemaEditor.alter_fieldc                sW  t  j |  } d | _ |  j | j  | _ |  j | |  |  j | j  } | j |  j  } t	 j
 d |  r d | } d } n  t	 j
 d |  r | j   } | d k r d | } q | d k r d	 | } q | d
 k r d | } q n  |  j d |  j | j j  |  j | j  | f  |  j | |  t 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
        - Update the table to transfer values from old to new
        - Drop old column
        - Rename the new column and possibly drop the nullable property
        Tz^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deepcopynull_generate_temp_namecolumnZ	add_field
quote_nameZdb_typer   rematchZget_internal_typer   r   r    Zremove_fieldr   r   r#   )r   r!   r%   r&   Znew_temp_fieldZ	new_valueZold_typeZnew_internal_type)r"   r   r   r$   ?   s.    	
		z1DatabaseSchemaEditor._alter_field_type_workaroundc             C   sF   |  j  |  } | d d k rB | d d k rB | d d  } n  | S)z
        Get the properly shortened and uppercased identifier as returned by
        quote_name(), but without the actual quotes.
        r   "   r4   )r/   )r   namennr   r   r   normalize_namej   s     z#DatabaseSchemaEditor.normalize_namec             C   s7   t  t |   j   d d  } |  j | d |  S)zR
        Generates temporary names for workarounds that need temp columns
        r3   N_)hexhashupperr7   )r   Zfor_namesuffixr   r   r   r-   t   s    "z(DatabaseSchemaEditor._generate_temp_namec             C   s   |  j  |  S)N)r   )r   r   r   r   r   prepare_default{   s    z$DatabaseSchemaEditor.prepare_default)__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$   r7   r-   r=   r   r   )r"   r   r      s   +
r   )r   r*   r   r0   Zdjango.db.backends.base.schemar   Zdjango.db.utilsr   Zdjango.utilsr   Zdjango.utils.textr   r   r   r   r   r   <module>   s   