o
    [h8                     @   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ede
jd Z	G dd deZdS )    )
namedtupleN)
FIELD_TYPE)BaseDatabaseIntrospection)	FieldInfo)	TableInfo)Index)
OrderedSetr   )extrais_unsignedhas_json_constraintcomment	data_typeInfoLinez`col_name data_type max_len num_prec num_scale extra column_default collation is_unsigned commentr   )r   c                	       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 )DatabaseIntrospectionZ	TextFieldZ	CharFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldIntegerField	JSONFieldBigIntegerFieldSmallIntegerFieldZ	TimeFieldc                    s   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 dkr<dS |jrAdS |S )Nauto_incrementr   Z	AutoFieldr   ZBigAutoFieldr   ZSmallAutoFieldZPositiveBigIntegerFieldZPositiveIntegerFieldZPositiveSmallIntegerFieldUUIDZ	UUIDFieldr   )superget_field_typer	   r
   r   upperr   )selfr   descriptionZ
field_type	__class__ /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/venv/lib/python3.10/site-packages/django/db/backends/mysql/introspection.pyr   2   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
            SELECT
                table_name,
                table_type,
                table_comment
            FROM information_schema.tables
            WHERE table_schema = DATABASE()
            c                 S   s0   g | ]}t |d  ddd|d |d qS )r   tv)z
BASE TABLEZVIEW      )r   get.0rowr   r   r   
<listcomp>V   s    "z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>executefetchall)r   cursorr   r   r   get_table_listJ   s   
z$DatabaseIntrospection.get_table_listc                 C   sZ  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 ]V}	||	d  }
|
tg |	dd ||
jpn|	d ||
jpw|	d ||
jp|	d ||
jp|	d |	d |
j|
j|
j|
j|	d |v |
j|
j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>s   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,
                column_comment
            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>   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_intNr"               )
connectionmysql_is_mariadbfeaturesZcan_introspect_json_fieldr)   r*   fetchoneops
quote_namer   appendr   max_lenZnum_precZ	num_scaleZcolumn_defaultZ	collationr	   r
   r   r   )r   r+   
table_nameZjson_constraintsr&   Zdefault_column_collation
field_infor5   fieldsr0   infor   r   r   get_table_description[   st   		

	

z+DatabaseIntrospection.get_table_descriptionr   c                 C   s2   |  ||D ]}d|jv r||jdg  S qg S )Nr   )tablecolumn)rF   r	   name)r   r+   rB   Ztable_fieldsrC   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.
        a  
            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_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   )r%   
field_nameZother_fieldZother_tabler   r   r   r1      s    z7DatabaseIntrospection.get_relations.<locals>.<dictcomp>r(   )r   r+   rB   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   )r)   r=   r:   r<   Z_mysql_storage_engine)r   r+   rB   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 r2   )Z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columnsZcheck_columnsZ	statementrV   rO   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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||< qk| d| jj|  dd | D D ]V\}}}}}}}||vrt 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rd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.
        a  
            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
                (
                    kc.referenced_table_schema = DATABASE() OR
                    kc.referenced_table_schema IS NULL
                ) 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>   r]   ZUNIQUEFN)r[   primary_keyuniqueindexcheckforeign_keyZordersr[   r   c                 S   s   h | ]}|j qS r   )rI   )r%   rE   r   r   r   r.      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 )Nr9   
   r   )r%   xr   r   r   r'   O  s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)r[   r^   r_   ra   rb   r`   ZBTREEtypeDZDESCZASC)r)   r*   r   r:   r<   Zsupports_index_column_orderingrY   Z can_introspect_check_constraintsrF   r;   r\   setr>   r?   r   suffixlowerr@   valueslist)r   r+   rB   constraintsZ
name_query
constraintrH   Z	ref_tableZ
ref_columnkindZunnamed_constraints_indexr[   Z
type_queryrZ   Zconstraint_columnsrG   Z
non_uniquer`   Zcolseqordertype_r   r   r   get_constraints   s~   

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



z%DatabaseIntrospection.get_constraints)r   )#__name__
__module____qualname__r   ZBLOBZCHARZDECIMALZ
NEWDECIMALZDATEZDATETIMEDOUBLEFLOATZINT24JSONLONGZLONGLONGZSHORTSTRINGZTIME	TIMESTAMPZTINYZ	TINY_BLOBZMEDIUM_BLOBZ	LONG_BLOBZ
VAR_STRINGZdata_types_reverser   r,   rF   rJ   rL   rN   r\   rq   __classcell__r   r   r   r   r      sb    	

\r   )collectionsr   rR   ZMySQLdb.constantsr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   ZBaseTableInfoZdjango.db.modelsr   Zdjango.utils.datastructuresr   _fieldsr   r   r   r   r   r   <module>   s(    