3
(hr<                 @   sz   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G dd deZdS )    )
namedtupleN)	FieldType)BaseDatabaseIntrospection	FieldInfo	TableInfo)Index)
OrderedSetr   extrais_unsignedhas_json_constraint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 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#  Z$S )"DatabaseIntrospectionZ	TextFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldIntegerField	JSONFieldBigIntegerFieldSmallIntegerFieldZ	CharFieldZ	TimeFieldc                st   t  j||}d|jkr<|dkr$dS |dkr0dS |dkr<dS |jrf|dkrNdS |dkrZd	S |dkrfd
S |jrpdS |S )Nauto_incrementr   Z	AutoFieldr   ZBigAutoFieldr   ZSmallAutoFieldZPositiveBigIntegerFieldZPositiveIntegerFieldZPositiveSmallIntegerFieldr   )superget_field_typer	   r
   r   )selfZ	data_typedescriptionZ
field_type)	__class__ X/tmp/pip-install-q3hcpn_q/mysql-connector-python/mysql/connector/django/introspection.pyr   E   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 | ]"}t |d  dddj|d qS )r   tv)z
BASE TABLEZVIEW   )r   get).0rowr   r   r   
<listcomp>^   s   z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   r   r   get_table_list[   s    
z$DatabaseIntrospection.get_table_listc             C   s
  i }| j jr6| j jjr6|jd|g dd |j D }|jd|g dd |j D }|jd| j jj|  dd	 }g }x|jD ]}||d
  }|dd \}	}
}|j	t
|	|
|||jp|d ||jp|d ||jp|d |d |j|j|j|d
 |k qW |S )zj
        Return a description of the table with the DB-API cursor.description
        interface."
        aZ  
                SELECT c.constraint_name AS column_name
                FROM information_schema.check_constraints AS c
                WHERE
                    c.table_name = %s AND
                    LOWER(c.check_clause) = 'json_valid(`' + LOWER(c.constraint_name) + '`)' AND
                    c.constraint_schema = DATABASE()
            c             S   s   h | ]}|d  qS )r   r   )r   r   r   r   r   	<setcomp>r   s    z>DatabaseIntrospection.get_table_description.<locals>.<setcomp>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>   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_int   s    z;DatabaseIntrospection.get_table_description.<locals>.to_intr   N            )
connectionmysql_is_mariadbfeaturesZcan_introspect_json_fieldr!   r"   ops
quote_namer   appendr   max_lenZnum_precZ	num_scaleZcolumn_defaultr	   r
   )r   r#   
table_nameZjson_constraints
field_infor*   fieldsr&   infonameZ	type_codeZdisplay_sizer   r   r   get_table_descriptiona   s6    
	
z+DatabaseIntrospection.get_table_descriptionc             C   s2   x,| j ||D ]}d|jkr||jdgS qW g S )Nr   )tablecolumn)r;   r	   r:   )r   r#   r6   Ztable_fieldsr7   r   r   r   get_sequences   s    
z#DatabaseIntrospection.get_sequencesc             C   s4   | 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#   r6   constraintsZ	relationsZmy_fieldnameZother_tableZother_fieldr   r   r   get_relations   s
    z#DatabaseIntrospection.get_relationsc             C   s$   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#   r6   Zkey_columnsr   r   r   r?      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PRIMARYTrD   rE   )	r!   formatr/   r2   r3   listr"   setadd)r   r#   r6   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   rD   r   N)rK   items)r   r#   r6   r=   r   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
        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/   r1   Z_mysql_storage_engine)r   r#   r6   resultr   r   r   get_storage_engine   s    
z(DatabaseIntrospection.get_storage_enginec             C   s   t  }tj|d }dd |j D }xV|D ]N}|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   rR   )r   sqlparseparseflattenZttypetokensNamer/   r2   r3   valuerI   )r   check_clausecolumnsZcheck_columnsZ	statementrV   rP   r   r   r   _parse_constraint_columns   s    
z/DatabaseIntrospection._parse_constraint_columnsc             C   s>  i }d}|j ||g xV|j D ]J\}}}}||krXt dddd|rL||fndd||< || d j| q W d}	|j |	|g xR|j D ]F\}}
|
j dkrd|| d	< d|| d
< q|
j d
krd|| d
< qW | jjjrvd}dd | j||D }| jj	r
d}	nd}	|j |	|g xX|j D ]L\}}| j
||}t||hkrZ|d7 }d| }|dddddd||< q&W |j d| jjj|  xdd |j D D ]p\}}}}}}||krt ddddd||< d|| d< |dkrtjn|j || d< || d j| qW x"|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`
        FN)rZ   rD   rE   indexcheckforeign_keyrZ   z
            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 keyTrD   rE   r   c             S   s   h | ]
}|j qS r   )r:   )r   r9   r   r   r   r%   )  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    R  s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)rZ   rD   rE   r]   r^   r\   ZBTREEtype)r!   r"   r   rI   lowerr/   r1   Z can_introspect_check_constraintsr;   r0   r[   rH   r2   r3   r   suffixvaluesrG   )r   r#   r6   r@   Z
name_query
constraintr=   Z	ref_tableZ
ref_columnZ
type_querykindZunnamed_constraints_indexrZ   rY   Zconstraint_columnsr<   Z
non_uniquer\   Zcolseqtype_r   r   r   get_constraints   sh    

$
 z%DatabaseIntrospection.get_constraints)%__name__
__module____qualname__r   ZBLOBZDECIMALZ
NEWDECIMALZDATEZDATETIMEZDOUBLEFLOATZINT24ZJSONLONGZLONGLONGZSHORTSTRINGZTIMEZ	TIMESTAMPZTINYZ	TINY_BLOBZMEDIUM_BLOBZ	LONG_BLOBZ
VAR_STRINGZdata_types_reverser   r$   r;   r>   rA   r?   rK   rM   rO   r[   rh   __classcell__r   r   )r   r   r   -   s>   
;	r   )r	   r
   r   )collectionsr   rS   Zmysql.connector.constantsr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.db.modelsr   Zdjango.utils.datastructuresr   _fieldsr   r   r   r   r   r   <module>   s   
