o
    ˜¨ÊhZ9  ã                   @   st   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G d
d„ deƒZdS )é    )Ú
namedtupleN)Úmodels)ÚBaseDatabaseIntrospection)Ú	FieldInfo)Ú	TableInfo)Úcached_propertyr   )Úis_autofieldÚis_jsonc                       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© r2   úY/var/www/html/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ÚIntegerFieldi�ÿÿÿr   Ú	JSONField)r   r!   r   r    r	   ÚsuperÚget_field_type)r1   Ú	data_typeÚdescriptionÚ	precisionÚscale©Ú	__class__r2   r3   r@   3   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Úrowr0   r2   r3   Ú
<listcomp>^   s    ÿÿz8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r1   Úcursorr2   r0   r3   Úget_table_listL   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	|  
|¡g|dd… ¢|‘|d pSd‘|d	 pYd‘|d
d… ¢|‘|	‘|
‘|‘R Ž ¡ q+|S )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        aB  
            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 )ÚNULLNr2   )rH   ÚcolumnÚdefaultÚ	collationÚinternal_sizer   r	   r2   r2   r3   Ú
<dictcomp>Ž   s     óûÿz?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>r   z,SELECT * FROM {} WHERE ROWNUM < 2 AND {} > 0r   é   r5   é   r6   N)rK   rL   Úcache_bust_counterÚformatr   ÚopsÚ
quote_namerB   Úappendr   rG   )r1   rM   Ú
table_nameÚ	field_maprB   ÚdescÚnamerS   rQ   rR   r   r	   r2   r2   r3   Úget_table_descriptionc   sT   "Ý%ñÿÿ
ÿ
þý
ü
û
úùø	÷
öÿz+DatabaseIntrospection.get_table_descriptionc                 C   s   |  ¡ S )z7Identifier comparison is case insensitive under Oracle.)Úlower)r1   r_   r2   r2   r3   rG   º   s   z*DatabaseIntrospection.identifier_converterr2   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   )r_   ÚtablerP   )rb   rP   )rK   ÚfetchonerG   Ú
isinstancer   r<   rP   )r1   rM   r\   Útable_fieldsrI   Úfr2   r2   r3   Ú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 r2   )rG   )rH   Ú
field_nameÚrel_table_nameÚrel_field_namer0   r2   r3   rT   ó   s    üþÿz7DatabaseIntrospection.get_relations.<locals>.<dictcomp>)ÚupperrK   rL   )r1   rM   r\   r2   r0   r3   Úget_relationsâ   s   ø
ûz#DatabaseIntrospection.get_relationsc                 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   )rK   rc   rG   )r1   rM   r\   rI   r2   r2   r3   Ú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	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)rp   rq   rr   rs   rt   ro   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
            rq   TÚnormalÚidx)rp   rq   rr   rs   rt   Útypero   Úorders)rK   rL   rG   Úsplit)r1   rM   r\   ÚconstraintsÚ
constraintro   Úpkrq   rs   Úother_tableÚother_columnÚtype_rx   r2   r2   r3   Úget_constraints  sV   ä
ú	ë
ú	ì
ø
z%DatabaseIntrospection.get_constraints)r2   )Ú__name__Ú
__module__Ú__qualname__rW   r   r4   r@   rN   r`   rG   rg   rl   rm   r€   Ú__classcell__r2   r2   rE   r3   r
      s    
 W
$r
   )Úcollectionsr   r   Ú	django.dbr   Ú%django.db.backends.base.introspectionr   r   ÚBaseFieldInfor   Údjango.utils.functionalr   Ú_fieldsr
   r2   r2   r2   r3   Ú<module>   s    