U
    eWJ                     @   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rdd
lmZ edejd Zedk re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__ e/var/www/html/assets/scripts/venv/lib/python3.8/site-packages/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rddd||d < |d dkrd	||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   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)rP   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    )tablerR   )rH   r   name)r#   r(   r3   rT   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'   rX   ,  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	statementrh   ra   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rd	|| d
< d	|| d< q|
 dkrd	|| 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rt ddddd||< | jjjrg || 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&   )rV   )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   rm   rn   rl   ZBTREEtypeDZDESCASC)r0   r1   r   r@   r\   Zsupports_index_column_orderingrN   lowerZ can_introspect_check_constraintsrH   rk   rM   rA   rB   r   suffixrC   valuesrL   )r#   r(   r3   rY   Z
name_query
constraintrR   Z	ref_tableZ
ref_columnZ
type_querykindZunnamed_constraints_indexr`   r_   Zconstraint_columns_rl   ordertype_r&   r&   r'   get_constraints`  s    	


 	


$z%DatabaseIntrospection.get_constraints)r&   )1__name__
__module____qualname____doc__r   ZBLOBZDECIMALZ
NEWDECIMALZDATEZDATETIME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   boolrP   r   rS   r   rW   r	   rZ   rX   r^   r   r   rk   r~   __classcell__r&   r&   r$   r'   r   S   s                      	 g     
    
r   )r   collectionsr   typingr   r   r   r   r   r   r	   rd   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   $	