ó
®â0_c           @   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	 d e f d „  ƒ  YZ
 d S(   iÿÿÿÿN(   t   BaseDatabaseIntrospectiont	   FieldInfot	   TableInfo(   t   RemovedInDjango21Warning(   t
   force_textt   DatabaseIntrospectionc           B   sÓ   e  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 d „  Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z RS(   t   BinaryFieldt	   TextFieldt	   DateFieldt	   CharFieldt
   FloatFieldt   DecimalFieldt   DateTimeFieldi   c         C   s   | t  j k rh | d d !\ } } | d k rU | d k r> d S| d k rN d Sd Sqh | d	 k rh d
 Sn  t t |  ƒ j | | ƒ S(   Ni   i   i    i   t   BigIntegerFieldi   t   BooleanFieldt   IntegerFieldiÿÿÿR
   (   t	   cx_Oraclet   NUMBERt   superR   t   get_field_type(   t   selft	   data_typet   descriptiont	   precisiont   scale(    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyR      s    c         C   sA   | j  d ƒ g  | j ƒ  D]# } t | d j ƒ  | d ƒ ^ q S(   sQ   
        Returns a list of table and view names in the current database.
        sW   SELECT TABLE_NAME, 't' FROM USER_TABLES UNION ALL SELECT VIEW_NAME, 'v' FROM USER_VIEWSi    i   (   t   executet   fetchallR   t   lower(   R   t   cursort   row(    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   get_table_list.   s    c   	      C   s  | j  d | g ƒ 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	 | f Œ  ƒ qs W| S(
   sQ   Returns a description of the table, with the DB-API cursor.description interface.s1  
            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(   t   NULLN(   t   None(   t   .0t   columnt   defaultt   internal_size(    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pys
   <dictcomp>D   s   	i   s,   SELECT * FROM {} WHERE ROWNUM < 2 AND {} > 0i    i   i   i   i   (   R   R   t   cache_bust_countert   formatt
   connectiont   opst
   quote_nameR   R   t   appendR   R   (	   R   R   t
   table_namet	   field_mapR   t   desct   nameR$   R#   (    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   get_table_description6   s"    	
	@c         C   s
   | j  ƒ  S(   s6   Table name comparison is case insensitive under Oracle(   R   (   R   R.   (    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   table_name_converterY   s    c         C   s    d „  t  |  j | | ƒ ƒ Dƒ S(   su   
        Returns a dictionary of {field_name: field_index} for the given table.
        Indexes are 0-based.
        c         S   s#   i  |  ] \ } } | | d  “ q S(   i    (    (   R!   t   it   d(    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pys
   <dictcomp>b   s   	 (   t	   enumerateR/   (   R   R   R+   (    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   _name_to_index]   s    c         C   sn   | j  ƒ  } | j d | g ƒ i  } xB | j ƒ  D]4 } | d j ƒ  | d j ƒ  f | | d j ƒ  <q2 W| S(   s˜   
        Returns a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        s„  
    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.positioni   i   i    (   t   upperR   R   R   (   R   R   R+   t	   relationsR   (    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   get_relationsd   s    2c         C   sF   | j  d | j ƒ  g ƒ g  | j ƒ  D] } t d „  | Dƒ ƒ ^ q& S(   Nsš  
            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   |  ] } | j  ƒ  Vq d  S(   N(   R   (   R!   t   cell(    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pys	   <genexpr>†   s    (   R   R5   R   t   tuple(   R   R   R+   R   (    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   get_key_columns}   s    c         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(	   Ns:   get_indexes() is deprecated in favor of get_constraints().t
   stackleveli   sZ  
    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
           )
        i   t   primary_keyt   uniquei    (   t   warningst   warnR   R   R   t   bool(   R   R   R+   t   sqlt   indexesR   (    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   get_indexes‰   s     c         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 6t d 6t d 6|
 | f d 6t d 6t d 6| | <n  | | d j | ƒ qº W| j  d	 | g ƒ x­ | j ƒ  D]Ÿ \ } } } } | | k rÃi g  d 6g  d
 6t d 6t d 6d d 6t d 6t d 6| d k r²d n | d 6| | <n  | | d j | ƒ | | d
 j | ƒ qNW| S(   sn   
        Retrieves any constraints or keys (unique, pk, fk, check, index) across one or more columns.
        sM  
            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
        t   columnsR<   R=   t   foreign_keyt   checkt   indexsv  
            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
        s  
            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
        t   orderst   normalt   idxt   typeN(   R   R   R    R*   t   Falset   True(   R   R   R+   t   constraintst
   constraintR"   t   pkR=   RF   RG   t   other_tablet   other_columnt   ordert   type_(    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   get_constraints«   sR    "%#(   t   __name__t
   __module__R   t   BLOBt   CLOBt   DATETIMEt
   FIXED_CHARt   FIXED_NCHARt   NATIVE_FLOATt   NCHARt   NCLOBR   t   STRINGt	   TIMESTAMPt   data_types_reverseR%   R   R   R/   R0   R4   R7   R:   RC   RU   (    (    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyR      s,   









			#					"(   R>   R   t%   django.db.backends.base.introspectionR    R   R   t   django.utils.deprecationR   t   django.utils.encodingR   R   (    (    (    sI   /tmp/pip-unpacked-wheel-BAJOf3/django/db/backends/oracle/introspection.pyt   <module>   s
   