B
    ©0H[ÿ-  ã               @   sH   d dl Z d dlmZmZmZ d dlmZ d dlmZ G dd„ deƒZ	dS )é    N)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)ÚIndex)ÚRemovedInDjango21Warningc                   sˆ   e Zd Zdddddddddd	d	d
dddddddœZg ZdZ‡ fdd„Zdd„ Zdd„ Zd"dd„Z	dd„ Z
dd„ Zdd„ Zd d!„ Z‡  ZS )#ÚDatabaseIntrospectionZBooleanFieldZBinaryFieldÚBigIntegerFieldZSmallIntegerFieldÚIntegerFieldZ	TextFieldZ
FloatFieldZGenericIPAddressFieldZ	CharFieldZ	DateFieldZ	TimeFieldZDateTimeFieldZDecimalFieldZ	UUIDField)é   é   é   é   é   é   i¼  i½  ie  i  i  i:  i;  iZ  i   iò  i¤  i†  a…  
        SELECT attr.attname, idx.indkey, idx.indisunique, idx.indisprimary
        FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
            pg_catalog.pg_index idx, pg_catalog.pg_attribute attr
        WHERE c.oid = idx.indrelid
            AND idx.indexrelid = c2.oid
            AND attr.attrelid = c.oid
            AND attr.attnum = idx.indkey[0]
            AND c.relname = %sc                s:   t ƒ  ||¡}|jr6d|jkr6|dkr*dS |dkr6dS |S )NZnextvalr	   Z	AutoFieldr   ZBigAutoField)ÚsuperÚget_field_typeÚdefault)ÚselfZ	data_typeÚdescriptionZ
field_type)Ú	__class__© úoC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\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.a=  
            SELECT c.relname, c.relkind
            FROM pg_catalog.pg_class c
            LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
            WHERE c.relkind IN ('r', 'v')
                AND n.nspname NOT IN ('pg_catalog', 'pg_toast')
                AND pg_catalog.pg_table_is_visible(c.oid)c                s8   g | ]0}|d  ˆ j krt|d  dddœ |d ¡ƒ‘qS )r   ÚtÚv)Úrr   é   )Úignored_tablesr   Úget)Ú.0Úrow)r   r   r   ú
<listcomp>?   s   z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r   Úcursorr   )r   r   Úget_table_list6   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.
        zŠ
            SELECT column_name, is_nullable, column_default
            FROM information_schema.columns
            WHERE table_name = %sc             S   s   i | ]}|d d… |d “qS )r   Nr   r   )r   Úliner   r   r   ú
<dictcomp>N   s    z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM %s LIMIT 1c                s<   g | ]4}t |d d… ˆ |j d  dkˆ |j d f Ž ‘qS )r   é   ZYESr   )r   Úname)r   r%   )Ú	field_mapr   r   r    Q   s   z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)r!   r"   Ú
connectionÚopsZ
quote_namer   )r   r#   Ú
table_namer   )r)   r   Úget_table_descriptionC   s    

z+DatabaseIntrospection.get_table_descriptionr   c             C   sB   g }|  d|g¡ x*| ¡ D ]}| |d ||d dœ¡ qW |S )NaÈ  
            SELECT s.relname as sequence_name, col.attname
            FROM pg_class s
                JOIN pg_namespace sn ON sn.oid = s.relnamespace
                JOIN pg_depend d ON d.refobjid = s.oid AND d.refclassid='pg_class'::regclass
                JOIN pg_attrdef ad ON ad.oid = d.objid AND d.classid = 'pg_attrdef'::regclass
                JOIN pg_attribute col ON col.attrelid = ad.adrelid AND col.attnum = ad.adnum
                JOIN pg_class tbl ON tbl.oid = ad.adrelid
                JOIN pg_namespace n ON n.oid = tbl.relnamespace
            WHERE s.relkind = 'S'
              AND d.deptype in ('a', 'n')
              AND n.nspname = 'public'
              AND tbl.relname = %s
        r   r   )r(   ÚtableÚcolumn)r!   r"   Úappend)r   r#   r,   Ztable_fieldsÚ	sequencesr   r   r   r   Úget_sequencesU   s    
z#DatabaseIntrospection.get_sequencesc             C   s@   |  d|g¡ i }x(| ¡ D ]}|d |d f||d < qW |S )z—
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        aÑ  
            SELECT c2.relname, a1.attname, 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'é   r   r   )r!   r"   )r   r#   r,   Z	relationsr   r   r   r   Úget_relationsi   s    
