o
    uvXj^,  ã                   @   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‡  ZS )ÚDatabaseIntrospectionÚBinaryFieldÚ	TextFieldÚ	DateFieldÚ	CharFieldÚDurationFieldÚ
FloatFieldÚDecimalFieldÚDateTimeFieldé   c                    sl   |t jkr/|dd… \}}|dkr)|dkr|jrdS dS |dkr"dS |jr'd	S d
S |dkr/dS tƒ  ||¡S )Né   é   r   é   ÚBigAutoFieldÚBigIntegerFieldr   ÚBooleanFieldÚ	AutoFieldÚIntegerFieldi�ÿÿÿr   )Ú	cx_OracleÚNUMBERr   ÚsuperÚget_field_type)ÚselfÚ	data_typeÚdescriptionÚ	precisionÚscale©Ú	__class__© úd/var/www/html/myproject/venv/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>A   s   $ z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r   Úcursorr%   r+   r&   Úget_table_list1   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>W   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   r/   Ú
table_nameÚ	field_mapr    ÚdescÚnamer4   r3   r   r%   r%   r&   Úget_table_descriptionC   sD   óþþ
ÿ
ÿÿ
ÿ
þ
þþþz+DatabaseIntrospection.get_table_descriptionc                 C   s   |  ¡ S )z7Identifier comparison is case insensitive under Oracle.)Úlower)r   rA   r%   r%   r&   r'   j   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   )rA   Útabler2   )rD   r2   )r-   Úfetchoner'   Ú
isinstancer   r   r2   )r   r/   r>   Útable_fieldsr*   Úfr%   r%   r&   Úget_sequencesn   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&   r5   ›   s    ýþÿz7DatabaseIntrospection.get_relations.<locals>.<dictcomp>)Úupperr-   r.   ©r   r/   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 )NrJ   )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-   rN   r.   rO   r%   r+   r&   Úget_key_columns¢   s   ù
þz%DatabaseIntrospection.get_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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)rW   rX   rY   rZ   r[   rV   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)rW   rX   rY   rZ   r[   ÚtyperV   Úorders)r-   r.   r'   Úsplit)r   r/   r>   ÚconstraintsÚ
constraintrV   ÚpkrX   rZ   Úother_tableÚother_columnÚtype_r_   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_reverser8   r   r0   rB   r'   rI   rP   rT   rg   Ú__classcell__r%   r%   r#   r&   r      s.    ô'
r   )Úcollectionsr   r   Ú	django.dbr   Ú%django.db.backends.base.introspectionr   r   ÚBaseFieldInfor   Ú_fieldsr   r%   r%   r%   r&   Ú<module>   s    