3
S^(                 @   s   d dl Z 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 e jdZedejd ZG d
d deZdS )    N)
namedtuple)BaseDatabaseIntrospection	FieldInfo	TableInfo)
force_text)
OrderedSet)	FieldTypezQ\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)r   extrac            &       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	iZ fddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd Z dd Z!  Z"S )DatabaseIntrospectionZ	TextFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldIntegerFieldZBigIntegerFieldZSmallIntegerFieldZ	CharFieldZ	TimeFieldc                s,   t t| j||}|dkr(d|jkr(dS |S )Nr   Zauto_incrementZ	AutoField)superr
   get_field_typer	   )selfZ	data_typedescriptionZ
field_type)	__class__ V/tmp/pip-build-8app2_gc/mysql-connector-python/mysql/connector/django/introspection.pyr   -   s    

z$DatabaseIntrospection.get_field_typec             C   s   |j d dd |j D S )z6Returns a list of table names in the current database.zSHOW FULL TABLESc             S   s*   g | ]"}t |d  dddj|d qS )r   tv)z
BASE TABLEZVIEW   )r   get).0rowr   r   r   
<listcomp>9   s   z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   r   r   get_table_list5   s    
z$DatabaseIntrospection.get_table_listc                s   t dd |jd|g t fdd|j D }|jd| jjj|  dd }g }x|jD ]}t|d	 }|j	t
|f|d
d  ||| jp|d ||| jp|d ||| jp|d |d || j|| jf   q^W |S )zl
        Returns a description of the table, with the DB-API
        cursor.description interface."
        InfoLinezBcol_name data_type max_len num_prec num_scale extra column_defaultz
            SELECT column_name, data_type, character_maximum_length,
            numeric_precision, numeric_scale, extra, column_default
            FROM information_schema.columns
            WHERE table_name = %s AND table_schema = DATABASE()c             3   s   | ]}|d   | fV  qdS )r   Nr   )r   line)r   r   r   	<genexpr>R   s    z>DatabaseIntrospection.get_table_description.<locals>.<genexpr>zSELECT * FROM %s LIMIT 1c             S   s   | d k	rt | S | S )N)int)ir   r   r   <lambda>W   s    z=DatabaseIntrospection.get_table_description.<locals>.<lambda>r   r               )r   r   dictr   
connectionops
quote_namer   r   appendr   max_lenZnum_precZ	num_scaleZcolumn_defaultr	   )r   r   
table_nameZ
field_infoZto_intfieldsr   Zcol_namer   )r   r   get_table_description=   s,    
z+DatabaseIntrospection.get_table_descriptionc             C   s   t dd t| j||D S )zu
        Returns a dictionary of {field_name: field_index} for the given table.
        Indexes are 0-based.
        c             s   s   | ]\}}|d  |fV  qdS )r   Nr   )r   r"   dr   r   r   r    p   s    z7DatabaseIntrospection._name_to_index.<locals>.<genexpr>)r(   	enumerater0   )r   r   r.   r   r   r   _name_to_indexk   s    
z$DatabaseIntrospection._name_to_indexc             C   s4   | j ||}i }x|D ]\}}}||f||< qW |S )z
        Returns a dictionary of {field_index: (field_index_other_table,
        other_table)}
        representing all relationships to the given table. Indexes are 0-based.
        )get_key_columns)r   r   r.   constraintsZ	relationsZmy_fieldnameZother_tableZother_fieldr   r   r   get_relationss   s
    z#DatabaseIntrospection.get_relationsc             C   s$   g }|j d|g |j|j  |S )z
        Returns a list of (column_name, referenced_table_name,
        referenced_column_name) for all key columns in given table.
        zSELECT 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   r.   Zkey_columnsr   r   r   r4      s    z%DatabaseIntrospection.get_key_columnsc             C   s   |j dj| jjj| t|j }t }x&|D ]}|d dkr2|j|d  q2W i }xl|D ]d}|d |krpq^|d |krddd||d < |d dkrd	||d  d
< |d s^d	||d  d< q^W |S )NzSHOW INDEX FROM {0}r$   r      r%   F)primary_keyuniqueZPRIMARYTr9   r:   )	r   formatr)   r*   r+   listr   setadd)r   r   r.   ZrowsZmulticol_indexesr   indexesr   r   r   get_indexes   s$    

z!DatabaseIntrospection.get_indexesc             C   s2   x,| j ||j D ]}|d d r|d S qW dS )zP
        Returns the name of the primary key column for the given table
        r   r9   r   N)r@   items)r   r   r.   columnr   r   r   get_primary_key_column   s    z,DatabaseIntrospection.get_primary_key_columnc             C   s,   |j d|g |j }|s$| jjjS |d S )z
        Retrieves the storage engine for a given table. Returns 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   r.   resultr   r   r   get_storage_engine   s    
z(DatabaseIntrospection.get_storage_enginec             C   s  i }d}|j || jjd |g xV|j D ]J\}}}}||krbt dddd|rV||fndd||< || d j| q*W d}	|j |	| jjd |g xR|j D ]F\}}
|
j dkrd	|| d
< d	|| d< q|
j dkrd	|| d< qW |j d| jjj|  xfdd |j D D ]P\}}}}}||krDt ddd	ddd||< d	|| d< || d j| qW x"|j	 D ]}t
|d |d< qrW |S )zv
        Retrieves any constraints or keys (unique, pk, fk, check, index) across
        one or more columns.
        zSELECT 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 = %s AND kc.table_name = %sNAMEFN)columnsr9   r:   indexcheckZforeign_keyrH   z
            SELECT c.constraint_name, c.constraint_type
            FROM information_schema.table_constraints AS c
            WHERE
                c.table_schema = %s AND
                c.table_name = %s
        zprimary keyTr9   r:   zSHOW INDEX FROM %sc             S   s   g | ]}|d d qS )Nr&   r   )r   xr   r   r   r      s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>rI   )r   r)   Zsettings_dictr   r   r>   lowerr*   r+   valuesr<   )r   r   r.   r5   Z
name_query
constraintrB   Z	ref_tableZ
ref_columnZ
type_querykindtableZ
non_uniquerI   Zcolseqr   r   r   get_constraints   sL    

z%DatabaseIntrospection.get_constraints)#__name__
__module____qualname__r   ZBLOBZ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   r0   r3   r6   r4   r@   rC   rF   rQ   __classcell__r   r   )r   r   r
      s:   
.	r
   )r	   )recollectionsr   ZdjangoZ%django.db.backends.base.introspectionr   r   r   Zdjango.utils.encodingr   Zdjango.utils.datastructuresr   Zmysql.connector.constantsr   compileZforeign_key_re_fieldsr
   r   r   r   r   <module>   s   