z#DatabaseIntrospection.get_relationsc             C   s$   g }|  d|g¡ | | ¡ ¡ |S )Na	  
            SELECT kcu.column_name, ccu.table_name AS referenced_table, ccu.column_name AS referenced_column
            FROM information_schema.constraint_column_usage ccu
            LEFT JOIN information_schema.key_column_usage kcu
                ON ccu.constraint_catalog = kcu.constraint_catalog
                    AND ccu.constraint_schema = kcu.constraint_schema
                    AND ccu.constraint_name = kcu.constraint_name
            LEFT JOIN information_schema.table_constraints tc
                ON ccu.constraint_catalog = tc.constraint_catalog
                    AND ccu.constraint_schema = tc.constraint_schema
                    AND ccu.constraint_name = tc.constraint_name
            WHERE kcu.table_name = %s AND tc.constraint_type = 'FOREIGN KEY')r!   Úextendr"   )r   r#   r,   Zkey_columnsr   r   r   Úget_key_columns|   s
    
z%DatabaseIntrospection.get_key_columnsc             C   s–   t jdtdd� | | j|g¡ i }xl| ¡ D ]`}d|d kr@q.|d |kr^dddœ||d < |d	 rvd
||d  d< |d r.d
||d  d< q.W |S )Nz:get_indexes() is deprecated in favor of get_constraints().r3   )Ú
stacklevelú r   r   F)Úprimary_keyÚuniqueé   Tr9   r:   )ÚwarningsÚwarnr   r!   Ú_get_indexes_queryr"   )r   r#   r,   Úindexesr   r   r   r   Úget_indexes�   s    
z!DatabaseIntrospection.get_indexesc             C   sò   i }|  dd|g¡ xX| ¡ D ]L\}}}}}||dk|dk|dkrRt| dd¡ƒnd|d	kd
d|dœ||< qW |  d|g¡ xp| ¡ D ]d\}	}}
}}}}}|	|kr†|dgkr°|ng |dgkrÀ|ng ||
dd
d|dkrÚtjn|||dœ
||	< q†W |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.
        aí  
            SELECT
                c.conname,
                array(
                    SELECT attname
                    FROM (
                        SELECT unnest(c.conkey) AS colid,
                               generate_series(1, array_length(c.conkey, 1)) AS arridx
                    ) AS cols
                    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
            JOIN pg_namespace AS ns ON cl.relnamespace = ns.oid
            WHERE ns.nspname = %s AND cl.relname = %s
        ÚpublicÚp)rB   ÚuÚfÚ.r   NÚcF)Úcolumnsr9   r:   Úforeign_keyÚcheckÚindexÚ
definitionÚoptionsa²  
            SELECT
                indexname, array_agg(attname ORDER BY rnum), indisunique, indisprimary,
                array_agg(ordering ORDER BY rnum), amname, exprdef, s2.attoptions
            FROM (
                SELECT
                    row_number() OVER () as rnum, 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 'btree' THEN
                            CASE (option & 1)
                                WHEN 1 THEN 'DESC' ELSE 'ASC'
                            END
                    END as ordering,
                    c2.reloptions as attoptions
                FROM (
                    SELECT
                        *, unnest(i.indkey) as key, unnest(i.indoption) as option
                    FROM pg_index i
                ) 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
            ) s2
            GROUP BY indexname, indisunique, indisprimary, amname, exprdef, attoptions;
        TZbtree)
rG   Úordersr9   r:   rH   rI   rJ   ÚtyperK   rL   )r!   r"   ÚtupleÚsplitr   Úsuffix)r   r#   r,   ÚconstraintsÚ
constraintrG   ÚkindZ	used_colsrL   rJ   r:   ZprimaryrM   Útype_rK   r   r   r   Úget_constraints¦   s6    
z%DatabaseIntrospection.get_constraints)r   )Ú__name__Ú
__module__Ú__qualname__Zdata_types_reverser   r>   r   r$   r-   r2   r4   r6   r@   rV   Ú__classcell__r   r   )r   r   r   
   s8   
	
r   )
r<   Z%django.db.backends.base.introspectionr   r   r   Zdjango.db.models.indexesr   Zdjango.utils.deprecationr   r   r   r   r   r   Ú<module>   s   