o
    lf<                     @   s   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dlm	Z
 d dlmZ edejd	 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_jsoncommentr   )r
   c                       sf   e Zd ZdZed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  ZS )DatabaseIntrospection   c                 C   s   | j jdk r,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 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 )
N)   BinaryField	TextField	DateField	CharFieldDurationField
FloatFieldDecimalFieldDateTimeField)
connectioncx_oracle_version	cx_OracleBLOBCLOBDATETIME
FIXED_CHARFIXED_NCHARINTERVALNATIVE_FLOATNCHARNCLOBNUMBERSTRING	TIMESTAMPDB_TYPE_DATEDB_TYPE_BINARY_DOUBLEDB_TYPE_BLOBDB_TYPE_CHARDB_TYPE_CLOBDB_TYPE_INTERVAL_DSDB_TYPE_NCHARDB_TYPE_NCLOBDB_TYPE_NVARCHARDB_TYPE_NUMBERDB_TYPE_TIMESTAMPDB_TYPE_VARCHARself r3   k/var/www/ticemtrilhas/avaliacao_env/lib/python3.10/site-packages/django/db/backends/oracle/introspection.pydata_types_reverse   s6   z(DatabaseIntrospection.data_types_reversec                    s   |t jkrA|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 n
|t jkrK|jrKdS t ||S )N      r      BigAutoFieldBigIntegerFieldr   SmallAutoFieldBooleanField	AutoFieldIntegerFieldir   	JSONField)r   r"   r   r!   r	   superget_field_type)r2   	data_typedescription	precisionscale	__class__r3   r4   rA   6   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
                user_tables.table_name,
                't',
                user_tab_comments.comments
            FROM user_tables
            LEFT OUTER JOIN
                user_tab_comments
                ON user_tab_comments.table_name = user_tables.table_name
            WHERE
                NOT EXISTS (
                    SELECT 1
                    FROM user_mviews
                    WHERE user_mviews.mview_name = user_tables.table_name
                )
            UNION ALL
            SELECT view_name, 'v', NULL FROM user_views
            UNION ALL
            SELECT mview_name, 'v', NULL FROM user_mviews
        c                    s*   g | ]}t  |d  |d |d qS )r   r      )r   identifier_converter.0rowr1   r3   r4   
<listcomp>g   s    z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>executefetchall)r2   cursorr3   r1   r4   get_table_listO   s   
z$DatabaseIntrospection.get_table_listc                 C   s   | d|g dd | D }|  jd7  _| d| jj|| j g }|jD ]A}|d }|| \}}}	}
}}|i ; }|t	| 
||d ||d |d pRd|d	 pWdg|d
d ||	|
||R   q+|S )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        aS  
            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 display_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,
                user_col_comments.comments as col_comment
            FROM user_tab_cols
            LEFT OUTER JOIN
                user_tables ON user_tables.table_name = user_tab_cols.table_name
            LEFT OUTER JOIN
                user_col_comments ON
                user_col_comments.column_name = user_tab_cols.column_name AND
                user_col_comments.table_name = user_tab_cols.table_name
            WHERE user_tab_cols.table_name = UPPER(%s)
            c              	   S   s8   i | ]\}}}}}}}|||d kr|nd||||fqS )NULLNr3   )rK   columndefault	collationdisplay_sizer   r	   r
   r3   r3   r4   
<dictcomp>   s$    	z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>r   z,SELECT * FROM {} WHERE ROWNUM < 2 AND {} > 0r      r6      r7   N)rO   rP   cache_bust_counterformatr   ops
quote_namerC   appendr   rI   )r2   rQ   
table_name	field_maprC   descnamerW   rU   rV   r   r	   r
   r3   r3   r4   get_table_descriptionl   s`   '*



	
z+DatabaseIntrospection.get_table_descriptionc                 C   s   |  S )z7Identifier comparison is case insensitive under Oracle.)lower)r2   rc   r3   r3   r4   rI      s   z*DatabaseIntrospection.identifier_converterr3   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   )rc   tablerT   )rf   rT   )rO   fetchonerI   
isinstancer   r=   rT   )r2   rQ   r`   table_fieldsrL   fr3   r3   r4   get_sequences   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 foreign keys in 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 r3   rI   )rK   
field_namerel_table_namerel_field_namer1   r3   r4   rX     s    z7DatabaseIntrospection.get_relations.<locals>.<dictcomp>)upperrO   rP   r2   rQ   r`   r3   r1   r4   get_relations   s   
z#DatabaseIntrospection.get_relationsc                    s$   | d|g  fdd| 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)
            ORDER BY
                cols.position
            c                    s   g | ]	}  |d  qS )r   rl   rJ   r1   r3   r4   rM   %  s    zADatabaseIntrospection.get_primary_key_columns.<locals>.<listcomp>rN   rq   r3   r1   r4   get_primary_key_columns  s
   z-DatabaseIntrospection.get_primary_key_columnsc                 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	kddd
|dkrsdn||d|dd||< qZ|S )zu
        Retrieve any constraints or keys (unique, pk, fk, check, index) across
        one or more columns.
        aL  
            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)rv   rw   rx   ry   rz   ru   a  
            SELECT
                ind.index_name,
                LOWER(ind.index_type),
                LOWER(ind.uniqueness),
                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, ind.uniqueness
            rw   Tnormalidx)rv   rw   rx   ry   rz   typeru   orders)rO   rP   rI   split)r2   rQ   r`   constraints
constraintru   pkrw   ry   other_tableother_columntype_r~   r3   r3   r4   get_constraints'  sV   
	
	

z%DatabaseIntrospection.get_constraints)r3   )__name__
__module____qualname__r[   r   r5   rA   rR   rd   rI   rk   rr   rs   r   __classcell__r3   r3   rF   r4   r      s    
 g
$r   )collectionsr   r   	django.dbr   %django.db.backends.base.introspectionr   r   BaseFieldInfor   BaseTableInfodjango.utils.functionalr   _fieldsr   r3   r3   r3   r4   <module>   s    
