U
    ¤�©j†J  ã                   @   sÒ   d Z ddlmZ ddlmZmZmZmZmZm	Z	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 dd	lmZ er�dd
lmZ edejd ƒZedk r´eddƒZn
eddƒZG dd„ deƒZdS )zDatabase Introspection.é    )Ú
namedtuple)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptionalÚSetÚTupleN)ÚVERSION)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)ÚIndex)Ú
OrderedSet)Ú	FieldType)ÚCursorWrapperr   )ÚextraÚis_unsignedÚhas_json_constraint©é   é   r   ÚInfoLinezNcol_name data_type max_len num_prec num_scale extra column_default is_unsignedzXcol_name data_type max_len num_prec num_scale extra column_default collation is_unsignedc                &       s¨  e Zd 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eeedœ‡ fdd„Zdee dœdd„Zdeee dœdd„Zdee e!e ee"f f dœdd„Z#dee$e! dœdd„Z%d)dee&ee eef  dœdd„Z'dee ee(eef f dœdd„Z)deee(eeef  dœd d!„Z*deedœd"d#„Z+e&e,e e-d$œd%d&„Z.dee ee&f dœd'd(„Z/‡  Z0S )*ÚDatabaseIntrospectionz5Encapsulate backend-specific introspection utilities.Z	TextFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldÚIntegerFieldÚBigIntegerFieldÚSmallIntegerFieldZ	CharFieldZ	TimeField)Ú	data_typeÚdescriptionÚreturnc                    st   t ƒ  ||¡}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PositiveSmallIntegerFieldZ	JSONField)ÚsuperÚget_field_typer   r   r   )Úselfr   r   Z
field_type©Ú	__class__© úH/tmp/pip-unpacked-wheel-d6bt0v6z/mysql/connector/django/introspection.pyr"   l   s$    
z$DatabaseIntrospection.get_field_typer   )Úcursorr   c                 C   s   |  d¡ dd„ | ¡ 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œ |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#   r(   r&   r&   r'   Úget_table_list‚   s    
þz$DatabaseIntrospection.get_table_list)r(   Ú
table_namer   c                 C   s–  i }|  d|g¡ | ¡ }|r&|d nd}tdk rB|  d|g¡ n|  d||g¡ dd„ | ¡ D ƒ}|  d	| jj |¡› d
�¡ ttt	 dœdd„}g }|j
D ]ò}	||	d  }
tdk �r | t|	dd… ||
jƒpØ|	d ||
jƒpè|	d ||
jƒpø|	d |	d |
j|
j|
j|	d |kfžŽ ¡ qž| t|	dd… ||
jƒ�pB|	d ||
jƒ�pT|	d ||
jƒ�pf|	d |	d |
j|
j|
j|
j|	d |kf	žŽ ¡ qž|S )zj
        Return a description of the table with the DB-API cursor.description
        interface."
        z­
            SELECT  table_collation
            FROM    information_schema.tables
            WHERE   table_schema = DATABASE()
            AND     table_name = %s
        r   Ú r   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()
            ax  
                SELECT
                    column_name, data_type, character_maximum_length,
                    numeric_precision, numeric_scale, extra, column_default,
                    CASE
                        WHEN collation_name = %s THEN NULL
                        ELSE collation_name
                    END AS collation_name,
                    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 | ]}|d  t |Ž “qS )r   )r   )r-   Úliner&   r&   r'   Ú
<dictcomp>Å   s      z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM z LIMIT 1)Úir   c                 S   s   | d k	rt | ƒS | S ©N)Úint)r7   r&   r&   r'   Úto_intË   s    z;DatabaseIntrospection.get_table_description.<locals>.to_intNr   é   é   é   )r0   ÚfetchoneÚDJANGO_VERSIONr1   Ú
connectionÚopsÚ
quote_namer   r   r9   r   Úappendr   Úmax_lenZnum_precZ	num_scaleZcolumn_defaultr   r   Z	collation)r#   r(   r3   Zjson_constraintsr.   Zdefault_column_collationÚ
field_infor:   Úfieldsr5   Úinfor&   r&   r'   Úget_table_descriptionŠ   sj    ù	ôðÿ



÷ÿ

öÿz+DatabaseIntrospection.get_table_descriptionc                 C   sÂ   |  d| jj |¡› �¡ t| ¡ ƒ}tƒ }|D ]}|d dkr0| |d ¡ q0i }|D ]d}|d |krjqX|d |krˆdddœ||d < |d dkr¤d	||d  d
< |d sXd	||d  d< qX|S )zReturn indexes from table.úSHOW INDEX FROM r   r+   r   r;   F)Úprimary_keyÚuniqueZPRIMARYTrJ   rK   )r0   r@   rA   rB   Úlistr1   ÚsetÚadd)r#   r(   r3   ZrowsZmulticol_indexesr.   Zindexesr&   r&   r'   Úget_indexesð   s"    z!DatabaseIntrospection.get_indexesc                 C   s2   |   ||¡ ¡ D ]}|d d r|d   S qdS )zP
        Returns the name of the primary key column for the given table
        r+   rJ   r   N)rO   Úitems)r#   r(   r3   Úcolumnr&   r&   r'   Úget_primary_key_column  s    z,DatabaseIntrospection.get_primary_key_columnr&   )r(   r3   Útable_fieldsr   c                 C   s2   |   ||¡D ] }d|jkr||jdœg  S qg S )Nr    )ÚtablerQ   )rH   r   Úname)r#   r(   r3   rS   rE   r&   r&   r'   Úget_sequences  s    
