î
ªÍ XÜ'  ã               @   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 Gd d „  d e ƒ Z d	 S)é    )Úunicode_literals)Ú
namedtuple)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)Ú
force_textr   Údefaultc                   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 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).Ú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¤  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_typer   )ÚselfZ	data_typeÚdescriptionZ
field_type)Ú	__class__© úY/home/ubuntu/projects/ifolica/build/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                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>C   s   	z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r   Úcursorr   )r   r   Úget_table_list8   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>O   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!   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   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_relationsY   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_columnsl   s
    z%DatabaseIntrospection.get_key_columnsc             C   sº   | j  |  j | g ƒ i  } x— | j ƒ  D]‰ } d | d k rE q) n  | d | k rt i d d 6d d 6| | d <n  | d r“ d | | d d <n  | d	 r) d | | d d <q) q) W| S)
Nú r   r   FÚprimary_keyÚuniqueé   Tr.   )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]° \ } } } } | | k rÄ i g  d 6| j ƒ  d k d 6| j ƒ  d k d 6| j ƒ  d k r¥ t | d j d	 d
 ƒ ƒ n d d 6d d 6d d 6| | <n  | | d j | ƒ q) W| j  d d | g ƒ xr | j ƒ  D]d \ } } | | k rOi g  d 6d d 6d d 6d d 6d d 6d d 6| | <n  | | d j | ƒ q W| j  d | g ƒ xi | j ƒ  D][ \ } }	 }
 } | | k rˆi t |	 ƒ d 6| d 6|
 d 6d d 6d d 6d d 6| | <qˆqˆW| 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
        ZpublicÚcolumnsúprimary keyr3   r4   zforeign keyr   Ú.r   NZforeign_keyFÚcheckÚindexaê  
            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:   zunique)r"   r#   ÚlowerÚtupleÚsplitÚappendÚlist)r   r$   r,   ÚconstraintsÚ
constraintÚcolumnÚkindZ	used_colsr=   r9   r4   Zprimaryr   r   r   Úget_constraints’   sJ    5z%DatabaseIntrospection.get_constraints)Ú__name__Ú
__module__Ú__qualname__Zdata_types_reverser   r6   r   r%   r-   r/   r1   r8   rG   r   r   )r   r   r	      s6   

	r	   N)zdefault)Ú
__future__r   Úcollectionsr   Z%django.db.backends.base.introspectionr   r   r   Zdjango.utils.encodingr   Ú_fieldsr	   r   r   r   r   Ú<module>   s
   