
^Q\-                 @   sn   d  d l  Z  d  d l Z d  d l m Z m Z m Z d  d l m Z d  d l m	 Z	 Gd d   d e  Z
 d S)    N)BaseDatabaseIntrospection	FieldInfo	TableInfo)RemovedInDjango21Warning)
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 6d e j 6d e j 6d e j 6Z d 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	CharField
FloatFieldZDecimalFieldZDateTimeField   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__ M/var/www/dbchiro/venv/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>4   s   	 z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   r   r   get_table_list.   s    z$DatabaseIntrospection.get_table_listc       	      C   s  | j  d | g  d d   | j   D } |  j d 7_ | j  d j |  j j j |  |  j   g  } x | j D] } t | d  } | | \ } } | i  } | j	 t
 | j   f | d d  | | d p d | d	 p d f | d
 d  | f    qv W| S)zQReturns a description of the table, with the DB-API cursor.description interface.a1  
            SELECT
                column_name,
                data_default,
                CASE
                    WHEN char_used IS NULL THEN data_length
                    ELSE char_length
                END as internal_size
            FROM user_tab_cols
            WHERE table_name = UPPER(%s)c             S   s:   i  |  ]0 \ } } } | | d  k r* | n d f |  q S)ZNULLNr   )r   columndefaultinternal_sizer   r   r   
<dictcomp>D   s   	z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>r	   z,SELECT * FROM {} WHERE ROWNUM < 2 AND {} > 0r      r
      r   N)r   r   cache_bust_counterformat
connectionopsZ
quote_namer   r   appendr   r   )	r   r   
table_nameZ	field_mapr   descnamer!   r    r   r   r   get_table_description6   s"    		
	I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_converterY   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   r"   b   s   	 z8DatabaseIntrospection._name_to_index.<locals>.<dictcomp>)	enumerater-   )r   r   r*   r   r   r   _name_to_index]   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_relationsd   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>   s    zCDatabaseIntrospection.get_key_columns.<locals>.<listcomp>.<genexpr>)tuple)r   r   r   r   r   r      s   	z9DatabaseIntrospection.get_key_columns.<locals>.<listcomp>)r   r4   r   )r   r   r*   r   r   r   get_key_columns}   s    	z%DatabaseIntrospection.get_key_columnsc             C   s   t  j d t d d d } | j | | g  i  } xD | j   D]6 } i t | d  d 6t | d  d 6| | d <qB W| S)	Nz:get_indexes() is deprecated in favor of get_constraints().
stacklevelr3   aZ  
    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_keyuniquer   )warningswarnr   r   r   bool)r   r   r*   Zsqlindexesr   r   r   r   get_indexes   s     z!DatabaseIntrospection.get_indexesc             C   s  i  } | j  d | g  x~ | j   D]p \ } } } } } }	 | | k r i g  d 6| d 6| d 6d d 6| d 6|	 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  x | j   D] \ } } } } | | k ri g  d 6g  d 6d
 d 6d
 d 6d d 6d
 d 6d d 6| d k rd n | d 6| | <n  | | d j |  | | d j |  qNW| S)zn
        Retrieves any constraints or keys (unique, pk, fk, check, index) across one or more columns.
        aM  
            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
                    WHEN EXISTS (
                        SELECT 1
                        FROM user_indexes
                        WHERE user_indexes.index_name = user_constraints.index_name
                        AND user_indexes.uniqueness = '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,
                CASE
                    WHEN user_constraints.constraint_type IN ('P', 'U') THEN 1
                    ELSE 0
                END AS has_index
            FROM
                user_constraints
            LEFT OUTER JOIN
                user_cons_columns cols ON user_constraints.constraint_name = cols.constraint_name
            WHERE
                user_constraints.constraint_type = ANY('P', 'U', 'C')
                AND user_constraints.table_name = UPPER(%s)
            ORDER BY cols.position
        columnsr:   r;   NZforeign_keycheckindexav  
            SELECT
                cons.constraint_name,
                LOWER(cols.column_name) AS column_name,
                LOWER(rcols.table_name),
                LOWER(rcols.column_name)
            FROM
                user_constraints cons
            INNER JOIN
                user_cons_columns rcols ON rcols.constraint_name = cons.r_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
        Fa  
            SELECT
                cols.index_name, LOWER(cols.column_name), cols.descend,
                LOWER(ind.index_type)
            FROM
                user_ind_columns cols, user_indexes ind
            WHERE
                cols.table_name = UPPER(%s) AND
                NOT EXISTS (
                    SELECT 1
                    FROM user_constraints cons
                    WHERE cols.index_name = cons.index_name
                ) AND cols.index_name = ind.index_name
            ORDER BY cols.column_position
        ZordersTZnormalidxtype)r   r   r)   )r   r   r*   constraints
constraintr   pkr;   rB   rC   Zother_tableZother_columnordertype_r   r   r   get_constraints   sR    "%#z%DatabaseIntrospection.get_constraints)__name__
__module____qualname__r   ZBLOBZCLOBZDATETIMEZ
FIXED_CHARZFIXED_NCHARZNATIVE_FLOATZNCHARZNCLOBr   STRINGZ	TIMESTAMPZdata_types_reverser%   r   r   r-   r.   r2   r5   r8   r@   rK   r   r   )r   r   r      s,   









#"r   )r<   r   Z%django.db.backends.base.introspectionr   r   r   Zdjango.utils.deprecationr   Zdjango.utils.encodingr   r   r   r   r   r   <module>   s
   