3
g@7                 @   sd   d dl mZ d dlZd dlmZ d dlmZmZm	Z	 d dl
mZ edejd ZG d	d
 d
eZdS )    )
namedtupleN)models)BaseDatabaseIntrospection	FieldInfo	TableInfo)cached_propertyr   is_autofieldis_jsonc                   sp   e Zd ZdZedd Z fddZdd Zdd	 Zd
d Z	f fddZ
dd Zdd Zdd Zdd Z  ZS )DatabaseIntrospection   c             C   s   | j jd
k rXtjdtjdtjdtjdtjdtjdtj	dtj
dtjdtjdtjdtjd	iS tjdtjdtjdtjdtjdtjdtjdtjdtjdtjdtjd	tjdiS d S )N   ZBinaryFieldZ	TextFieldZ	DateFieldZ	CharFieldZDurationField
FloatFieldZDecimalFieldZDateTimeField)r   )
connectionZcx_oracle_version	cx_OracleZBLOBZCLOBZDATETIMEZ
FIXED_CHARZFIXED_NCHARZINTERVALZNATIVE_FLOATZNCHARNCLOBNUMBERSTRINGZ	TIMESTAMPZDB_TYPE_DATEZDB_TYPE_BINARY_DOUBLEZDB_TYPE_BLOBZDB_TYPE_CHARZDB_TYPE_CLOBZDB_TYPE_INTERVAL_DSZDB_TYPE_NCHARZDB_TYPE_NCLOBZDB_TYPE_NVARCHARZDB_TYPE_NUMBERZDB_TYPE_TIMESTAMPZDB_TYPE_VARCHAR)self r   e/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/db/backends/oracle/introspection.pydata_types_reverse   s2    
z(DatabaseIntrospection.data_types_reversec                s   |t jkr|dd \}}|dkrv|dkr8|jr4dS dS d|  k oJdk n  rZ|jrZdS |dkrfd	S |jrpd
S dS q|dkrdS n|t jkr|jrdS t j||S )N      r      ZBigAutoFieldZBigIntegerFieldr   ZSmallAutoFieldZBooleanField	AutoFieldZIntegerField   r   Z	JSONFieldi)r   r   r   r   r	   superget_field_type)r   Z	data_typedescriptionZ	precisionZscale)	__class__r   r   r   3   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                s$   g | ]}t  j|d  |d qS )r   r   )r   identifier_converter).0row)r   r   r   
<listcomp>X   s    z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   )r   r   get_table_listH   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 pd|d	 pdf|d
d ||	|
|f  qXW |S )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        a>  
            SELECT
                user_tab_cols.column_name,
                user_tab_cols.data_default,
                CASE
                    WHEN user_tab_cols.collation = user_tables.default_collation
                    THEN NULL
                    ELSE user_tab_cols.collation
                END collation,
                CASE
                    WHEN user_tab_cols.char_used IS NULL
                    THEN user_tab_cols.data_length
                    ELSE user_tab_cols.char_length
                END as internal_size,
                CASE
                    WHEN user_tab_cols.identity_column = 'YES' THEN 1
                    ELSE 0
                END as is_autofield,
                CASE
                    WHEN EXISTS (
                        SELECT  1
                        FROM user_json_columns
                        WHERE
                            user_json_columns.table_name = user_tab_cols.table_name AND
                            user_json_columns.column_name = user_tab_cols.column_name
                    )
                    THEN 1
                    ELSE 0
                END as is_json
            FROM user_tab_cols
            LEFT OUTER JOIN
                user_tables ON user_tables.table_name = user_tab_cols.table_name
            WHERE user_tab_cols.table_name = UPPER(%s)
        c             S   s4   i | ],\}}}}}}||d kr"|nd|||f|qS )ZNULLNr   )r!   columndefault	collationinternal_sizer   r	   r   r   r   
<dictcomp>   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formatr   opsZ
quote_namer   appendr   r    )r   r&   
table_nameZ	field_mapr   descnamer+   r)   r*   r   r	   r   r   r   get_table_descriptionZ   s"    !

 ,z+DatabaseIntrospection.get_table_descriptionc             C   s   |j  S )z7Identifier comparison is case insensitive under Oracle.)lower)r   r5   r   r   r   r       s    z*DatabaseIntrospection.identifier_converterc             C   sn   |j d|g |j }|rB| j|d | j|| j|d dgS x&|D ]}t|tjrH||jdgS qHW g 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   )r5   tabler(   )r8   r(   )r$   fetchoner    
isinstancer   r   r(   )r   r&   r3   Ztable_fieldsr"   fr   r   r   get_sequences   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                s.   i | ]&\}}} j | j |f j |qS r   )r    )r!   
field_nameZrel_table_nameZrel_field_name)r   r   r   r,      s   z7DatabaseIntrospection.get_relations.<locals>.<dictcomp>)upperr$   r%   )r   r&   r3   r   )r   r   get_relations   s
    

z#DatabaseIntrospection.get_relationsc                s(   |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!   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$   r>   r%   )r   r&   r3   r   )r   r   get_key_columns   s    
z%DatabaseIntrospection.get_key_columnsc             C   s,   |j d|g |j }|r(| j|d S d 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$   r9   r    )r   r&   r3   r"   r   r   r   get_primary_key_column   s    
z,DatabaseIntrospection.get_primary_key_columnc          
   C   s  i }|j d|g x@|j D ]4\}}}}}| j|}|jd||d||d||< qW |j d|g xB|j D ]6\}}}	}
| j|}dd|	|
fdd|jdd||< qlW |j d|g xT|j D ]H\}}}}| j|}ddddd	|d
krdn||jd|jdd||< qW |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
        ,N)columnsprimary_keyuniqueforeign_key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
        F)rG   rH   rI   rJ   rK   rF   a  
            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normalidx)rG   rH   rI   rJ   rK   typerF   orders)r$   r%   r    split)r   r&   r3   constraints
constraintrF   pkrH   rJ   Zother_tableZother_columntype_rO   r   r   r   get_constraints   sD    





z%DatabaseIntrospection.get_constraints)__name__
__module____qualname__r/   r   r   r   r'   r6   r    r<   r?   rC   rD   rU   __classcell__r   r   )r   r   r
      s   !;r
   )r   r	   )collectionsr   r   Z	django.dbr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.utils.functionalr   _fieldsr
   r   r   r   r   <module>   s   