3
ŠãdeWJ  ã               @   sÒ   d Z ddlmZ ddlmZmZmZmZmZm	Z	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 dd	lmZ er�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 )zDatabase Introspection.é    )Ú
namedtuple)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptionalÚSetÚTupleN)ÚVERSION)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)ÚIndex)Ú
OrderedSet)Ú	FieldType)ÚCursorWrapperr   ÚextraÚis_unsignedÚhas_json_constrainté   é   Ú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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eeedœ‡ fdd„Zdee dœdd„Zdeee dœdd„Zdee e!e ee"f f dœdd„Z#dee$e! dœdd„Z%f fdee&ee eef  dœdd„Z'dee ee(eef f dœdd„Z)deee(eeef  dœdd „Z*deedœd!d"„Z+e&e,e e-d#œd$d%„Z.dee ee&f dœd&d'„Z/‡  Z0S )(ÚDatabaseIntrospectionz5Encapsulate backend-specific introspection utilities.Z	TextFieldZDecimalFieldZ	DateFieldZDateTimeFieldZ
FloatFieldÚIntegerFieldÚBigIntegerFieldÚSmallIntegerFieldZ	CharFieldZ	TimeField)Ú	data_typeÚdescriptionÚreturnc                st   t ƒ j||ƒ}d|jk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   )Úselfr   r   Z
field_type)Ú	__class__© ú[/var/www/agendate/envp3/lib/python3.6/site-packages/mysql/connector/django/introspection.pyr!   l   s$    
z$DatabaseIntrospection.get_field_typer   )Úcursorr   c             C   s   |j dƒ dd„ |jƒ 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œj|d ƒƒ‘qS )r   ÚtÚv)z
BASE TABLEZVIEWé   )r   Úget)Ú.0Úrowr$   r$   r%   ú
<listcomp>†   s   z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r"   r&   r$   r$   r%   Úget_table_list‚   s    
z$DatabaseIntrospection.get_table_list)r&   Ú
table_namer   c             C   sž  i }|j d|gƒ |jƒ }|r&|d nd}tdk rB|j d|gƒ n|j d||gƒ dd	„ |jƒ D ƒ}|j d
| jjj|ƒ› d�ƒ ttt	 dœdd„}g }� xþ|j
D ]ô}	||	d  }
tdk �r&|jt|	dd… ||
jƒpÜ|	d ||
jƒpì|	d ||
jƒ� pþ|	d |	d |
j|
j|
j|	d |kfžŽ ƒ q¢|jt|	dd… ||
jƒ�pH|	d ||
jƒ�pZ|	d ||
jƒ�pl|	d |	d |
j|
j|
j|
j|	d |kf	žŽ ƒ q¢W |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   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 | ]}t |Ž |d  “qS )r   )r   )r+   Úliner$   r$   r%   ú
<dictcomp>Å   s    z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>zSELECT * FROM z LIMIT 1)Úir   c             S   s   | d k	rt | ƒS | S )N)Úint)r5   r$   r$   r%   Úto_intË   s    z;DatabaseIntrospection.get_table_description.<locals>.to_intNé   é   é   )r   r   r   )r   r   r   )r.   ÚfetchoneÚDJANGO_VERSIONr/   Ú
connectionÚopsÚ
quote_namer   r   r6   r   Úappendr   Úmax_lenZnum_precZ	num_scaleZcolumn_defaultr   r   Z	collation)r"   r&   r1   Zjson_constraintsr,   Zdefault_column_collationÚ
field_infor7   Úfieldsr3   Úinfor$   r$   r%   Úget_table_descriptionŠ   sZ    




z+DatabaseIntrospection.get_table_descriptionc             C   sÊ   |j d| jjj|ƒ› �ƒ t|jƒ ƒ}tƒ }x&|D ]}|d dkr2|j|d ƒ q2W i }xl|D ]d}|d |krpq^|d |krŽdddœ||d < |d dkrªd	||d  d
< |d s^d	||d  d< q^W |S )zReturn indexes from table.zSHOW INDEX FROM r   r)   r   r8   F)Úprimary_keyÚuniqueZPRIMARYTrF   rG   )r.   r=   r>   r?   Úlistr/   ÚsetÚadd)r"   r&   r1   ÚrowsZmulticol_indexesr,   Zindexesr$   r$   r%   Úget_indexesð   s"    

z!DatabaseIntrospection.get_indexesc             C   s2   x,| j ||ƒjƒ D ]}|d d r|d S qW dS )zP
        Returns the name of the primary key column for the given table
        r)   rF   r   N)rL   Úitems)r"   r&   r1   Úcolumnr$   r$   r%   Úget_primary_key_column  s    z,DatabaseIntrospection.get_primary_key_column)r&   r1   Útable_fieldsr   c             C   s2   x,| j ||ƒD ]}d|jkr||jdœgS qW g S )Nr   )ÚtablerN   )rE   r   Úname)r"   r&   r1   rP   rB   r$   r$   r%   Úget_sequences  s    
