a
    LcòfT-  ã                   @   sp   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)ÚBaseDatabaseIntrospection)Ú	FieldInfo)Ú	TableInfo)ÚIndexr   )Úis_autofieldÚcommentr   )r   c                       s|   e Zd Zdddddddddd	d	d
dddddddddœZdZg Z‡ fdd„Zdd„ Zdd„ Zd dd„Z	dd„ Z
dd„ Z‡  ZS )!ÚDatabaseIntrospectionZBooleanFieldZBinaryFieldÚBigIntegerFieldÚSmallIntegerFieldÚIntegerFieldZ	TextFieldZ
FloatFieldZGenericIPAddressFieldZ	CharFieldZ	DateFieldZ	TimeFieldZDateTimeFieldZDurationFieldZDecimalFieldZ	UUIDFieldZ	JSONField)é   é   é   é   é   é   i¼  i½  ie  i  i  i:  i;  iZ  i   i¢  iò  i¤  i†  iÚ  Zbtreec                    sL   t ƒ  ||¡}|js$|jrHd|jv rH|dkr0dS |dkr<dS |dkrHdS |S )NZnextvalr   Z	AutoFieldr
   ZBigAutoFieldr   ZSmallAutoField)ÚsuperÚget_field_typer   Údefault)ÚselfZ	data_typeÚdescriptionZ
field_type©Ú	__class__© úh/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/django/db/backends/postgresql/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.aB  
            SELECT
                c.relname,
                CASE
                    WHEN c.relispartition THEN 'p'
                    WHEN c.relkind IN ('m', 'v') THEN 'v'
                    ELSE 't'
                END,
                obj_description(c.oid, 'pg_class')
            FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relkind IN ('f', 'm', 'p', 'r', 'v')
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                AND pg_catalog.pg_table_is_visible(c.oid)
        c                    s"   g | ]}|d  ˆ j vrt|Ž ‘qS )r   )Úignored_tablesr   ©Ú.0Úrow©r   r   r   Ú
<listcomp>K   s   þz8DatabaseIntrospection.get_table_list.<locals>.<listcomp>©ÚexecuteÚfetchall)r   Úcursorr   r    r   Úget_table_list8   s    ÿ
þz$DatabaseIntrospection.get_table_listc                    sL   |  d|g¡ dd„ | ¡ D ƒ‰ |  d| jj |¡ ¡ ‡ fdd„|jD ƒS )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        aå  
            SELECT
                a.attname AS column_name,
                NOT (a.attnotnull OR (t.typtype = 'd' AND t.typnotnull)) AS is_nullable,
                pg_get_expr(ad.adbin, ad.adrelid) AS column_default,
                CASE WHEN collname = 'default' THEN NULL ELSE collname END AS collation,
                a.attidentity != '' AS is_autofield,
                col_description(a.attrelid, a.attnum) AS column_comment
            FROM pg_attribute a
            LEFT JOIN pg_attrdef ad ON a.attrelid = ad.adrelid AND a.attnum = ad.adnum
            LEFT JOIN pg_collation co ON a.attcollation = co.oid
            JOIN pg_type t ON a.atttypid = t.oid
            JOIN pg_class c ON a.attrelid = c.oid
            JOIN pg_namespace n ON c.relnamespace = n.oid
            WHERE c.relkind IN ('f', 'm', 'p', 'r', 'v')
                AND c.relname = %s
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                AND pg_catalog.pg_table_is_visible(c.oid)
        c                 S   s   i | ]}|d  |dd… “qS )r   é   Nr   ©r   Úliner   r   r   Ú
<dictcomp>o   ó    z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM %s LIMIT 1c              	      sH   g | ]@}t |j|j|jd u r"|jn|j|j|j|jgˆ |j ¢R Ž ‘qS )N)r   ÚnameZ	type_codeZdisplay_sizeZinternal_sizeÚ	precisionÚscaler(   ©Z	field_mapr   r   r!   s   s   öùøz?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)r#   r$   Ú
connectionÚopsZ
quote_namer   ©r   r%   Ú
table_namer   r/   r   Úget_table_descriptionQ   s    ìÿ
õz+DatabaseIntrospection.get_table_descriptionr   c                    s$   |  dˆ g¡ ‡ fdd„| ¡ D ƒS )Naˆ  
            SELECT
                s.relname AS sequence_name,
                a.attname AS colname
            FROM
                pg_class s
                JOIN pg_depend d ON d.objid = s.oid
                    AND d.classid = 'pg_class'::regclass
                    AND d.refclassid = 'pg_class'::regclass
                JOIN pg_attribute a ON d.refobjid = a.attrelid
                    AND d.refobjsubid = a.attnum
                JOIN pg_class tbl ON tbl.oid = d.refobjid
                    AND tbl.relname = %s
                    AND pg_catalog.pg_table_is_visible(tbl.oid)
            WHERE
                s.relkind = 'S';
        c                    s    g | ]}|d  ˆ |d dœ‘qS )r   r'   )r,   ÚtableÚcolumnr   r   ©r3   r   r   r!   –   s   ÿz7DatabaseIntrospection.get_sequences.<locals>.<listcomp>r"   )r   r%   r3   Ztable_fieldsr   r7   r   Úget_sequences�   s    î
