
v^'/                 @   sx   d  d l  m Z d  d l Z d  d l m Z d  d l m Z m Z m	 Z	 e d e j
 d	  Z Gd d   d e  Z d S)
    )
namedtupleN)models)BaseDatabaseIntrospection	FieldInfo	TableInfor   is_autofieldc                   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 e j d e j d e j d e j d i Z d	 Z   f d
 d   Z d d   Z d d   Z d d   Z f  d d  Z d d   Z d d   Z d d   Z d d   Z   S)DatabaseIntrospectionZBinaryFieldZ	TextFieldZ	DateFieldZ	CharFieldZDurationField
FloatFieldZDecimalFieldZDateTimeField   c                s   | t  j k r | d d  \ } } | d k r | d k rN | j rJ d Sd Sd | k  oe d k  n rw | j rw d S| d k r d	 S| j r d
 Sd Sn | d k r d St   j | |  S)N      r      ZBigAutoFieldZBigIntegerFieldr
   ZSmallAutoFieldZBooleanField	AutoFieldZIntegerField   r	   i)	cx_OracleNUMBERr   superget_field_type)selfZ	data_typedescriptionZ	precisionZscale)	__class__ I/tmp/pip-build-8lau8j11/django/django/db/backends/oracle/introspection.pyr       s    %	z$DatabaseIntrospection.get_field_typec                s*   | j  d    f d d   | j   D S)z>Return a list of table and view names in the current database.a  
            SELECT table_name, 't'
            FROM user_tables
            WHERE
                NOT EXISTS (
                    SELECT 1
                    FROM user_mviews
                    WHERE user_mviews.mview_name = user_tables.table_name
                )
            UNION ALL
            SELECT view_name, 'v' FROM user_views
            UNION ALL
            SELECT mview_name, 'v' FROM user_mviews
        c                s0   g  |  ]& } t    j | d   | d   q S)r   r
   )r   identifier_converter).0row)r   r   r   
<listcomp>C   s   	 z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   )r   r   get_table_list3   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] } | d } | | \ } } }	 | i  } | j t	 |  j
 |  | d d  | | d p d | d	 p d f | d
 d  | |	 f    qv W| S)zi
        Return a description of the table with the DB-API cursor.description
        interface.
        a  
            SELECT
                column_name,
                data_default,
                CASE
                    WHEN char_used IS NULL THEN data_length
                    ELSE char_length
                END as internal_size,
                CASE
                    WHEN identity_column = 'YES' THEN 1
                    ELSE 0
                END as is_autofield
            FROM user_tab_cols
            WHERE table_name = UPPER(%s)c             S   s@   i  |  ]6 \ } } } } | | d  k r- | n d | f |  q S)ZNULLNr   )r   columndefaultinternal_sizer   r   r   r   
<dictcomp>Y   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   appendr   r   )
r   r   
table_nameZ	field_mapr   descnamer#   r"   r   r   r   r   get_table_descriptionE   s"    	

	)4z+DatabaseIntrospection.get_table_descriptionc             C   s
   | j    S)z7Identifier comparison is case insensitive under Oracle.)lower)r   r.   r   r   r   r   l   s    z*DatabaseIntrospection.identifier_converterc             C   s   | j  d | g  | j   } | ra d |  j | d  d |  j |  d |  j | d  i g Sx6 | D]. } t | t j  rh d | d | j i g Sqh Wg  S)Na|  
            SELECT
                user_tab_identity_cols.sequence_name,
                user_tab_identity_cols.column_name
            FROM
                user_tab_identity_cols,
                user_constraints,
                user_cons_columns cols
            WHERE
                user_constraints.constraint_name = cols.constraint_name
                AND user_constraints.table_name = user_tab_identity_cols.table_name
                AND cols.column_name = user_tab_identity_cols.column_name
                AND user_constraints.constraint_type = 'P'
                AND user_tab_identity_cols.table_name = UPPER(%s)
        r.   r   tabler!   r
   )r   fetchoner   
isinstancer   r   r!   )r   r   r,   Ztable_fieldsr   fr   r   r   get_sequencesp   s    z#DatabaseIntrospection.get_sequencesc                s<   | j    } | j d | g    f d d   | j   D S)z
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        ab  
    SELECT ca.column_name, cb.table_name, cb.column_name
    FROM   user_constraints, USER_CONS_COLUMNS ca, USER_CONS_COLUMNS cb
    WHERE  user_constraints.table_name = %s AND
           user_constraints.constraint_name = ca.constraint_name AND
           user_constraints.r_constraint_name = cb.constraint_name AND
           ca.position = cb.positionc                sC   i  |  ]9 \ } } }   j  |    j  |  f   j  |   q Sr   )r   )r   