z#DatabaseIntrospection.get_sequencesc             C   s4   | j ||ƒ}i }x|D ]\}}}||f||< qW |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&   r1   ÚconstraintsZ	relationsZmy_fieldnameZother_tableZother_fieldr$   r$   r%   Úget_relations  s
    z#DatabaseIntrospection.get_relationsc             C   s$   g }|j d|gƒ |j|jƒ ƒ |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&   r1   Zkey_columnsr$   r$   r%   rT   ,  s    z%DatabaseIntrospection.get_key_columnsc             C   s,   |j d|gƒ |jƒ }|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.   r;   r=   ÚfeaturesZ_mysql_storage_engine)r"   r&   r1   Úresultr$   r$   r%   Úget_storage_engineA  s    
z(DatabaseIntrospection.get_storage_engine)Úcheck_clauseÚcolumnsr   c             C   s‚   t ƒ }tj|ƒd }dd„ |jƒ D ƒ}xV|D ]N}|jtjjkr,| jjj	|j
ƒ|j
kr,|j
dd… |kr,|j|j
dd… ƒ q,W |S )Nr   c             s   s   | ]}|j s|V  qd S )N)Zis_whitespace)r+   Útokenr$   r$   r%   ú	<genexpr>V  s    zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>r)   éÿÿÿÿr_   )r   ÚsqlparseÚparseÚflattenZttypeÚtokensÚNamer=   r>   r?   ÚvaluerJ   )r"   r[   r\   Zcheck_columnsZ	statementrc   r]   r$   r$   r%   Ú_parse_constraint_columnsQ  s    
z/DatabaseIntrospection._parse_constraint_columnsc             C   s�  i }d}|j ||gƒ xl|jƒ D ]`\}}}}||krntƒ dddd|rL||fnddœ||< | jjjrng || d< || d j|ƒ q W d}	|j |	|gƒ xR|jƒ D ]F\}}
|
jƒ dkrÎd	|| d
< d	|| d< q |
jƒ dkr d	|| d< q W | jjj�r€d}dd„ | j	||ƒD ƒ}d}	|j |	|gƒ x\|jƒ D ]P\}}| j
||ƒ}t|ƒ|hk�rd|d7 }d|› d�}|dddd	ddœ||< �q,W |j d| jjj|ƒ› �ƒ xÌdd„ |jƒ D ƒD ]¶\}}}}}}}||k�røtƒ dddddœ||< | jjj�røg || d< d	|| d< |dk�rtjn|jƒ || d< || d j|ƒ | jjj�r®|| d j|dk�r\dndƒ �q®W x"|jƒ D ]}t|d ƒ|d< �qrW |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)r\   rF   rG   ÚindexÚcheckÚforeign_keyZordersr\   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 keyTrF   rG   r   c             S   s   h | ]
}|j ’qS r$   )rR   )r+   rD   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_Ú__zSHOW INDEX FROM c             S   s"   g | ]}|d d… |d f ‘qS )Nr:   é
   r$   )r+   Úxr$   r$   r%   r-   ·  s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>)r\   rF   rG   rh   ri   rg   ZBTREEÚtypeÚDZDESCÚASC)r.   r/   r   r=   rX   Zsupports_index_column_orderingrJ   ÚlowerZ can_introspect_check_constraintsrE   rf   rI   r>   r?   r   Úsuffixr@   ÚvaluesrH   )r"   r&   r1   rU   Z
name_queryÚ
constraintrN   Z	ref_tableZ
ref_columnZ
type_queryÚkindZunnamed_constraints_indexr\   r[   Zconstraint_columnsÚ_rg   ÚorderÚtype_r$   r$   r%   Úget_constraints`  sv    

$
 &z%DatabaseIntrospection.get_constraints)1Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ZBLOBZDECIMALZ
NEWDECIMALZDATEZDATETIMEZDOUBLEÚFLOATZINT24ÚLONGZLONGLONGZSHORTÚSTRINGZTIMEZ	TIMESTAMPZTINYZ	TINY_BLOBZMEDIUM_BLOBZ	LONG_BLOBZ
VAR_STRINGZdata_types_reverseÚstrr   r!   r   r   r0   rE   r   r6   ÚboolrL   r   rO   r   rS   r	   rV   rT   rZ   r   r   rf   ry   Ú__classcell__r$   r$   )r#   r%   r   S   sN   
	e

r   )r   r   r   )r   r   r   )r}   Úcollectionsr   Útypingr   r   r   r   r   r   r	   r`   Zdjangor
   r<   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.db.modelsr   Zdjango.utils.datastructuresr   Zmysql.connector.constantsr   Zmysql.connector.django.baser   Ú_fieldsr   r   r$   r$   r$   r%   Ú<module>   s*   $	