o
    :Zc-                     @   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InfoLinezNcol_name data_type max_len num_prec num_scale extra column_default is_unsignedc                       s   e 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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 )DatabaseIntrospection	TextField	CharFieldDecimalField	DateFieldDateTimeField
FloatFieldIntegerFieldBigIntegerFieldSmallIntegerField	TimeFieldc                    s^   t  ||}d|jv r|dkrdS |dkrdS |dkrdS |jr-|dkr'dS |dkr-d	S |S )
Nauto_incrementr   	AutoFieldr   BigAutoFieldr   SmallAutoFieldPositiveIntegerFieldPositiveSmallIntegerField)superget_field_typer	   r
   )self	data_typedescription
field_type	__class__ \/var/www/chikooza/env/lib/python3.10/site-packages/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 TABLEVIEW   )r   get).0rowr%   r%   r&   
<listcomp>;   s    "z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr%   r%   r&   get_table_list8   s   
z$DatabaseIntrospection.get_table_listc                 C   s   | d|g dd | D }| d| jj|  dd }g }|jD ]>}||d  }|tg |dd	 ||jp?|d	 ||j	pH|d
 ||j
pQ|d |d |j|j|jR   q%|S )zj
        Return a description of the table with the DB-API cursor.description
        interface."
        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>R   s    z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM %s LIMIT 1c                 S   s   | d urt | S | S N)int)ir%   r%   r&   to_intV   s   z;DatabaseIntrospection.get_table_description.<locals>.to_intr   N            )r/   r0   
connectionops
quote_namer!   appendr   max_lennum_prec	num_scalecolumn_defaultr	   r
   )r   r1   
table_name
field_infor8   fieldsr3   infor%   r%   r&   get_table_description>   s6   
	



z+DatabaseIntrospection.get_table_descriptionr%   c                 C   s2   |  ||D ]}d|jv r||jdg  S qg S )Nr   )tablecolumn)rI   r	   name)r   r1   rE   table_fieldsrF   r%   r%   r&   get_sequencesh   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   r1   rE   constraints	relationsmy_fieldnameother_tableother_fieldr%   r%   r&   get_relationso   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/   extendr0   )r   r1   rE   key_columnsr%   r%   r&   rO   z   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/   fetchoner=   features_mysql_storage_engine)r   r1   rE   resultr%   r%   r&   get_storage_engine   s   
z(DatabaseIntrospection.get_storage_enginec                 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 r5   )is_whitespace)r,   tokenr%   r%   r&   	<genexpr>   s    zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>r*   )r   sqlparseparseflattenttypetokensNamer=   r>   r?   valueadd)r   check_clausecolumnscheck_columns	statementre   r^   r%   r%   r&   _parse_constraint_columns   s   z/DatabaseIntrospection._parse_constraint_columnsc                 C   s  i }d}| ||g | D ]%\}}}}||vr+t dddd|r%||fndd||< || d | qd}	| |	|g | D ]#\}}
|
 dkrYd|| d	< d|| d
< qB|
 d
kred|| d
< qB| jjjrd}dd | ||D }| jj	rd}	nd}	| |	|g | D ]$\}}| 
||}t||hkr|d7 }d| }|dddddd||< q| d| jj|  dd | D D ]5\}}}}}}||vrt ddddd||< d|| d< |dkrt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)rj   primary_keyuniqueindexcheckforeign_keyrj   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 keyTrn   ro   r   c                 S   s   h | ]}|j qS r%   )rL   )r,   rH   r%   r%   r&   	<setcomp>   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.      s   " z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)rj   rn   ro   rq   rr   rp   BTREEtype)r/   r0   r   rh   lowerr=   rY    can_introspect_check_constraintsrI   mysql_is_mariadbrm   setr>   r?   r   suffixvalueslist)r   r1   rE   rP   
name_query
constraintrK   	ref_table
ref_column
type_querykindunnamed_constraints_indexrj   ri   constraint_columnsrJ   
non_uniquerp   colseqtype_r%   r%   r&   get_constraints   sp   	

	"
z%DatabaseIntrospection.get_constraints)r%   )#__name__
__module____qualname__r   BLOBCHARDECIMAL
NEWDECIMALDATEDATETIMEDOUBLEFLOATINT24LONGLONGLONGSHORTSTRINGTIME	TIMESTAMPTINY	TINY_BLOBMEDIUM_BLOB	LONG_BLOB
VAR_STRINGdata_types_reverser   r2   rI   rN   rU   rO   r\   rm   r   __classcell__r%   r%   r#   r&   r      sb    	

*r   )collectionsr   ra   MySQLdb.constantsr   %django.db.backends.base.introspectionr   r   BaseFieldInfor   django.db.models.indexesr   django.utils.datastructuresr   _fieldsr   r   r%   r%   r%   r&   <module>   s    
