
v^-                 @   s   d  d l  m Z d  d l Z d  d l m Z d  d l m Z m Z m	 Z	 d  d l
 m Z d  d l m Z e d e j d  Z e d
 d  Z Gd d   d e  Z d S)    )
namedtupleN)
FIELD_TYPE)BaseDatabaseIntrospection	FieldInfo	TableInfo)Index)
OrderedSetr   extrais_unsignedInfoLinezNcol_name data_type max_len num_prec num_scale extra column_default is_unsignedc            (       s?  e  Z d  Z e j d e j d e j d e j d e j d e j	 d e j
 d e j d e j d e j d e j d e j d	 e j d e j d
 e j d e j d e j d e j d e j d e j d i Z   f d d   Z d d   Z d d   Z f  d d  Z d d   Z d d   Z d d   Z d d   Z  d d   Z!   S)DatabaseIntrospectionZ	TextFieldZ	CharFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldIntegerFieldBigIntegerFieldSmallIntegerFieldZ	TimeFieldc                s   t    j | |  } d | j k rT | d k r4 d S| d k rD d S| d k rT d S| j r} | d k rm d S| d k r} d	 S| S)
Nauto_incrementr   Z	AutoFieldr   ZBigAutoFieldr   ZSmallAutoFieldZPositiveIntegerFieldZPositiveSmallIntegerField)superget_field_typer	   r
   )selfZ	data_typedescriptionZ
field_type)	__class__ H/tmp/pip-build-8lau8j11/django/django/db/backends/mysql/introspection.pyr   (   s    	z$DatabaseIntrospection.get_field_typec             C   s$   | j  d  d d   | j   D S)z>Return a list of table and view names in the current database.zSHOW FULL TABLESc             S   s<   g  |  ]2 } t  | d  d d d d i j | d    q S)r   z
BASE TABLEtZVIEWv   )r   get).0rowr   r   r   
<listcomp>;   s   	z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   r   r   get_table_list8   s    	z$DatabaseIntrospection.get_table_listc             C   s  | j  d | g  d d   | j   D } | j  d |  j j j |   d d   } g  } x | j D] } | | d } | j t | d d	  | | j  p | d	 | | j	  p | d
 | | j
  p | d | d | j | j | j f     qh W| S)zj
        Return a description of the table with the DB-API cursor.description
        interface."
        a  
            SELECT
                column_name, data_type, character_maximum_length,
                numeric_precision, numeric_scale, extra, column_default,
                CASE
                    WHEN column_type LIKE '%% unsigned' THEN 1
                    ELSE 0
                END AS is_unsigned
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = DATABASE()c             S   s#   i  |  ] } t  |   | d   q S)r   )r   )r   liner   r   r   
<dictcomp>R   s   	 z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM %s LIMIT 1c             S   s   |  d  k	 r t  |   S|  S)N)int)ir   r   r   to_intV   s    z;DatabaseIntrospection.get_table_description.<locals>.to_intr   N            )r   r    
connectionops
quote_namer   appendr   max_lenZnum_precZ	num_scaleZcolumn_defaultr	   r
   )r   r!   
table_name
field_infor'   fieldsr#   infor   r   r   get_table_description>   s$    
	 	z+DatabaseIntrospection.get_table_descriptionc             C   sF   x? |  j  | |  D]+ } d | j k r d | d | j i g Sq Wg  S)Nr   tablecolumn)r5   r	   name)r   r!   r1   Ztable_fieldsr2   r   r   r   get_sequencesh   s    z#DatabaseIntrospection.get_sequencesc             C   sF   |  j  | |  } i  } x' | D] \ } } } | | f | | <q W| S)z
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        )get_key_columns)r   r!   r1   constraintsZ	relationsZmy_fieldnameZother_tableZother_fieldr   r   r   get_relationso   s
    z#DatabaseIntrospection.get_relationsc             C   s0   g  } | j  d | g  | j | j    | S)z
        Return a list of (column_name, referenced_table_name, referenced_column_name)
        for all key columns in the given table.
        a@  
            SELECT column_name, referenced_table_name, referenced_column_name
            FROM information_schema.key_column_usage
            WHERE table_name = %s
                AND table_schema = DATABASE()
                AND referenced_table_name IS NOT NULL
                AND referenced_column_name IS NOT NULL)r   extendr    )r   r!   r1   Zkey_columnsr   r   r   r:   z   s
    z%DatabaseIntrospection.get_key_columnsc             C   s:   | j  d | g  | j   } | s2 |  j j j S| d S)z
        Retrieve the storage engine for a given table. Return the default
        storage engine if the table doesn't exist.
        zBSELECT engine FROM information_schema.tables WHERE table_name = %sr   )r   Zfetchoner,   featuresZ_mysql_storage_engine)r   r!   r1   resultr   r   r   get_storage_engine   s    
