o
    ˜¨Êhz5  ã                   @   sŠ   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl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ÚInfoLinezXcol_name data_type max_len num_prec num_scale extra column_default collation 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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!‡  Z"S )ÚDatabaseIntrospectionÚ	TextFieldÚ	CharFieldÚDecimalFieldÚ	DateFieldÚDateTimeFieldÚ
FloatFieldÚIntegerFieldÚ	JSONFieldÚBigIntegerFieldÚSmallIntegerFieldÚ	TimeFieldc                    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ÚPositiveSmallIntegerFieldr   )ÚsuperÚget_field_typer	   r
   r   )ÚselfÚ	data_typeÚdescriptionÚ
field_type©Ú	__class__© úX/var/www/html/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>H   s    ÿÿz8DatabaseIntrospection.get_table_list.<locals>.<listcomp>©ÚexecuteÚfetchall)r"   Úcursorr(   r(   r)   Úget_table_listE   s   
þz$DatabaseIntrospection.get_table_listc                 C   s<  i }| j jr| j jjr| d|g¡ dd„ | ¡ D ƒ}| d|g¡ | ¡ }|r,|d nd}| d||g¡ dd	„ | ¡ D ƒ}| d
| j j |¡ ¡ dd„ }g }|j	D ]G}	||	d  }
| 
tg |	dd… ¢||
jƒpn|	d ‘||
jƒpw|	d ‘||
jƒp€|	d ‘|	d ‘|
j‘|
j‘|
j‘|
j‘|	d |v ‘R Ž ¡ qT|S )zj
        Return a description of the table with the DB-API cursor.description
        interface."
        av  
                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>e   s    z>DatabaseIntrospection.get_table_description.<locals>.<setcomp>z±
            SELECT  table_collation
            FROM    information_schema.tables
            WHERE   table_schema = DATABASE()
            AND     table_name = %s
            r   Ú aD  
            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 r8   )r   )r0   Úliner(   r(   r)   Ú
<dictcomp>‰   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_int�   s   z;DatabaseIntrospection.get_table_description.<locals>.to_intNé   é   é   é   )Ú
connectionÚmysql_is_mariadbÚfeaturesÚcan_introspect_json_fieldr4   r5   ÚfetchoneÚopsÚ
quote_namer$   Úappendr   Úmax_lenÚnum_precÚ	num_scaleÚcolumn_defaultÚ	collationr	   r
   )r"   r6   Ú
table_nameÚjson_constraintsr1   Údefault_column_collationÚ
field_infor@   Úfieldsr;   Úinfor(   r(   r)   Úget_table_descriptionM   sh   ÿþ	öù	ðÿ

ÿþýüûúùø	÷

öÿz+DatabaseIntrospection.get_table_descriptionr(   c                 C   s2   |   ||¡D ]}d|jv r||jdœg  S qg S )Nr   )ÚtableÚcolumn)rX   r	   Úname)r"   r6   rR   Útable_fieldsrU   r(   r(   r)   Úget_sequences¥   s
   
þz#DatabaseIntrospection.get_sequencesc                 C   s    |  d|g¡ dd„ | ¡ D ƒS )z–
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all foreign keys in the given table.
        aM  
            SELECT column_name, referenced_column_name, referenced_table_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
            c                 S   s   i | ]
