o
    gJ                     @   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rHdd
lmZ edejd Zedk rZe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i 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dededef fddZdddee fddZdddedee fddZdddede e!e ee"f f fddZ#dddede$e! fddZ%	d,dddede&dee eef  fddZ'dddede ee(eef f fd d!Z)dddedee(eeef  fd"d#Z*dddedefd$d%Z+d&e&d'e,e de-fd(d)Z.dddede ee&f fd*d+Z/  Z0S )-DatabaseIntrospectionz5Encapsulate backend-specific introspection utilities.	TextFieldDecimalField	DateFieldDateTimeField
FloatFieldIntegerFieldBigIntegerFieldSmallIntegerField	CharField	TimeField	data_typedescriptionreturnc                    st   t  ||}d|jv r|dkrdS |dkrdS |dkrdS |jr3|dkr'dS |dkr-d	S |dkr3d
S |jr8dS |S )Nauto_incrementr   	AutoFieldr    BigAutoFieldr!   SmallAutoFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	JSONField)superget_field_typer   r   r   )selfr$   r%   
field_type	__class__ ^/var/www/html/api-tag/env/lib/python3.10/site-packages/mysql/connector/django/introspection.pyr0   l   s$   
z$DatabaseIntrospection.get_field_type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 TABLEVIEW   )r   get).0rowr5   r5   r6   
<listcomp>   s    z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r1   r7   r5   r5   r6   get_table_list   s   
z$DatabaseIntrospection.get_table_list
table_namec                 C   s  i }| d|g | }|r|d nd}tdk r!| d|g n| d||g dd | D }| d	| jj| d
 dtdtt	 fdd}g }|j
D ]}	||	d  }
tdk r|tg |	dd ||
jpn|	d ||
jpw|	d ||
jp|	d |	d |
j|
j|
j|	d |v R   qP|tg |	dd ||
jp|	d ||
jp|	d ||
jp|	d |	d |
j|
j|
j|
j|	d |v R   qP|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=   liner5   r5   r6   
<dictcomp>   s    z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM z LIMIT 1ir&   c                 S   s   | d urt | S | S N)int)rG   r5   r5   r6   to_int   s   z;DatabaseIntrospection.get_table_description.<locals>.to_intNr            )r@   fetchoneDJANGO_VERSIONrA   
connectionops
quote_namer   r   rI   r%   appendr   max_lennum_prec	num_scalecolumn_defaultr   r   	collation)r1   r7   rC   json_constraintsr>   default_column_collation
field_inforJ   fieldsrE   infor5   r5   r6   get_table_description   s   	


	
	

z+DatabaseIntrospection.get_table_descriptionc                 C   s   | d| jj|  t| }t }|D ]}|d dkr'||d  qi }|D ]2}|d |v r5q,|d |vrDddd||d < |d dkrRd	||d  d
< |d s^d	||d  d< q,|S )zReturn indexes from table.SHOW INDEX FROM r   r;   r   rK   F)primary_keyuniquePRIMARYTr`   ra   )r@   rP   rQ   rR   listrA   setadd)r1   r7   rC   rowsmulticol_indexesr>   indexesr5   r5   r6   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;   r`   r   N)ri   items)r1   r7   rC   columnr5   r5   r6   get_primary_key_column  s
   z,DatabaseIntrospection.get_primary_key_columnr5   table_fieldsc                 C   s2   |  ||D ]}d|jv r||jdg  S qg S )Nr'   )tablerk   )r^   r   name)r1   r7   rC   rm   r[   r5   r5   r6   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)r1   r7   rC   constraints	relationsmy_fieldnameother_tableother_fieldr5   r5   r6   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@   extendrA   )r1   r7   rC   key_columnsr5   r5   r6   rq   ,  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@   rN   rP   features_mysql_storage_engine)r1   r7   rC   resultr5   r5   r6   get_storage_engineA  s   
z(DatabaseIntrospection.get_storage_enginecheck_clausecolumnsc                 C   s~   t  }t|d }dd | D }|D ]'}|jtjjkr<| jj	|j
|j
kr<|j
dd |v r<||j
dd  q|S )Nr   c                 s   s    | ]}|j s|V  qd S rH   )is_whitespace)r=   tokenr5   r5   r6   	<genexpr>V  s    zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>r;   )r   sqlparseparseflattenttypetokensNamerP   rQ   rR   valuere   )r1   r~   r   check_columns	statementr   r   r5   r5   r6   _parse_constraint_columnsQ  s   z/DatabaseIntrospection._parse_constraint_columnsc                 C   sn  i }d}| ||g | D ]0\}}}}||vr6t dddd|r%||fndd||< | jjjr6g || d< || d | qd}	| |	|g | D ]#\}}
|
 dkrdd	|| d
< d	|| d< qM|
 dkrpd	|| d< qM| jjjrd}dd | 	||D }d}	| |	|g | D ]&\}}| 
||}t||hkr|d7 }d| d}|dddd	dd||< q| d| jj|  dd | D D ]W\}}}}}}}||vrt ddddd||< | jjjrg || d< d	|| d< |dkrtjn| || d< || d | | jjjr$|| d |dkr!d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   r`   ra   indexcheckforeign_key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 keyTr`   ra   r   c                 S   s   h | ]}|j qS r5   )ro   )r=   r]   r5   r5   r6   	<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;   __unnamed_constraint___r_   c                 S   s"   g | ]}|d d |d f qS )NrM   
   r5   )r=   xr5   r5   r6   r?     s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)r   r`   ra   r   r   r   BTREEtypeDDESCASC)r@   rA   r   rP   rz   supports_index_column_orderingre   lower can_introspect_check_constraintsr^   r   rd   rQ   rR   r   suffixrS   valuesrc   )r1   r7   rC   rr   
name_query
constraintrk   	ref_table
ref_column
type_querykindunnamed_constraints_indexr   r~   constraint_columns_r   ordertype_r5   r5   r6   get_constraints`  s   	



	


 z%DatabaseIntrospection.get_constraints)r5   )1__name__
__module____qualname____doc__r   BLOBDECIMAL
NEWDECIMALDATEDATETIMEDOUBLEFLOATINT24LONGLONGLONGSHORTSTRINGTIME	TIMESTAMPTINY	TINY_BLOBMEDIUM_BLOB	LONG_BLOB
VAR_STRINGdata_types_reversestrr   r0   r   r   rB   r^   r   rI   boolri   r   rl   r   rp   r	   rw   rq   r}   r   r   r   r   __classcell__r5   r5   r3   r6   r   S   s    	

f


	



r   )r   collectionsr   typingr   r   r   r   r   r   r	   r   djangor
   rO   %django.db.backends.base.introspectionr   r   BaseFieldInfor   django.db.modelsr   django.utils.datastructuresr   mysql.connector.constantsr   mysql.connector.django.baser   _fieldsr   r   r5   r5   r5   r6   <module>   s2   $	