o
    :Zc'/                     @   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G d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dddZdd Zdd Zdd Zdd Z  ZS )DatabaseIntrospectionBinaryField	TextField	DateField	CharFieldDurationField
FloatFieldDecimalFieldDateTimeField   c                    s   |t jkr@|dd \}}|dkr:|dkr|jrdS dS d|  k r&dk r-n n|jr-dS |dkr3d	S |jr8d
S dS |dkr@dS t ||S )N      r      BigAutoFieldBigIntegerFieldr   SmallAutoFieldBooleanField	AutoFieldIntegerFieldir   )	cx_OracleNUMBERr   superget_field_type)self	data_typedescription	precisionscale	__class__ ]/var/www/chikooza/env/lib/python3.10/site-packages/django/db/backends/oracle/introspection.pyr       s   
z$DatabaseIntrospection.get_field_typec                    s    | d  fdd| 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  |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   | d|g dd | D }|  jd7  _| d| jj|| j g }|jD ];}|d }|| \}}}	|i  }|t	| 
|g|dd ||d pQd|d	 pWd|d
d ||	R   q+|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>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ops
quote_namer!   appendr   r(   )
r   r0   
table_name	field_mapr!   descnamer5   r4   r   r&   r&   r'   get_table_descriptionE   sD   




z+DatabaseIntrospection.get_table_descriptionc                 C   s   |  S )z7Identifier comparison is case insensitive under Oracle.)lower)r   rB   r&   r&   r'   r(   l   s   z*DatabaseIntrospection.identifier_converterr&   c                 C   sn   | d|g | }|r!| |d | || |d dgS |D ]}t|tjr4||jdg  S q#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   )rB   tabler3   )rE   r3   )r.   fetchoner(   
isinstancer   r   r3   )r   r0   r?   table_fieldsr+   fr&   r&   r'   get_sequencesp   s   z#DatabaseIntrospection.get_sequencesc                    s,   |  }|d|g  fdd| 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 | ]\}}}  |  |  |fqS r&   r(   )r*   
field_namerel_table_namerel_field_namer,   r&   r'   r6      s    z7DatabaseIntrospection.get_relations.<locals>.<dictcomp>)upperr.   r/   r   r0   r?   r&   r,   r'   get_relations   s   
z#DatabaseIntrospection.get_relationsc                    s(   | d| g  f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"   g | ]}t  fd d|D qS )c                 3   s    | ]}  |V  qd S )NrK   )r*   cellr,   r&   r'   	<genexpr>   s    zCDatabaseIntrospection.get_key_columns.<locals>.<listcomp>.<genexpr>)tupler)   r,   r&   r'   r-      s    z9DatabaseIntrospection.get_key_columns.<locals>.<listcomp>)r.   rO   r/   rP   r&   r,   r'   get_key_columns   s   
z%DatabaseIntrospection.get_key_columnsc                 C   s,   | d|g | }|r| |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.   rF   r(   )r   r0   r?   r+   r&   r&   r'   get_primary_key_column   s
   z,DatabaseIntrospection.get_primary_key_columnc                 C   s  i }| d|g | D ]\}}}}}| |}|d||d||d||< q| d|g | D ]\}}}	}
| |}dd|	|
fdd|dd||< q3| d|g | D ]$\}}}}| |}ddddd	|d
krpdn||d|dd||< qZ|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)rY   rZ   r[   r\   r]   rX   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)rY   rZ   r[   r\   r]   typerX   orders)r.   r/   r(   split)r   r0   r?   constraints
constraintrX   pkrZ   r\   other_tableother_columntype_ra   r&   r&   r'   get_constraints   sP   
	
	

z%DatabaseIntrospection.get_constraints)r&   )__name__
__module____qualname__r   BLOBCLOBDATETIME
FIXED_CHARFIXED_NCHARINTERVALNATIVE_FLOATNCHARNCLOBr   STRING	TIMESTAMPdata_types_reverser9   r   r1   rC   r(   rJ   rQ   rU   rV   ri   __classcell__r&   r&   r$   r'   r      s0    '
r   )collectionsr   r   	django.dbr   %django.db.backends.base.introspectionr   r   BaseFieldInfor   _fieldsr   r&   r&   r&   r'   <module>   s    