o
    b/                     @   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	m
Z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k rDeddZneddZG dd deZdS )    )
namedtupleN)	FieldType)VERSION)BaseDatabaseIntrospection	FieldInfo	TableInfo)DatabaseIntrospection)Index)
OrderedSetr   )extrais_unsignedZ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d Zdd Zdd Zdd Zd	S )
r   c                 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 }g }|jD ]}	||	d  }
tdk r|t	g |	dd ||
j
pe|	d ||
jpn|	d ||
jpw|	d |	d |
j|
j|
j|	d |v R   qG|t	g |	dd ||
j
p|	d ||
jp|	d ||
jp|	d |	d |
j|
j|
j|
j|	d |v R   qG|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   ).0line r   c/var/www/secure340b-portal/env/lib/python3.10/site-packages/mysql/connector/django/introspection.py
<dictcomp>q   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_intu   s   z;DatabaseIntrospection.get_table_description.<locals>.to_intNr            )executeZfetchoneDJANGO_VERSIONfetchall
connectionops
quote_namedescriptionappendr   max_lenZnum_precZ	num_scaleZcolumn_defaultr   r   Z	collation)selfcursor
table_nameZjson_constraintsrowZdefault_column_collationZ
field_infor   fieldsr   infor   r   r   get_table_descriptionA   sz   



	
	

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 )NzSHOW INDEX FROM {0}r      r   r   F)primary_keyuniqueZPRIMARYTr.   r/   )	r   formatr    r!   r"   listr   setadd)r&   r'   r(   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-   r.   r   N)r5   items)r&   r'   r(   columnr   r   r   get_primary_key_column   s
   z,DatabaseIntrospection.get_primary_key_columnc                 C   sh  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||< 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)columnsr.   r/   indexcheckforeign_keyZordersr9   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.   r/   r   c                 S   s   h | ]}|j qS r   )name)r   r+   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_%s__zSHOW INDEX FROM %sc                 S   s"   g | ]}|d d |d f qS )Nr   
   r   )r   xr   r   r   
<listcomp>  s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)r9   r.   r/   r;   r<   r:   ZBTREEtypeDZDESCASC)r   r   r
   r    featuresZsupports_index_column_orderingr3   lowerZ can_introspect_check_constraintsr,   Z_parse_constraint_columnsr2   r!   r"   r	   suffixr$   valuesr1   )r&   r'   r(   constraintsZ
name_query
constraintr7   Z	ref_tableZ
ref_columnZ
type_querykindZunnamed_constraints_indexr9   Zcheck_clauseZconstraint_columnstableZ
non_uniquer:   Zcolseqordertype_r   r   r   get_constraints   s~   	

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

 z%DatabaseIntrospection.get_constraintsN)__name__
__module____qualname__r,   r5   r8   rO   r   r   r   r   r   ?   s
    U	r   )collectionsr   ZsqlparseZmysql.connector.constantsr   djangor   r   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Z&django.db.backends.mysql.introspectionr   ZMySQLDatabaseIntrospectionZdjango.db.modelsr	   Zdjango.utils.datastructuresr
   _fieldsr   r   r   r   r   <module>   s,   