
 X,                 @   sR   d  d l  Z  d  d l m Z m Z m Z d  d l m Z Gd d   d e  Z d S)    N)BaseDatabaseIntrospection	FieldInfo	TableInfo)
force_textc                   s*  e  Z d  Z i d e j 6d e j 6d e j 6d e j 6d e j 6d e j	 6d e j
 6d e j 6Z y d e e j <Wn e k
 r Yn Xy d e e j <Wn e k
 r Yn Xd Z   f d	 d
   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z d d   Z   S)DatabaseIntrospectionZBinaryFieldZ	TextFieldZ	DateFieldZ	CharFieldZDecimalFieldZDateTimeField
FloatField   c                s   | t  j k rk | d d  \ } } | d k rX | d k rA d S| d k rQ d Sd Sqk | d k rk d
 Sn  t t |   j | |  S)N      r      ZBigIntegerFieldr   ZBooleanFieldZIntegerField   r   i)	cx_OracleNUMBERsuperr   get_field_type)selfZ	data_typedescriptionZ	precisionZscale)	__class__ U/home/ubuntu/projects/ifolica/build/django/django/db/backends/oracle/introspection.pyr   "   s    z$DatabaseIntrospection.get_field_typec             C   s$   | j  d  d d   | j   D S)zQ
        Returns a list of table and view names in the current database.
        zWSELECT TABLE_NAME, 't' FROM USER_TABLES UNION ALL SELECT VIEW_NAME, 'v' FROM USER_VIEWSc             S   s-   g  |  ]# } t  | d  j   | d   q S)r   r   )r   lower).0rowr   r   r   
<listcomp>8   s   	 z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   r   r   get_table_list2   s    z$DatabaseIntrospection.get_table_listc             C   s   |  j  d 7_  | j d j |  j j j |  |  j    g  } xU | j D]J } t | d  } | i  } | j t	 | j
   f | d d     qJ W| S)zQReturns a description of the table, with the DB-API cursor.description interface.r   z,SELECT * FROM {} WHERE ROWNUM < 2 AND {} > 0r   N)cache_bust_counterr   format
connectionopsZ
quote_namer   r   appendr   r   )r   r   
table_namer   descnamer   r   r   get_table_description:   s    
.z+DatabaseIntrospection.get_table_descriptionc             C   s
   | j    S)z6Table name comparison is case insensitive under Oracle)r   )r   r%   r   r   r   table_name_converterG   s    z*DatabaseIntrospection.table_name_converterc             C   s#   d d   t  |  j | |   D S)zu
        Returns a dictionary of {field_name: field_index} for the given table.
        Indexes are 0-based.
        c             S   s#   i  |  ] \ } } | | d   q S)r   r   )r   idr   r   r   
