U
    8ÄT_…1  ã                   @   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)Ú
FIELD_TYPE)Ú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ejdiZ‡ fdd„Zdd„ Zdd„ Zddd„Zdd„ Zdd„ Zdd„ Z dd„ Z!dd„ Z"‡  Z#S ) ÚDatabaseIntrospectionZ	TextFieldZ	CharFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldÚIntegerFieldÚ	JSONFieldÚBigIntegerFieldÚSmallIntegerFieldZ	TimeFieldc                    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PositiveSmallIntegerFieldr   )ÚsuperÚget_field_typer	   r
   r   )ÚselfZ	data_typeÚdescriptionZ
field_type©Ú	__class__© úJ/tmp/pip-unpacked-wheel-dv63caxw/django/db/backends/mysql/introspection.pyr   )   s$    
z$DatabaseIntrospection.get_field_typec                 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>B   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| d|g¡ dd„ | ¡ D ƒ}| d|g¡ dd„ | ¡ D ƒ}| d| j j |¡ ¡ dd	„ }g }|jD ]v}||d
  }| 	t
|dd… ||jƒp°|d ||jƒpÀ|d ||jƒpÐ|d |d |j|j|j|d
 |kfžŽ ¡ q€|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   Ú	<setcomp>V   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 | ]}|d  t |Ž “qS r'   )r   )r    Úliner   r   r   Ú
<dictcomp>f   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_intj   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)   Úinfor   r   r   Úget_table_descriptionE   s6    ù	÷



÷z+DatabaseIntrospection.get_table_descriptionr   c                 C   s2   |   ||¡D ] }d|jkr||jdœg  S qg S )Nr   )ÚtableÚcolumn)r>   r	   Úname)r   r%   r:   Ztable_fieldsr;   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%   r:   Ú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)r#   Úextendr$   )r   r%   r:   Zkey_columnsr   r   r   rC   �   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   )r#   Zfetchoner3   r5   Z_mysql_storage_engine)r   r%   r:   Úresultr   r   r   Úget_storage_engineŸ   s    ý
z(DatabaseIntrospection.get_storage_enginec                 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 r+   )Zis_whitespace)r    Útokenr   r   r   Ú	<genexpr>°   s      zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>r   éÿÿÿÿ)r   ÚsqlparseÚparseÚflattenÚttypeÚtokensÚNamer3   r6   r7   ÚvalueÚadd)r   Úcheck_clauseÚcolumnsZcheck_columnsZ	statementrP   rI   r   r   r   Ú_parse_constraint_columns­   s    ÿþýz/DatabaseIntrospection._parse_constraint_columnsc                 C   s*  i }d}|  ||g¡ | ¡ D ]J\}}}}||krVtƒ dddd|rJ||fnddœ||< || d  |¡ qd}	|  |	|g¡ | ¡ D ]F\}}
|
 ¡ dkr²d|| d	< d|| d
< q„|
 ¡ d
kr„d|| d
< q„| jjj�rjd}dd„ |  ||¡D ƒ}| jj	�rd}	nd}	|  |	|g¡ | ¡ D ]L\}}|  
||¡}t|ƒ|hk�rP|d7 }d| }|ddddddœ||< �q|  d| jj |¡ ¡ dd„ | ¡ D ƒD ]p\}}}}}}||k�rÄtƒ dddddœ||< d|| d< |dk�ràtjn| ¡ || d< || 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)rU   Úprimary_keyÚuniqueÚindexÚcheckÚforeign_keyrU   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 keyTrW   rX   r   c                 S   s   h | ]
}|j ’qS r   )rA   )r    r=   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 )Nr1   é
   r   )r    Úxr   r   r   r"     s     z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)rU   rW   rX   rZ   r[   rY   ZBTREEÚtype)r#   r$   r   rS   Úlowerr3   r5   Z can_introspect_check_constraintsr>   r4   rV   Úsetr6   r7   r   ÚsuffixÚvaluesÚlist)r   r%   r:   rD   Z
name_queryÚ
constraintr@   Z	ref_tableZ
ref_columnZ
type_queryÚkindZunnamed_constraints_indexrU   rT   Zconstraint_columnsr?   Z
non_uniquerY   ZcolseqÚtype_r   r   r   Úget_constraintsº   sn    	ú

ú	"
û
 z%DatabaseIntrospection.get_constraints)r   )$Ú__name__Ú
__module__Ú__qualname__r   ZBLOBZCHARZDECIMALZ
NEWDECIMALZDATEZDATETIMEZDOUBLEÚFLOATZINT24ZJSONÚLONGZLONGLONGZSHORTÚSTRINGZTIMEÚ	TIMESTAMPZTINYZ	TINY_BLOBZMEDIUM_BLOBZ	LONG_BLOBZ
VAR_STRINGZdata_types_reverser   r&   r>   rB   rE   rC   rH   rV   rg   Ú__classcell__r   r   r   r   r      sh                        ë8
r   )Úcollectionsr   rL   ZMySQLdb.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   