\}}}|||f“qS r(   r(   )r0   Ú
field_nameÚother_fieldÚother_tabler(   r(   r)   r<   ¼   s    ÿÿz7DatabaseIntrospection.get_relations.<locals>.<dictcomp>r3   )r"   r6   rR   r(   r(   r)   Úget_relations¬   s   ÷þz#DatabaseIntrospection.get_relationsc                 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.
        z²
            SELECT engine
            FROM information_schema.tables
            WHERE
                table_name = %s AND
                table_schema = DATABASE()
            r   )r4   rI   rE   rG   Ú_mysql_storage_engine)r"   r6   rR   Ú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 r=   )Úis_whitespace)r0   Útokenr(   r(   r)   Ú	<genexpr>Ø   s   € zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>r-   éÿÿÿÿ)r   ÚsqlparseÚparseÚflattenÚttypeÚtokensÚNamerE   rJ   rK   ÚvalueÚadd)r"   Úcheck_clauseÚcolumnsÚcheck_columnsÚ	statementrm   rf   r(   r(   r)   Ú_parse_constraint_columnsÕ   s   €z/DatabaseIntrospection._parse_constraint_columnsc                 C   s  i }d}|  ||g¡ | ¡ D ]5\}}}}}	||vr;tƒ |	dk|	dv dd|r*||fnddœ||< | jjjr;g || d< || d  |¡ q| jjjr�d	}
d
d„ |  ||¡D ƒ}| jj	r^d}nd}|  ||g¡ | ¡ D ]$\}}|  
||¡}t|ƒ|hkr„|
d7 }
d|
 }|ddddddœ||< qk|  d| jj |¡ ¡ dd„ | ¡ D ƒD ]V\}}}}}}}||vrÉtƒ 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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.
        ai  
            SELECT kc.`constraint_name`, kc.`column_name`,
                kc.`referenced_table_name`, kc.`referenced_column_name`,
                c.`constraint_type`
            FROM
                information_schema.key_column_usage AS kc,
                information_schema.table_constraints AS c
            WHERE
                kc.table_schema = DATABASE() AND
                c.table_schema = kc.table_schema AND
                c.constraint_name = kc.constraint_name AND
                c.constraint_type != 'CHECK' AND
                kc.table_name = %s
            ORDER BY kc.`ordinal_position`
        úPRIMARY KEY>   ÚUNIQUErv   FN)rr   Úprimary_keyÚuniqueÚindexÚcheckÚforeign_keyÚordersrr   r   c                 S   s   h | ]}|j ’qS r(   )r[   )r0   rW   r(   r(   r)   r9   	  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__TzSHOW INDEX FROM %sc                 S   s"   g | ]}|d d… |d f ‘qS )NrD   é
   r(   )r0   Úxr(   r(   r)   r2   8  s    ÿz9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)rr   rx   ry   r{   r|   rz   ÚBTREEÚtypeÚDÚDESCÚASC)r4   r5   r   rE   rG   Úsupports_index_column_orderingrp   Ú can_introspect_check_constraintsrX   rF   ru   ÚsetrJ   rK   r   ÚsuffixÚlowerrL   ÚvaluesÚlist)r"   r6   rR   ÚconstraintsÚ
name_queryÚ
constraintrZ   Ú	ref_tableÚ
ref_columnÚkindÚunnamed_constraints_indexrr   Ú
type_queryrq   Úconstraint_columnsrY   Ú
non_uniquerz   ÚcolseqÚorderÚtype_r(   r(   r)   Úget_constraintsâ   s~   
ú


ÿÿú	ÿÿ
û

ÿ
€z%DatabaseIntrospection.get_constraints)r(   )#Ú__name__Ú
__module__Ú__qualname__r   ÚBLOBÚCHARÚDECIMALÚ
NEWDECIMALÚDATEÚDATETIMEÚDOUBLEÚFLOATÚINT24ÚJSONÚLONGÚLONGLONGÚSHORTÚSTRINGÚTIMEÚ	TIMESTAMPÚTINYÚ	TINY_BLOBÚMEDIUM_BLOBÚ	LONG_BLOBÚ
VAR_STRINGÚdata_types_reverser!   r7   rX   r]   ra   rd   ru   r™   Ú__classcell__r(   r(   r&   r)   r      sb    ÿþýüûúùø	÷
öõôóòñðïë
Xr   )Úcollectionsr   ri   ÚMySQLdb.constantsr   Ú%django.db.backends.base.introspectionr   r   ÚBaseFieldInfor   Údjango.db.modelsr   Údjango.utils.datastructuresr   Ú_fieldsr   r   r(   r(   r(   r)   Ú<module>   s     
ÿþ