î
Ý^Q\ó$  ã               @   sÇ   d  d l  Z  d  d l m 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 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)é    N)Ú
namedtuple)Ú
FIELD_TYPE)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)ÚIndex)Ú
OrderedSet)ÚRemovedInDjango21Warning)Ú
force_textr   ÚextraÚInfoLinezBcol_name data_type max_len num_prec num_scale extra column_defaultc                   sD  e  Z d  Z i d e j 6d e j 6d e j 6d e j 6d e j 6d e j	 6d e j
 6d e j 6d e j 6d e j 6d e j 6d	 e j 6d e j 6d
 e j 6d e j 6d e j 6d e j 6d e j 6d e j 6d e j 6Z ‡  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  ‡  S)ÚDatabaseIntrospectionZ	TextFieldZ	CharFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldÚIntegerFieldÚBigIntegerFieldZSmallIntegerFieldZ	TimeFieldc                sQ   t  t |  ƒ j | | ƒ } d | j k rM | d k r: d S| d k rM d Sn  | S)NZauto_incrementr   Z	AutoFieldr   ZBigAutoField)Úsuperr   Úget_field_typer   )ÚselfZ	data_typeÚdescriptionZ
field_type)Ú	__class__© úL/var/www/dbchiro/venv/build/Django/django/db/backends/mysql/introspection.pyr   *   s    z$DatabaseIntrospection.get_field_typec             C   s$   | j  d ƒ d d „  | j ƒ  Dƒ S)zQ
        Returns a list of table and view names in the current database.
        zSHOW FULL TABLESc             S   s>   g  |  ]4 } t  | d  i d d 6d d 6j | d ƒ ƒ ‘ q S)r   Útz
BASE TABLEÚvZVIEWé   )r   Úget)Ú.0Úrowr   r   r   ú
<listcomp>9   s   	z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r   Úcursorr   r   r   Úget_table_list4   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]§ } t | d ƒ } | j t | f | d d	 … | | | j	 ƒ pµ | d	 | | | j
 ƒ pÏ | d
 | | | j ƒ pé | d | d | | j | | j f Œ  ƒ qh W| S)zd
        Returns a description of the table, with the DB-API cursor.description interface."
        zü
            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             S   s#   i  |  ] } t  | Œ  | d  “ q S)r   )r   )r   Úliner   r   r   ú
<dictcomp>J   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_intN   s    z;DatabaseIntrospection.get_table_description.<locals>.to_intr   r   é   é   é   é   )r   r   Ú
connectionÚopsÚ
quote_namer   r
   Úappendr   Úmax_lenZnum_precZ	num_scaleZcolumn_defaultr   )r   r    Ú
table_nameZ
field_infor&   Úfieldsr"   Zcol_namer   r   r   Úget_table_description<   s$    	 
z+DatabaseIntrospection.get_table_descriptionc             C   sF   |  j  | | ƒ } i  } x' | D] \ } } } | | f | | <q W| S)z˜
        Returns a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        )Úget_key_columns)r   r    r0   ÚconstraintsZ	relationsZmy_fieldnameZother_tableZother_fieldr   r   r   Úget_relationsd   s
    z#DatabaseIntrospection.get_relationsc             C   s0   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.
        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    r0   Zkey_columnsr   r   r   r3   o   s
    z%DatabaseIntrospection.get_key_columnsc             C   s*  t  j d t d d ƒ| j d |  j j j | ƒ ƒ t | j ƒ  ƒ } t	 ƒ  } x2 | D]* } | d d k rX | j
 | d ƒ qX qX Wi  } x— | D] } | d | k r¯ q“ n  | d | k rÞ i d d	 6d d
 6| | d <n  | d d k rd | | d d	 <n  | d s“ d | | d d
 <q“ q“ W| S)Nz:get_indexes() is deprecated in favor of get_constraints().Ú
stacklevelé   zSHOW INDEX FROM %sr'   r   r(   FÚprimary_keyÚuniqueZPRIMARYT)ÚwarningsÚwarnr	   r   r+   r,   r-   Úlistr   ÚsetÚadd)r   r    r0   ÚrowsZmulticol_indexesr   Úindexesr   r   r   Úget_indexes   s(     	
z!DatabaseIntrospection.get_indexesc             C   s:   | j  d | g ƒ | j ƒ  } | s2 |  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    r0   Úresultr   r   r   Úget_storage_engineš   s    
z(DatabaseIntrospection.get_storage_enginec             C   sI  i  } d } | j  | | g ƒ x | j ƒ  D] \ } } } } | | k r– i t ƒ  d 6d d 6d d 6d d 6d d 6| r… | | f n d d	 6| | <n  | | d j | ƒ q, Wd
 }	 | j  |	 | g ƒ xn | j ƒ  D]` \ } }
 |
 j ƒ  d k rd | | d <d | | d <qÕ |
 j ƒ  d k rÕ d | | d <qÕ qÕ W| j  d |  j j j | ƒ ƒ x¾ d d „  | j ƒ  Dƒ D]£ \ } } } } } } | | k rÊi t ƒ  d 6d d 6d d 6d d 6d d	 6| | <n  d | | d <| d k rít j	 n	 | j ƒ  | | d <| | d j | ƒ qsWx( | j
 ƒ  D] } t | d ƒ | d <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`,
                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
        ÚcolumnsFr9   r:   ÚindexÚcheckNZforeign_keyzà
            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 keyTz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   r?   Úlowerr+   r,   r-   r   ÚsuffixÚvaluesr=   )r   r    r0   r4   Z
name_queryÚ
constraintÚcolumnZ	ref_tableZ
ref_columnZ
type_queryÚkindÚtableZ
non_uniquerG   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!   r2   r5   r3   rB   rE   rT   r   r   )r   r   r      s:   



















(r   )zextra)r;   Úcollectionsr   ZMySQLdb.constantsr   Z%django.db.backends.base.introspectionr   r   r   Zdjango.db.models.indexesr   Zdjango.utils.datastructuresr   Zdjango.utils.deprecationr	   Zdjango.utils.encodingr
   Ú_fieldsr   r   r   r   r   r   Ú<module>   s   