a
    còf?  ã                   @   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 edejd	 ƒZ
ed
k r|eddƒZn
eddƒZG dd„ de	ƒZdS )é    )Ú
namedtupleN)Ú	FieldType)ÚVERSION)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)ÚIndex)Ú
OrderedSetr   )Ú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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„ Zdd„ Zd dd„Zdd„ Zdd„ Zdd„ Z dd„ Z!‡  Z"S )!ÚDatabaseIntrospectionZ	TextFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldÚIntegerFieldÚBigIntegerFieldÚSmallIntegerFieldZ	CharFieldZ	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PositiveSmallIntegerFieldZ	JSONField)ÚsuperÚget_field_typer
   r   r   )ÚselfZ	data_typeÚdescriptionZ
field_type©Ú	__class__© úa/home/httpd/docs/test/DocsMgr/lib/python3.9/site-packages/mysql/connector/django/introspection.pyr   T   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>m   s   ÿz8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r   Úcursorr   r   r   Úget_table_listj   s    
ÿz$DatabaseIntrospection.get_table_listc                 C   s®  i }|  d|g¡ | ¡ }|r&|d nd}tdk rB|  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
ƒpÎ|	d ‘||
jƒpà|	d ‘||
jƒpò|	d ‘|	d ‘|
j‘|
j‘|
j‘|	d |v ‘R Ž ¡ qŽ| t	g |	dd… ¢||
j
ƒ�pJ|	d ‘||
jƒ�p^|	d ‘||
jƒ�pr|	d ‘|	d ‘|
j‘|
j‘|
j‘|
j‘|	d |v ‘R Ž ¡ qŽ|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"   Úliner   r   r   Ú
<dictcomp>    ó    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_intNr   é   é   é   )r%   ÚfetchoneÚDJANGO_VERSIONr&   Ú
connectionÚopsÚ
quote_namer   Úappendr   Úmax_lenZnum_precZ	num_scaleZcolumn_defaultr
   r   Z	collation)r   r'   Ú
table_nameZjson_constraintsr#   Zdefault_column_collationÚ
field_infor/   Úfieldsr*   Úinfor   r   r   Úget_table_descriptionp   sz    û
öò

ÿþýüûúùø	
÷
ÿþýüûúùø	÷

öz+DatabaseIntrospection.get_table_descriptionc                 C   sÂ   |  d | jj |¡¡¡ t| ¡ ƒ}tƒ }|D ]}|d dkr0| |d ¡ q0i }|D ]d}|d |v rjqX|d |vrˆdddœ||d < |d dkr¤d	||d  d
< |d sXd	||d  d< qX|S )NzSHOW INDEX FROM {0}r   r    r   r0   F)Úprimary_keyÚuniqueZPRIMARYTr?   r@   )	r%   Úformatr5   r6   r7   Ú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)rF   Úitems)r   r'   r:   Úcolumnr   r   r   Úget_primary_key_columnÞ   s    z,DatabaseIntrospection.get_primary_key_columnr   c                 C   s2   |   ||¡D ] }d|jv r||jdœg  S qg S )Nr   )ÚtablerH   )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   rM   ù   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%   r3   r5   ÚfeaturesZ_mysql_storage_engine)r   r'   r:   Úresultr   r   r   Úget_storage_engine	  s    ý
z(DatabaseIntrospection.get_storage_enginec                 C   sv  i }d}|  ||g¡ | ¡ D ]`\}}}}||vrltƒ dddd|rJ||fnddœ||< | jjjrlg || d< || d  |¡ qd}	|  |	|g¡ | ¡ D ]F\}}
|
 ¡ dkrÈd	|| d
< d	|| d< qš|
 ¡ dkršd	|| d< qš| jjj�rpd}dd„ |  	||¡D ƒ}d}	|  |	|g¡ | ¡ D ]L\}}|  
||¡}t|ƒ|hk�rV|d7 }d| }|dddd	ddœ||< �q"|  d| jj |¡ ¡ dd„ | ¡ D ƒD ]¶\}}}}}}}||v�rätƒ d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�rHdnd¡ �qš| ¡ D ]}t|d ƒ|d< �qZ|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ordersrT   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   )rK   )r"   r=   r   r   r   Ú	<setcomp>G  r,   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 )Nr2   é
   r   )r"   Úxr   r   r   r$   g  s   z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)rT   r?   r@   rV   rW   rU   ZBTREEÚtypeÚDZDESCÚASC)r%   r&   r	   r5   rQ   Zsupports_index_column_orderingrD   ÚlowerZ can_introspect_check_constraintsr>   Z_parse_constraint_columnsrC   r6   r7   r   Úsuffixr8   ÚvaluesrB   )r   r'   r:   rN   Z
name_queryÚ
constraintrH   Z	ref_tableZ
ref_columnZ
type_queryÚkindZunnamed_constraints_indexrT   Zcheck_clauseZconstraint_columnsrJ   Z
non_uniquerU   ZcolseqÚorderÚtype_r   r   r   Úget_constraints  sz    	ú

ú	ÿ
û
 $z%DatabaseIntrospection.get_constraints)r   )#Ú__name__Ú
__module__Ú__qualname__r   ZBLOBZDECIMALZ
NEWDECIMALZDATEZDATETIMEÚDOUBLEÚFLOATZINT24ÚLONGZLONGLONGZSHORTÚSTRINGZTIMEÚ	TIMESTAMPZTINYZ	TINY_BLOBZMEDIUM_BLOBZ	LONG_BLOBZ
VAR_STRINGZdata_types_reverser   r(   r>   rF   rI   rL   rO   rM   rS   re   Ú__classcell__r   r   r   r   r   <   s<   íU	
r   )Úcollectionsr   ZsqlparseZmysql.connector.constantsr   Údjangor   r4   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(   þþþ