þz#DatabaseIntrospection.get_sequencesc                 C   s    |  d|g¡ 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.
        a{  
            SELECT a1.attname, c2.relname, a2.attname
            FROM pg_constraint con
            LEFT JOIN pg_class c1 ON con.conrelid = c1.oid
            LEFT JOIN pg_class c2 ON con.confrelid = c2.oid
            LEFT JOIN
                pg_attribute a1 ON c1.oid = a1.attrelid AND a1.attnum = con.conkey[1]
            LEFT JOIN
                pg_attribute a2 ON c2.oid = a2.attrelid AND a2.attnum = con.confkey[1]
            WHERE
                c1.relname = %s AND
                con.contype = 'f' AND
                c1.relnamespace = c2.relnamespace AND
                pg_catalog.pg_table_is_visible(c1.oid)
        c                 S   s"   i | ]}|d  |d |d f“qS )r   é   r'   r   r   r   r   r   r*   ²   r+   z7DatabaseIntrospection.get_relations.<locals>.<dictcomp>r"   r2   r   r   r   Úget_relations›   s
    ðz#DatabaseIntrospection.get_relationsc                 C   s  i }|  d|g¡ | ¡ D ]L\}}}}}||dk|dv |dkrNt| dd¡ƒnd|dkd	d|d
œ||< q|  d| j|g¡ | ¡ D ]~\}	}}
}}}}}|	|vr‚|| jkoº|	 d¡ oº|du }|dgkrÊ|ng |dgkrÚ|ng ||
dd	d|rðtjn|||dœ
||	< q‚|S )z·
        Retrieve any constraints or keys (unique, pk, fk, check, index) across
        one or more columns. Also retrieve the definition of expression-based
        indexes.
        aH  
            SELECT
                c.conname,
                array(
                    SELECT attname
                    FROM unnest(c.conkey) WITH ORDINALITY cols(colid, arridx)
                    JOIN pg_attribute AS ca ON cols.colid = ca.attnum
                    WHERE ca.attrelid = c.conrelid
                    ORDER BY cols.arridx
                ),
                c.contype,
                (SELECT fkc.relname || '.' || fka.attname
                FROM pg_attribute AS fka
                JOIN pg_class AS fkc ON fka.attrelid = fkc.oid
                WHERE fka.attrelid = c.confrelid AND fka.attnum = c.confkey[1]),
                cl.reloptions
            FROM pg_constraint AS c
            JOIN pg_class AS cl ON c.conrelid = cl.oid
            WHERE cl.relname = %s AND pg_catalog.pg_table_is_visible(cl.oid)
        Úp)r;   ÚuÚfÚ.r'   NÚcF)ÚcolumnsÚprimary_keyÚuniqueÚforeign_keyÚcheckÚindexÚ
definitionÚoptionsaa  
            SELECT
                indexname,
                array_agg(attname ORDER BY arridx),
                indisunique,
                indisprimary,
                array_agg(ordering ORDER BY arridx),
                amname,
                exprdef,
                s2.attoptions
            FROM (
                SELECT
                    c2.relname as indexname, idx.*, attr.attname, am.amname,
                    CASE
                        WHEN idx.indexprs IS NOT NULL THEN
                            pg_get_indexdef(idx.indexrelid)
                    END AS exprdef,
                    CASE am.amname
                        WHEN %s THEN
                            CASE (option & 1)
                                WHEN 1 THEN 'DESC' ELSE 'ASC'
                            END
                    END as ordering,
                    c2.reloptions as attoptions
                FROM (
                    SELECT *
                    FROM
                        pg_index i,
                        unnest(i.indkey, i.indoption)
                            WITH ORDINALITY koi(key, option, arridx)
                ) idx
                LEFT JOIN pg_class c ON idx.indrelid = c.oid
                LEFT JOIN pg_class c2 ON idx.indexrelid = c2.oid
                LEFT JOIN pg_am am ON c2.relam = am.oid
                LEFT JOIN
                    pg_attribute attr ON attr.attrelid = c.oid AND attr.attnum = idx.key
                WHERE c.relname = %s AND pg_catalog.pg_table_is_visible(c.oid)
            ) s2
            GROUP BY indexname, indisunique, indisprimary, amname, exprdef, attoptions;
        Z_btreeT)
r@   ÚordersrA   rB   rC   rD   rE   ÚtyperF   rG   )r#   r$   ÚtupleÚsplitÚindex_default_access_methodÚendswithr   Úsuffix)r   r%   r3   ÚconstraintsÚ
constraintr@   ÚkindZ	used_colsrG   rE   rB   ÚprimaryrH   Útype_rF   Zbasic_indexr   r   r   Úget_constraints´   s^    ëø(×4÷

üú	öz%DatabaseIntrospection.get_constraints)r   )Ú__name__Ú
__module__Ú__qualname__Zdata_types_reverserL   r   r   r&   r4   r8   r:   rT   Ú__classcell__r   r   r   r   r	      s:   ì0
r	   N)Úcollectionsr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   ZBaseTableInfoZdjango.db.modelsr   Ú_fieldsr	   r   r   r   r   Ú<module>   s   