<dictcomp>P   s   	 z8DatabaseIntrospection._name_to_index.<locals>.<dictcomp>)	enumerater&   )r   r   r#   r   r   r   _name_to_indexK   s    z$DatabaseIntrospection._name_to_indexc             C   sn   | j    } | j d | g  i  } xB | j   D]4 } | d j   | d j   f | | d j   <q2 W| S)z
        Returns a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        a  
    SELECT ta.column_name, tb.table_name, tb.column_name
    FROM   user_constraints, USER_CONS_COLUMNS ca, USER_CONS_COLUMNS cb,
           user_tab_cols ta, user_tab_cols tb
    WHERE  user_constraints.table_name = %s AND
           ta.table_name = user_constraints.table_name AND
           ta.column_name = ca.column_name AND
           ca.table_name = ta.table_name AND
           user_constraints.constraint_name = ca.constraint_name AND
           user_constraints.r_constraint_name = cb.constraint_name AND
           cb.table_name = tb.table_name AND
           cb.column_name = tb.column_name AND
           ca.position = cb.position   r   r   )upperr   r   r   )r   r   r#   Z	relationsr   r   r   r   get_relationsR   s    2z#DatabaseIntrospection.get_relationsc             C   s0   | j  d | j   g  d d   | j   D S)Na  
            SELECT ccol.column_name, rcol.table_name AS referenced_table, rcol.column_name AS referenced_column
            FROM user_constraints c
            JOIN user_cons_columns ccol
              ON ccol.constraint_name = c.constraint_name
            JOIN user_cons_columns rcol
              ON rcol.constraint_name = c.r_constraint_name
            WHERE c.table_name = %s AND c.constraint_type = 'R'c             S   s)   g  |  ] } t  d  d   | D   q S)c             s   s   |  ] } | j    Vq d  S)N)r   )r   Zcellr   r   r   	<genexpr>t   s    zCDatabaseIntrospection.get_key_columns.<locals>.<listcomp>.<genexpr>)tuple)r   r   r   r   r   r   t   s   	z9DatabaseIntrospection.get_key_columns.<locals>.<listcomp>)r   r.   r   )r   r   r#   r   r   r   get_key_columnsk   s    	z%DatabaseIntrospection.get_key_columnsc             C   sj   d } | j  | | g  i  } xD | j   D]6 } i t | d  d 6t | d  d 6| | d <q, W| S)NaZ  
    SELECT LOWER(uic1.column_name) AS column_name,
           CASE user_constraints.constraint_type
               WHEN 'P' THEN 1 ELSE 0
           END AS is_primary_key,
           CASE user_indexes.uniqueness
               WHEN 'UNIQUE' THEN 1 ELSE 0
           END AS is_unique
    FROM   user_constraints, user_indexes, user_ind_columns uic1
    WHERE  user_constraints.constraint_type (+) = 'P'
      AND  user_constraints.index_name (+) = uic1.index_name
      AND  user_indexes.uniqueness (+) = 'UNIQUE'
      AND  user_indexes.index_name (+) = uic1.index_name
      AND  uic1.table_name = UPPER(%s)
      AND  uic1.column_position = 1
      AND  NOT EXISTS (
              SELECT 1
              FROM   user_ind_columns uic2
              WHERE  uic2.index_name = uic1.index_name
                AND  uic2.column_position = 2
           )
        r   primary_keyr-   uniquer   )r   r   bool)r   r   r#   Zsqlindexesr   r   r   r   get_indexesw   s     z!DatabaseIntrospection.get_indexesc             C   s?  i  } | j  d | g  x{ | j   D]m \ } } } } } | | k r~ i g  d 6| d 6| d 6d d 6| d 6d d	 6| | <n  | | d j |  q& W| j  d
 | g  xr | j   D]d \ } } | | k ri g  d 6d d 6d d 6d d 6d d 6d d	 6| | <n  | | d j |  q W| j  d | g  x~ | j   D]p \ } } }	 }
 | | k ri g  d 6d d 6d d 6|	 |
 f d 6d d 6d d	 6| | <n  | | d j |  q?W| j  d | g  xr | j   D]d \ } } | | k r"i g  d 6d d 6d d 6d d 6d d 6d d	 6| | <n  | | d j |  qW| S)zn
        Retrieves any constraints or keys (unique, pk, fk, check, index) across one or more columns.
        a  
            SELECT
                user_constraints.constraint_name,
                LOWER(cols.column_name) AS column_name,
                CASE user_constraints.constraint_type
                    WHEN 'P' THEN 1
                    ELSE 0
                END AS is_primary_key,
                CASE user_indexes.uniqueness
                    WHEN 'UNIQUE' THEN 1
                    ELSE 0
                END AS is_unique,
                CASE user_constraints.constraint_type
                    WHEN 'C' THEN 1
                    ELSE 0
                END AS is_check_constraint
            FROM
                user_constraints
            INNER JOIN
                user_indexes ON user_indexes.index_name = user_constraints.index_name
            LEFT OUTER JOIN
                user_cons_columns cols ON user_constraints.constraint_name = cols.constraint_name
            WHERE
                (
                    user_constraints.constraint_type = 'P' OR
                    user_constraints.constraint_type = 'U'
                )
                AND user_constraints.table_name = UPPER(%s)
            ORDER BY cols.position
        columnsr3   r4   NZforeign_keycheckTindexa  
            SELECT
                cons.constraint_name,
                LOWER(cols.column_name) AS column_name
            FROM
                user_constraints cons
            LEFT OUTER JOIN
                user_cons_columns cols ON cons.constraint_name = cols.constraint_name
            WHERE
                cons.constraint_type = 'C' AND
                cons.table_name = UPPER(%s)
            ORDER BY cols.position
        Fa  
            SELECT
                cons.constraint_name,
                LOWER(cols.column_name) AS column_name,
                LOWER(rcons.table_name),
                LOWER(rcols.column_name)
            FROM
                user_constraints cons
            INNER JOIN
                user_constraints rcons ON cons.r_constraint_name = rcons.constraint_name
            INNER JOIN
                user_cons_columns rcols ON rcols.constraint_name = rcons.constraint_name
            LEFT OUTER JOIN
                user_cons_columns cols ON cons.constraint_name = cols.constraint_name
            WHERE
                cons.constraint_type = 'R' AND
                cons.table_name = UPPER(%s)
            ORDER BY cols.position
        a  
            SELECT
                index_name,
                LOWER(column_name)
            FROM
                user_ind_columns cols
            WHERE
                table_name = UPPER(%s) AND
                NOT EXISTS (
                    SELECT 1
                    FROM user_constraints cons
                    WHERE cols.index_name = cons.index_name
                )
            ORDER BY cols.column_position
        )r   r   r"   )r   r   r#   constraints
constraintcolumnpkr4   r9   Zother_tableZother_columnr   r   r   get_constraints   sd    "z%DatabaseIntrospection.get_constraints)__name__
__module____qualname__r   ZBLOBZCLOBZDATETIMEZ
FIXED_CHARZNCLOBr   STRINGZ	TIMESTAMPZdata_types_reverseZNATIVE_FLOATAttributeErrorUNICODEr   r   r   r&   r'   r,   r/   r2   r7   r?   r   r   )r   r   r   	   s6   






r   )r   Z%django.db.backends.base.introspectionr   r   r   Zdjango.utils.encodingr   r   r   r   r   r   <module>   s   