z(DatabaseIntrospection.get_storage_enginec             C   s   t    } t j |  d } d d   | j   D } xw | D]o } | j t j j k r< |  j j j	 | j
  | j
 k r< | j
 d d  | k r< | j | j
 d d   q< W| S)Nr   c             s   s   |  ] } | j  s | Vq d  S)N)Zis_whitespace)r   tokenr   r   r   	<genexpr>   s    zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>r   rC   )r   sqlparseparseflattenZttypetokensNamer,   r-   r.   valueadd)r   check_clausecolumnsZcheck_columnsZ	statementrG   rA   r   r   r   _parse_constraint_columns   s    	!z/DatabaseIntrospection._parse_constraint_columnsc             C   s  i  } d } | j  | | g  x | j   D]v \ } } } } | | k r d t   d d d d d d d d d | r | | f n d	 i | | <| | d j |  q, Wd
 }	 | j  |	 | g  xk | j   D]] \ } }
 |
 j   d k r	d | | d <d | | d <q |
 j   d k r d | | d <q W|  j j j rd } d d   |  j | |  D } |  j j	 rvd }	 n d }	 | j  |	 | g  x | j   D]u \ } } |  j
 | |  } t |  | h k r| d 7} d | } d | d d d d d d d d d d	 i | | <qW| j  d |  j j j |   x d d   | j   D D] \ } } } } } } | | k rd t   d d d d d d d d	 i | | <d | | d <| d k rt j n	 | j   | | d <| | d j |  qOWx( | j   D] } t | d  | d <qW| S)zu
        Retrieve any constraints or keys (unique, pk, fk, check, index) across
        one or more columns.
        aX  
            SELECT kc.`constraint_name`, kc.`column_name`,
                kc.`referenced_table_name`, kc.`referenced_column_name`
            FROM information_schema.key_column_usage AS kc
            WHERE
                kc.table_schema = DATABASE() AND
                kc.table_name = %s
            ORDER BY kc.`ordinal_position`
        rL   Zprimary_keyFuniqueindexcheckZforeign_keyNz
            SELECT c.constraint_name, c.constraint_type
            FROM information_schema.table_constraints AS c
            WHERE
                c.table_schema = DATABASE() AND
                c.table_name = %s
        zprimary keyTr   c             S   s   h  |  ] } | j   q Sr   )r8   )r   r4   r   r   r   	<setcomp>   s   	 z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>a  
                    SELECT c.constraint_name, c.check_clause
                    FROM information_schema.check_constraints AS c
                    WHERE
                        c.constraint_schema = DATABASE() AND
                        c.table_name = %s
                a3  
                    SELECT cc.constraint_name, cc.check_clause
                    FROM
                        information_schema.check_constraints AS cc,
                        information_schema.table_constraints AS tc
                    WHERE
                        cc.constraint_schema = DATABASE() AND
                        tc.table_schema = cc.constraint_schema AND
                        cc.constraint_name = tc.constraint_name AND
                        tc.constraint_type = 'CHECK' AND
                        tc.table_name = %s
                r   z__unnamed_constraint_%s__zSHOW INDEX FROM %sc             S   s+   g  |  ]! } | d  d  | d f  q S)Nr*   
   r   )r   xr   r   r   r      s   	 z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>ZBTREEtype)r   r    r   rJ   lowerr,   r>   Z can_introspect_check_constraintsr5   Zmysql_is_mariadbrM   setr-   r.   r   suffixvalueslist)r   r!   r1   r;   Z
name_query
constraintr7   Z	ref_tableZ
ref_columnZ
type_querykindZunnamed_constraints_indexrL   rK   Zconstraint_columnsr6   Z
non_uniquerO   Zcolseqtype_r   r   r   get_constraints   sh    
	"	

 2	)z%DatabaseIntrospection.get_constraints)"__name__
__module____qualname__r   ZBLOBZCHARZDECIMALZ
NEWDECIMALZDATEZDATETIMEZDOUBLEFLOATZINT24LONGZLONGLONGZSHORTSTRINGZTIMEZ	TIMESTAMPZTINYZ	TINY_BLOBZMEDIUM_BLOBZ	LONG_BLOBZ
VAR_STRINGZdata_types_reverser   r"   r5   r9   r<   r:   r@   rM   r]   r   r   )r   r   r      s:   																			*r   )zextrazis_unsigned)collectionsr   rD   ZMySQLdb.constantsr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.db.models.indexesr   Zdjango.utils.datastructuresr   _fieldsr   r   r   r   r   r   <module>   s   