3
(h'                 @   s\   d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	 edej
d
 ZG dd deZd	S )    )unicode_literals)
namedtuple)BaseDatabaseIntrospection	FieldInfo	TableInfo)
force_textr   defaultc                   s|   e Zd Z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 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DecimalField)                  i  i  ie  i  i  i:  i;  iZ  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 t| j||}|jr:d|jkr:|dkr.dS |dkr:dS |S )NZnextvalr   Z	AutoFieldr
   ZBigAutoField)superr	   get_field_typer   )selfZ	data_typedescriptionZ
field_type)	__class__ O/tmp/pip-install-q3hcpn_q/Django/django/db/backends/postgresql/introspection.pyr   /   s    z$DatabaseIntrospection.get_field_typec                s    |j d  fdd|j D S )zQ
        Returns 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j|d qS )r   tv)rr      )ignored_tablesr   get).0row)r   r   r   
<listcomp>C   s   z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   )r   r   get_table_list8   s    
z$DatabaseIntrospection.get_table_listc                sL   |j d|g dd |j D  |j d| jjj|   fdd|jD S )zQReturns 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>O   s    z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM %s LIMIT 1c          	      sV   g | ]N}t t|d  f|dd   t|d   d  dk t|d   d f  qS )r   r      ZYES)r   r   )r   r&   )	field_mapr   r   r!   R   s   z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)r"   r#   
connectionopsZ
quote_namer   )r   r$   
table_namer   )r)   r   get_table_descriptionG   s    

z+DatabaseIntrospection.get_table_descriptionc             C   s@   |j d|g i }x(|j D ]}|d |d f||d < qW |S )z
        Returns 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_relationsY   s    
z#DatabaseIntrospection.get_relationsc             C   s$   g }|j d|g |j|j  |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_columnsl   s
    
z%DatabaseIntrospection.get_key_columnsc             C   s   |j | j|g i }xl|j D ]`}d|d kr0q|d |krNddd||d < |d rfd||d  d< |d	 rd||d  d
< qW |S )N r   r   F)primary_keyunique   Tr3   r.   r4   )r"   _get_indexes_queryr#   )r   r$   r,   indexesr    r   r   r   get_indexes}   s    z!DatabaseIntrospection.get_indexesc             C   s6  i }|j dd|g xx|j D ]l\}}}}||krxg |j dk|j dk|j dkrht|d jddnd	d
d
d||< || d j| qW |j dd|g xD|j D ]8\}}||krg d
d
d	dd
d||< || d j| qW |j d|g x>|j D ]2\}}	}
}||k rt|	||
d	d
dd||<  qW |S )zn
        Retrieves any constraints or keys (unique, pk, fk, check, index) across one or more columns.
        a  
            SELECT
                kc.constraint_name,
                kc.column_name,
                c.constraint_type,
                array(SELECT table_name::text || '.' || column_name::text
                      FROM information_schema.constraint_column_usage
                      WHERE constraint_name = kc.constraint_name)
            FROM information_schema.key_column_usage AS kc
            JOIN information_schema.table_constraints AS c ON
                kc.table_schema = c.table_schema AND
                kc.table_name = c.table_name AND
                kc.constraint_name = c.constraint_name
            WHERE
                kc.table_schema = %s AND
                kc.table_name = %s
            ORDER BY kc.ordinal_position ASC
        publicprimary keyr4   zforeign keyr   .r   NF)columnsr3   r4   Zforeign_keycheckindexr<   a  
            SELECT kc.constraint_name, kc.column_name
            FROM information_schema.constraint_column_usage AS kc
            JOIN information_schema.table_constraints AS c ON
                kc.table_schema = c.table_schema AND
                kc.table_name = c.table_name AND
                kc.constraint_name = c.constraint_name
            WHERE
                c.constraint_type = 'CHECK' AND
                kc.table_schema = %s AND
                kc.table_name = %s
        Ta  
            SELECT
                c2.relname,
                ARRAY(
                    SELECT (SELECT attname FROM pg_catalog.pg_attribute WHERE attnum = i AND attrelid = c.oid)
                    FROM unnest(idx.indkey) i
                ),
                idx.indisunique,
                idx.indisprimary
            FROM pg_catalog.pg_class c, pg_catalog.pg_class c2,
                pg_catalog.pg_index idx
            WHERE c.oid = idx.indrelid
                AND idx.indexrelid = c2.oid
                AND c.relname = %s
        )r:   r4   )r"   r#   lowertuplesplitappendlist)r   r$   r,   constraints
constraintcolumnkindZ	used_colsr>   r<   r4   Zprimaryr   r   r   get_constraints   sD    

"

z%DatabaseIntrospection.get_constraints)__name__
__module____qualname__Zdata_types_reverser   r6   r   r%   r-   r/   r1   r8   rH   __classcell__r   r   )r   r   r	      s4   
	r	   N)r   )
__future__r   collectionsr   Z%django.db.backends.base.introspectionr   r   r   Zdjango.utils.encodingr   _fieldsr	   r   r   r   r   <module>   s
   