field_nameZrel_table_nameZrel_field_name)r   r   r   r$      s   	z7DatabaseIntrospection.get_relations.<locals>.<dictcomp>)upperr   r   )r   r   r,   r   )r   r   get_relations   s
    z#DatabaseIntrospection.get_relationsc                s6   | j  d | j   g    f 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/   g  |  ]% } t    f d  d   | D   q S)c             3   s   |  ] }   j  |  Vq d  S)N)r   )r   Zcell)r   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   r7   r   )r   r   r,   r   )r   r   get_key_columns   s    z%DatabaseIntrospection.get_key_columnsc             C   s:   | j  d | g  | j   } | r6 |  j | d  Sd  S)Na  
            SELECT
                cols.column_name
            FROM
                user_constraints,
                user_cons_columns cols
            WHERE
                user_constraints.constraint_name = cols.constraint_name AND
                user_constraints.constraint_type = 'P' AND
                user_constraints.table_name = UPPER(%s) AND
                cols.position = 1
        r   )r   r2   r   )r   r   r,   r   r   r   r   get_primary_key_column   s    z,DatabaseIntrospection.get_primary_key_columnc             C   s  i  } | j  d | g  xi | j   D][ \ } } } } } |  j |  } d | j d  d | d | d d d | d	 | i | | <q& W| j  d
 | g  xl | j   D]^ \ } } }	 }
 |  j |  } d d d d d |	 |
 f d d d	 d d | j d  i | | <q W| j  d | g  x | j   D] \ } } } } |  j |  } d d d d d d d d d	 d d | d k r{d n | d | j d  d | j d  i | | <q'W| S)zu
        Retrieve any constraints or keys (unique, pk, fk, check, index) across
        one or more columns.
        a$  
            SELECT
                user_constraints.constraint_name,
                LISTAGG(LOWER(cols.column_name), ',') WITHIN GROUP (ORDER BY cols.position),
                CASE user_constraints.constraint_type
                    WHEN 'P' THEN 1
                    ELSE 0
                END AS is_primary_key,
                CASE
                    WHEN user_constraints.constraint_type IN ('P', 'U') 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
            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)
            GROUP BY user_constraints.constraint_name, user_constraints.constraint_type
        columns,Zprimary_keyuniqueZforeign_keyNcheckindexa  
            SELECT
                cons.constraint_name,
                LISTAGG(LOWER(cols.column_name), ',') WITHIN GROUP (ORDER BY cols.position),
                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 AND rcols.position = 1
            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)
            GROUP BY cons.constraint_name, rcols.table_name, rcols.column_name
        Fa  
            SELECT
                ind.index_name,
                LOWER(ind.index_type),
                LISTAGG(LOWER(cols.column_name), ',') WITHIN GROUP (ORDER BY cols.column_position),
                LISTAGG(cols.descend, ',') WITHIN GROUP (ORDER BY cols.column_position)
            FROM
                user_ind_columns cols, user_indexes ind
            WHERE
                cols.table_name = UPPER(%s) AND
                NOT EXISTS (
                    SELECT 1
                    FROM user_constraints cons
                    WHERE ind.index_name = cons.index_name
                ) AND cols.index_name = ind.index_name
            GROUP BY ind.index_name, ind.index_type
        TtypeZnormalidxorders)r   r   r   split)r   r   r,   constraints
constraintr=   pkr?   r@   Zother_tableZother_columntype_rD   r   r   r   get_constraints   sD    "z%DatabaseIntrospection.get_constraints)__name__
__module____qualname__r   ZBLOBZCLOBZDATETIMEZ
FIXED_CHARZFIXED_NCHARZINTERVALZNATIVE_FLOATZNCHARZNCLOBr   STRINGZ	TIMESTAMPZdata_types_reverser'   r   r    r/   r   r5   r8   r;   r<   rJ   r   r   )r   r   r      s,   											'r   )zis_autofield)collectionsr   r   Z	django.dbr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   _fieldsr   r   r   r   r   <module>   s
   