o
    ÕèFhr<  ã                   @   s|   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	 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 )é    )Ú
namedtuple)Úmodels)ÚBaseDatabaseIntrospection)Ú	FieldInfo)Ú	TableInfo)Úoracledbr   )Úis_autofieldÚis_jsonÚcommentr   )r
   c                       s¦   e Zd 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‡ 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é   Ú	DateFieldÚ
FloatFieldÚBinaryFieldÚ	CharFieldÚ	TextFieldÚDurationFieldÚDecimalFieldÚDateTimeFieldc                    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ÚIntegerFieldi�ÿÿÿr   Ú	JSONField)r   ÚNUMBERr   ÚNCLOBr	   ÚsuperÚget_field_type)ÚselfÚ	data_typeÚdescriptionÚ	precisionÚscale©Ú	__class__© ú`/var/www/html/loop/nvenv/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
                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Úrow©r#   r*   r+   Ú
<listcomp>S   s    ÿÿz8DatabaseIntrospection.get_table_list.<locals>.<listcomp>©ÚexecuteÚfetchall)r#   Úcursorr*   r1   r+   Úget_table_list;   s   ÿ
þz$DatabaseIntrospection.get_table_listc                 C   s
  |  d|||g¡ | ¡ }|r|d nd}|  d||g¡ dd„ | ¡ D ƒ}|  jd7  _|  d | jj |¡| j¡¡ g }|jD ]A}|d }|| \}	}
}}}}|i ; }| 	t
|  |¡|d |	|d	 |d
 phd|d pmdg|dd… ¢|
‘|‘|‘|‘|‘R Ž ¡ qA|S )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        a�  
            SELECT user_tables.default_collation
            FROM user_tables
            WHERE
                user_tables.table_name = UPPER(%s) AND
                NOT EXISTS (
                    SELECT 1
                    FROM user_mviews
                    WHERE user_mviews.mview_name = user_tables.table_name
                )
            UNION ALL
            SELECT user_views.default_collation
            FROM user_views
            WHERE user_views.view_name = UPPER(%s)
            UNION ALL
            SELECT user_mviews.default_collation
            FROM user_mviews
            WHERE user_mviews.mview_name = UPPER(%s)
            r   Ú aË  
            SELECT
                user_tab_cols.column_name,
                user_tab_cols.data_default,
                CASE
                    WHEN user_tab_cols.collation = %s
                    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_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   s@   i | ]\}}}}}}}|||r|d kr|  ¡ nd||||f“qS )ÚNULLN)Úrstrip)r/   ÚcolumnÚdefaultÚ	collationÚdisplay_sizer   r	   r
   r*   r*   r+   Ú
<dictcomp>Ÿ   s$    	ñúÿz?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>r   z,SELECT * FROM {} WHERE ROWNUM < 2 AND {} > 0é   r   é   r   N)r4   Úfetchoner5   Úcache_bust_counterÚformatÚ
connectionÚopsÚ
quote_namer%   Úappendr   r-   )r#   r6   Ú
table_namer0   Údefault_table_collationÚ	field_mapr%   ÚdescÚnamer>   r<   r=   r   r	   r
   r*   r*   r+   Úget_table_descriptionX   sl   ì%Ú(ïÿÿ
ù

ú
ùø	÷
öõôÿz+DatabaseIntrospection.get_table_descriptionc                 C   s   |  ¡ S )z7Identifier comparison is case insensitive under Oracle.)Úlower)r#   rM   r*   r*   r+   r-   Ö   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   )rM   Útabler;   )rP   r;   )r4   rB   r-   Ú
isinstancer   r   r;   )r#   r6   rI   Útable_fieldsr0   Úfr*   r*   r+   Ú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 r*   ©r-   )r/   Ú
field_nameÚrel_table_nameÚrel_field_namer1   r*   r+   r?     s    üþÿz7DatabaseIntrospection.get_relations.<locals>.<dictcomp>)Úupperr4   r5   ©r#   r6   rI   r*   r1   r+   Ú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   rU   r.   r1   r*   r+   r2   (  s    zADatabaseIntrospection.get_primary_key_columns.<locals>.<listcomp>r3   rZ   r*   r1   r+   Ú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)r_   r`   ra   rb   rc   r^   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
            r`   TÚnormalÚidx)r_   r`   ra   rb   rc   Útyper^   Úorders)r4   r5   r-   Úsplit)r#   r6   rI   ÚconstraintsÚ
constraintr^   Úpkr`   rb   Úother_tableÚother_columnÚtype_rg   r*   r*   r+   Úget_constraints*  sV   ä
ú	ë
ú	ì
ø
z%DatabaseIntrospection.get_constraints)r*   )Ú__name__Ú
__module__Ú__qualname__rC   r   Ú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Údata_types_reverser"   r7   rN   r-   rT   r[   r\   ro   Ú__classcell__r*   r*   r(   r+   r      s.    ô~
$r   N)Úcollectionsr   Ú	django.dbr   Ú%django.db.backends.base.introspectionr   r   ÚBaseFieldInfor   ÚBaseTableInfoÚ&django.db.backends.oracle.oracledb_anyr   Ú_fieldsr   r*   r*   r*   r+   Ú<module>   s    
ÿ