B
    ©0H[ª.  ã               @   sl   d dl Z 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 )
é    N)Ú
namedtuple)Úmodels)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)ÚRemovedInDjango21Warningr   )Ú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iZdZ‡ fd	d
„Zdd„ Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚDatabaseIntrospectionZBinaryFieldZ	TextFieldZ	DateFieldZ	CharFieldÚ
FloatFieldZDecimalFieldZDateTimeFieldé   c                sn   |t jkr`|dd… \}}|dkrT|dkr8|jr4dS dS |dkrDdS |jrNd	S d
S n|dkr`dS tƒ  ||¡S )Né   é   r   é   ZBigAutoFieldZBigIntegerFieldr   ZBooleanFieldÚ	AutoFieldZIntegerFieldi�ÿÿÿr
   )Ú	cx_OracleÚNUMBERr   ÚsuperÚget_field_type)ÚselfZ	data_typeÚdescriptionZ	precisionZscale)Ú	__class__© úkC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\db\backends\oracle\introspection.pyr   !   s    
z$DatabaseIntrospection.get_field_typec             C   s   |  d¡ dd„ | ¡ D ƒS )z>Return 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   ¡ |d ƒ‘qS )r   r   )r   Úlower)Ú.0Úrowr   r   r   ú
<listcomp>6   s    z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r   Úcursorr   r   r   Úget_table_list2   s    
z$DatabaseIntrospection.get_table_listc       
   	   C   sÐ   |  d|g¡ dd„ | ¡ D ƒ}|  jd7  _|  d | jj |¡| j¡¡ g }xz|jD ]p}|d }|| \}}}	|i  }| t	| 
¡ f|dd…  ||d p d|d	 pªdf |d
d…  ||	f Ž ¡ qXW |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 | ]$\}}}}||d kr|nd|f|“qS )ÚNULLNr   )r   ÚcolumnÚdefaultÚinternal_sizer   r   r   r   ú
<dictcomp>L   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_description8   s"    

:z+DatabaseIntrospection.get_table_descriptionc             C   s   |  ¡ S )z7Table name comparison is case insensitive under Oracle.)r   )r   r/   r   r   r   Útable_name_converterb   s    z*DatabaseIntrospection.table_name_converterr   c             C   sd   |  d|g¡ | ¡ }|r8|d  ¡ ||d  ¡ dœgS x&|D ]}t|tjƒr>||jdœgS q>W 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   )r/   Útabler"   )r2   r"   )r   Zfetchoner   Ú
isinstancer   r   r"   )r   r   r-   Ztable_fieldsr   Úfr   r   r   Úget_sequencesf   s    

z#DatabaseIntrospection.get_sequencesc             C   sT   |  ¡ }| d|g¡ i }x4| ¡ D ](}|d  ¡ |d  ¡ f||d  ¡ < q$W |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.positioné   r   r   )Úupperr   r   r   )r   r   r-   Z	relationsr   r   r   r   Úget_relations�   s    
(z#DatabaseIntrospection.get_relationsc             C   s$   |  d| ¡ g¡ dd„ | ¡ 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   | ]}|  ¡ V  qd S )N)r   )r   Ú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   r7   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}| ||g¡ i }x2| ¡ D ]&}t|d ƒt|d ƒdœ||d < q0W |S )Nz:get_indexes() is deprecated in favor of get_constraints().r6   )Ú
stacklevelaZ  
    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 }|  d|g¡ x6| ¡ D ]*\}}}}}| d¡||d||dœ||< qW |  d|g¡ x8| ¡ D ],\}}}	}
dd|	|
fdd| d¡dœ||< qbW |  d|g¡ xJ| ¡ D ]>\}}}}ddddd	|d
krÌdn|| d¡| d¡dœ||< 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
        ú,N)Úcolumnsr>   r?   Ú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)r>   r?   rG   rH   rI   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
        TZnormalÚidx)r>   r?   rG   rH   rI   ÚtyperF   Úorders)r   r   Úsplit)r   r   r-   ÚconstraintsÚ
constraintrF   Úpkr?   rH   Zother_tableZother_columnÚtype_rL   r   r   r   Úget_constraintsÂ   s>    


z%DatabaseIntrospection.get_constraints)r   )Ú__name__Ú
__module__Ú__qualname__r   ZBLOBZCLOBZDATETIMEZ
FIXED_CHARZFIXED_NCHARZNATIVE_FLOATZNCHARZNCLOBr   ÚSTRINGÚ	TIMESTAMPZdata_types_reverser(   r   r    r0   r1   r5   r8   r<   rD   rR   Ú__classcell__r   r   )r   r   r	      s*   
*
"r	   )r@   Úcollectionsr   r   Z	django.dbr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.utils.deprecationr   Ú_fieldsr	   r   r   r   r   Ú<module>   s   