
^Q\*                 @   s   d  d l  m Z d  d l Z d  d l m Z m Z m Z d  d l m Z d  d l	 m
 Z
 d  d l m Z Gd d   d e  Z d S)	    )unicode_literalsN)BaseDatabaseIntrospection	FieldInfo	TableInfo)Index)RemovedInDjango21Warning)
force_textc                   s   e  Z d  Z i d d 6d d 6d d 6d d 6d	 d
 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d  6Z 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   S)0DatabaseIntrospectionZBooleanField   ZBinaryField   BigIntegerField   ZSmallIntegerField   IntegerField   Z	TextField   Z
FloatFieldi  i  ZGenericIPAddressFieldie  Z	CharFieldi  i  Z	DateFieldi:  Z	TimeFieldi;  ZDateTimeFieldiZ  i  i  ZDecimalFieldi  Z	UUIDFieldi  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                sZ   t  t |   j | |  } | j rV d | j k rV | d k rC d S| d k rV d Sn  | S)NZnextvalr   Z	AutoFieldr   ZBigAutoField)superr	   get_field_typedefault)selfZ	data_typedescriptionZ
field_type)	__class__ Q/var/www/dbchiro/venv/build/Django/django/db/backends/postgresql/introspection.pyr   0   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                sQ   g  |  ]G } | d    j  k r t | d  i d d 6d d 6j | d    q S)r   trv   )ignored_tablesr   get).0row)r   r   r   
<listcomp>D   s   	z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   )r   r   get_table_list9   s    z$DatabaseIntrospection.get_table_listc                sf   | 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>P   s   	 z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM %s LIMIT 1c          	      sk   g  |  ]a } 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"   S   s   	z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)r#   r$   
connectionopsZ
quote_namer   )r   r%   
table_namer   )r*   r   get_table_descriptionH   s     z+DatabaseIntrospection.get_table_descriptionc             C   sP   | j  d | g  i  } x0 | 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_relationsZ   s     z#DatabaseIntrospection.get_relationsc             C   s0   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_columnsm   s
    z%DatabaseIntrospection.get_key_columnsc             C   s   t  j d t d d | j |  j | g  i  } x | j   D] } d | d k r[ q? n  | d | k r i d d 6d d	 6| | d <n  | d
 r d | | d d <n  | d r? d | | d d	 <q? q? W| S)Nz:get_indexes() is deprecated in favor of get_constraints().
stacklevelr/    r   r   Fprimary_keyunique   T)warningswarnr   r#   _get_indexes_queryr$   )r   r%   r-   indexesr!   r   r   r   get_indexes~   s    

z!DatabaseIntrospection.get_indexesc          	   C   s  i  } | j  d d | g  x | j   D] \ } } } } } i | d 6| d k d 6| d k d 6| d k r t | j d	 d
   n d d 6| d k d 6d d 6d d 6| d 6| | <q) W| j  d | g  x | j   D] \ }	 } }
 } } } } } |	 | k r i
 | d g k r| n g  d 6| d g k r8| n g  d 6| d 6|
 d 6d d 6d d 6d d 6| d k rwt j n | d 6| d 6| d 6| |	 <q 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
        Zpubliccolumnspr5   ur6   f.r   NZforeign_keyccheckF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;
        ordersTZbtreetype)r>   r?   )r#   r$   tuplesplitr   suffix)r   r%   r-   constraints
constraintr=   kindZ	used_colsrF   rD   r6   ZprimaryrG   type_rE   r   r   r   get_constraints   s:    "++z%DatabaseIntrospection.get_constraints)__name__
__module____qualname__Zdata_types_reverser   r:   r   r&   r.   r0   r2   r<   rP   r   r   )r   r   r	      s8   

	r	   )
__future__r   r8   Z%django.db.backends.base.introspectionr   r   r   Zdjango.db.models.indexesr   Zdjango.utils.deprecationr   Zdjango.utils.encodingr   r	   r   r   r   r   <module>   s   