z#DatabaseIntrospection.get_sequencesc                 C   s0   |   ||¡}i }|D ]\}}}||f||< q|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(   r3   ÚconstraintsZ	relationsZmy_fieldnameZother_tableZother_fieldr&   r&   r'   Úget_relations  s
    z#DatabaseIntrospection.get_relationsc                 C   s$   g }|  d|g¡ | | ¡ ¡ |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)r0   Úextendr1   )r#   r(   r3   Zkey_columnsr&   r&   r'   rW   ,  s    ø
z%DatabaseIntrospection.get_key_columnsc                 C   s,   |  d|g¡ | ¡ }|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   )r0   r>   r@   ÚfeaturesZ_mysql_storage_engine)r#   r(   r3   Úresultr&   r&   r'   Úget_storage_engineA  s    þ
z(DatabaseIntrospection.get_storage_engine)Úcheck_clauseÚcolumnsr   c                 C   s~   t ƒ }t |¡d }dd„ | ¡ D ƒ}|D ]N}|jtjjkr*| jj 	|j
¡|j
kr*|j
dd… |kr*| |j
dd… ¡ q*|S )Nr   c                 s   s   | ]}|j s|V  qd S r8   )Zis_whitespace)r-   Útokenr&   r&   r'   Ú	<genexpr>V  s      zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>r+   éÿÿÿÿ)r   ÚsqlparseÚparseÚflattenÚttypeÚtokensÚNamer@   rA   rB   ÚvaluerN   )r#   r^   r_   Zcheck_columnsZ	statementrg   r`   r&   r&   r'   Ú_parse_constraint_columnsQ  s    ÿþýz/DatabaseIntrospection._parse_constraint_columnsc                 C   s|  i }d}|  ||g¡ | ¡ D ]`\}}}}||krltƒ dddd|rJ||fnddœ||< | jjjrlg || d< || d  |¡ qd}	|  |	|g¡ | ¡ D ]F\}}
|
 ¡ dkrÈd	|| d
< d	|| d< qš|
 ¡ dkršd	|| d< qš| jjj�rtd}dd„ |  	||¡D ƒ}d}	|  |	|g¡ | ¡ D ]P\}}|  
||¡}t|ƒ|hk�rZ|d7 }d|› d�}|dddd	ddœ||< �q"|  d| jj |¡› �¡ dd„ | ¡ D ƒD ]¶\}}}}}}}||k�rêtƒ dddddœ||< | jjj�rêg || d< d	|| d< |dk�rtjn| ¡ || d< || d  |¡ | jjj�r || d  |dk�rNdnd¡ �q | ¡ D ]}t|d ƒ|d< �q`|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)r_   rJ   rK   ÚindexÚcheckÚforeign_keyZordersr_   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 keyTrJ   rK   r   c                 S   s   h | ]
}|j ’qS r&   )rU   )r-   rG   r&   r&   r'   Ú	<setcomp>’  s    z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>a  
                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_Ú__rI   c                 S   s"   g | ]}|d d… |d f ‘qS )Nr=   é
   r&   )r-   Úxr&   r&   r'   r/   ¶  s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)r_   rJ   rK   rl   rm   rk   ZBTREEÚtypeÚDZDESCÚASC)r0   r1   r   r@   r[   Zsupports_index_column_orderingrN   ÚlowerZ can_introspect_check_constraintsrH   rj   rM   rA   rB   r   ÚsuffixrC   ÚvaluesrL   )r#   r(   r3   rX   Z
name_queryÚ
constraintrQ   Z	ref_tableZ
ref_columnZ
type_queryÚkindZunnamed_constraints_indexr_   r^   Zconstraint_columnsÚ_rk   ÚorderÚtype_r&   r&   r'   Úget_constraints`  s†    	ú


ÿ ÿú	ÿ
û
ÿ
$z%DatabaseIntrospection.get_constraints)r&   )1Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ZBLOBZDECIMALZ
NEWDECIMALZDATEZDATETIMEZDOUBLEÚFLOATZINT24ÚLONGZLONGLONGZSHORTÚSTRINGZTIMEÚ	TIMESTAMPZTINYZ	TINY_BLOBZMEDIUM_BLOBZ	LONG_BLOBZ
VAR_STRINGZdata_types_reverseÚstrr   r"   r   r   r2   rH   r   r9   ÚboolrO   r   rR   r   rV   r	   rY   rW   r]   r   r   rj   r}   Ú__classcell__r&   r&   r$   r'   r   S   sœ                      í	 þg þ þ ÿ  þ
 þ þ þ 
þr   )r�   Úcollectionsr   Útypingr   r   r   r   r   r   r	   rc   Zdjangor
   r?   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.db.modelsr   Zdjango.utils.datastructuresr   Zmysql.connector.constantsr   Zmysql.connector.django.baser   Ú_fieldsr   r   r&   r&   r&   r'   Ú<module>   s0   $	þþþ