a
    xd1                     @   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has_json_constraintInfoLinezNcol_name data_type max_len num_prec num_scale extra column_default is_unsignedc                *       s   e 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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 ) DatabaseIntrospectionZ	TextFieldZ	CharFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldIntegerField	JSONFieldBigIntegerFieldSmallIntegerFieldZ	TimeFieldc                    st   t  ||}d|jv 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PositiveSmallIntegerFieldr   )superget_field_typer	   r
   r   )selfZ	data_typedescriptionZ
field_type	__class__ ^/var/www/html/Ranjet/env/lib/python3.9/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 TABLEZVIEW   )r   get.0rowr   r   r   
<listcomp>B   s   z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r   cursorr   r   r   get_table_list?   s    
z$DatabaseIntrospection.get_table_listc           	      C   s  i }| j jr6| j jjr6|d|g dd | D }|d|g dd | D }|d| j j|  dd	 }g }|jD ]}||d
  }|	t
g |dd ||jp|d ||jp|d ||jp|d |d |j|j|j|d
 |v R   q|S )zj
        Return a description of the table with the DB-API cursor.description
        interface."
        aZ  
                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>V       z>DatabaseIntrospection.get_table_description.<locals>.<setcomp>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>f   r)   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_intj   s    z;DatabaseIntrospection.get_table_description.<locals>.to_intr   N            )
connectionmysql_is_mariadbfeaturesZcan_introspect_json_fieldr#   r$   ops
quote_namer   appendr   max_lenZnum_precZ	num_scaleZcolumn_defaultr	   r
   )	r   r%   
table_nameZjson_constraints
field_infor/   fieldsr*   infor   r   r   get_table_descriptionE   sF    	


	
z+DatabaseIntrospection.get_table_descriptionr   c                 C   s2   |  ||D ] }d|jv r||jdg  S qg S )Nr   )tablecolumn)r?   r	   name)r   r%   r;   Ztable_fieldsr<   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%   r;   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)r#   extendr$   )r   r%   r;   Zkey_columnsr   r   r   rD      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#   Zfetchoner4   r6   Z_mysql_storage_engine)r   r%   r;   resultr   r   r   get_storage_engine   s    
z(DatabaseIntrospection.get_storage_enginec                 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 |v r*||j
dd  q*|S )Nr   c                 s   s   | ]}|j s|V  qd S r,   )Zis_whitespace)r    tokenr   r   r   	<genexpr>   r)   zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>r   )r   sqlparseparseflattenttypetokensNamer4   r7   r8   valueadd)r   check_clausecolumnsZcheck_columnsZ	statementrQ   rJ   r   r   r   _parse_constraint_columns   s    z/DatabaseIntrospection._parse_constraint_columnsc                 C   s*  i }d}| ||g | D ]J\}}}}||vrVt dddd|rJ||fndd||< || d | qd}	| |	|g | D ]F\}}
|
 dkrd|| d	< d|| d
< q|
 d
krd|| d
< q| jjjrjd}dd | ||D }| jj	rd}	nd}	| |	|g | D ]L\}}| 
||}t||hkrP|d7 }d| }|dddddd||< q| d| jj|  dd | D D ]p\}}}}}}||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)rV   primary_keyuniqueindexcheckforeign_keyrV   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 keyTrX   rY   r   c                 S   s   h | ]
}|j qS r   )rB   )r    r>   r   r   r   r(      r)   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 )Nr2   
   r   )r    xr   r   r   r"     r)   z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)rV   rX   rY   r[   r\   rZ   ZBTREEtype)r#   r$   r   rT   lowerr4   r6   Z can_introspect_check_constraintsr?   r5   rW   setr7   r8   r   suffixvalueslist)r   r%   r;   rE   Z
name_query
constraintrA   Z	ref_tableZ
ref_columnZ
type_querykindZunnamed_constraints_indexrV   rU   Zconstraint_columnsr@   Z
non_uniquerZ   Zcolseqtype_r   r   r   get_constraints   sn    	

	"

 z%DatabaseIntrospection.get_constraints)r   )$__name__
__module____qualname__r   ZBLOBZCHARZDECIMALZ
NEWDECIMALZDATEZDATETIMEZDOUBLEFLOATZINT24ZJSONLONGZLONGLONGZSHORTSTRINGZTIME	TIMESTAMPZTINYZ	TINY_BLOBZMEDIUM_BLOBZ	LONG_BLOBZ
VAR_STRINGZdata_types_reverser   r&   r?   rC   rF   rD   rI   rW   rh   __classcell__r   r   r   r   r      s>   8
r   )collectionsr   rM   ZMySQLdb.constantsr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.db.modelsr   Zdjango.utils.datastructuresr   _fieldsr   r   r   r   r   r   <module>   s   
