3
(h,                 @   s<   d dl Z d dlmZmZmZ d dlmZ G dd deZdS )    N)BaseDatabaseIntrospection	FieldInfo	TableInfo)
force_textc                   s   e Zd Zejdejdejdejdejdej	dej
dejdiZydeej< W n ek
r^   Y nX ydeej< W n ek
r   Y nX 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  ZS )DatabaseIntrospectionZBinaryFieldZ	TextFieldZ	DateFieldZ	CharFieldZDecimalFieldZDateTimeField
FloatField   c                s^   |t jkrL|dd \}}|dkr@|dkr.dS |dkr:dS dS n|dkrLd
S 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__ K/tmp/pip-install-q3hcpn_q/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   sx   |  j d7  _ |jdj| jjj|| j  g }xB|jD ]8}t|d }|i  }|jt	|j
 f|dd    q8W |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   sT   |j  }|jd|g i }x4|j D ](}|d j |d j f||d j < q$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    
(z#DatabaseIntrospection.get_relationsc             C   s$   |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   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   sN   d}|j ||g i }x2|j D ]&}t|d t|d d||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   r-   )primary_keyuniquer   )r   r   bool)r   r   r#   Zsqlindexesr   r   r   r   get_indexesw   s    
z!DatabaseIntrospection.get_indexesc             C   sj  i }|j d|g xJ|j D ]>\}}}}}||krHg ||d|dd||< || d j| qW |j d|g xD|j D ]8\}}||krg dddddd||< || d j| qvW |j d|g xL|j D ]@\}}}	}
||krg dd|	|
fddd||< || d j| qW |j d	|g xH|j D ]<\}}||krNg dddddd||< || 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
        NT)columnsr4   r5   Zforeign_keycheckindexr9   a  
            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pkr5   r:   Zother_tableZother_columnr   r   r   get_constraints   s\    




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/   r3   r8   r@   __classcell__r   r   )r   r   r   	   s4   
r   )r   Z%django.db.backends.base.introspectionr   r   r   Zdjango.utils.encodingr   r   r   r   r   r   <module>   s   