
    AahJ                        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             Zedk     r edd          Zn edd          Z G 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      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                       e Zd 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
iZdededef fdZdddee         fdZdddedee         fdZdddede e!e ee"f         f         fdZ#dddede$e!         fdZ%	 d!dddede&dee eef                  fdZ'dddede ee(eef         f         fdZ)dddedee(eeef                  fdZ*dddedefdZ+de&de,e         de-fdZ.dddede ee&f         fd Z/ xZ0S )"DatabaseIntrospectionz5Encapsulate backend-specific introspection utilities.	TextFieldDecimalField	DateFieldDateTimeField
FloatFieldIntegerFieldBigIntegerFieldSmallIntegerField	CharField	TimeField	data_typedescriptionreturnc                     t                                          ||          }d|j        v r|dk    rdS |dk    rdS |dk    rdS |j        r|dk    rdS |dk    rd	S |dk    rd
S |j        rdS |S )Nauto_incrementr!   	AutoFieldr"   BigAutoFieldr#   SmallAutoFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField	JSONField)superget_field_typer   r   r   )selfr&   r'   
field_type	__class__s       V/var/www/lms/venv/lib/python3.11/site-packages/mysql/connector/django/introspection.pyr3   z$DatabaseIntrospection.get_field_typel   s    WW++I{CC
{000^++"{...%~000''" 	3...00^++--00022 * 	;    cursorr   c                 h    |                     d           d |                                D             S )z>Return a list of table and view names in the current database.zSHOW FULL TABLESc           	      r    g | ]4}t          |d          ddd                    |d                             5S )r   tv)z
BASE TABLEVIEW   )r   get).0rows     r7   
<listcomp>z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>   sP     
 
 
 c!fS#>>BB3q6JJKK
 
 
r8   )executefetchall)r4   r9   s     r7   get_table_listz$DatabaseIntrospection.get_table_list   s@    )***
 
((
 
 
 	
r8   
table_namec           	         i }|                     d|g           |                                }|r|d         nd}t          dk     r|                     d|g           n|                     d||g           d |                                D             }|                     d| j        j                            |           d	           d
t          dt          t                   fd}g }|j
        D ]P}	||	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             |                    t          g |	dd          ||
j                  p|	d          ||
j                  p|	d          ||
j                  p|	d         |	d         |
j        |
j        |
j        |
j        |	d         |v R             R|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                 .    i | ]}|d          t          | S )r   )r   )rA   lines     r7   
<dictcomp>z?DatabaseIntrospection.get_table_description.<locals>.<dictcomp>   s"    MMM4d1gxMMMr8   zSELECT * FROM z LIMIT 1ir(   c                 (    | t          |           n| S N)int)rM   s    r7   to_intz;DatabaseIntrospection.get_table_description.<locals>.to_int   s    ]3q6661r8   Nr            )rD   fetchoneDJANGO_VERSIONrE   
connectionops
quote_namer   r   rP   r'   appendr   max_lennum_prec	num_scalecolumn_defaultr   r   	collation)r4   r9   rG   json_constraintsrB   default_column_collation
field_inforQ   fieldsrK   infos              r7   get_table_descriptionz+DatabaseIntrospection.get_table_description   s/    ,. L	
 	
 	
 oo-0#83q66b  I%%NN
     NN *:6!  $ NM6??;L;LMMM
QT_0;;JGGQQQ	
 	
 	
	2c 	2hsm 	2 	2 	2 	2 & 	 	Dd1g&D	)) 
bqb
t|,,7Q
 t}--8a
 t~..9$q'	

 Q
 +
 

 (
 Q#33
 
 
     bqbt|,,7Q t}--8a t~..9$q'	
 Q +  
 ( Q#33      r8   c                    |                     d| j        j                            |                      t	          |                                          }t                      }|D ])}|d         dk    r|                    |d                    *i }|D ][}|d         |v r|d         |vrddd||d         <   |d         dk    rd	||d                  d
<   |d         sd	||d                  d<   \|S )zReturn indexes from table.SHOW INDEX FROM r   r?   r   rR   F)primary_keyuniquePRIMARYTrh   ri   )rD   rW   rX   rY   listrE   setadd)r4   r9   rG   rowsmulticol_indexesrB   indexess          r7   get_indexesz!DatabaseIntrospection.get_indexes   s    	V$/*=*H*H*T*TVVWWW FOO%%&&55 	- 	-C1vzz $$SV,,,.0 
	1 
	1C1v)))1vW$$275"I"IA 1v""15A.q6 1,0A)r8   c                     |                      ||                                          D ]}|d         d         r
|d         c S dS )zP
        Returns the name of the primary key column for the given table
        r?   rh   r   N)rq   items)r4   r9   rG   columns       r7   get_primary_key_columnz,DatabaseIntrospection.get_primary_key_column  sZ     &&vz::@@BB 	! 	!Fay' !ay   !tr8    table_fieldsc                 d    |                      ||          D ]}d|j        v r||j        dgc S g S )Nr*   )tablert   )re   r   name)r4   r9   rG   rw   rb   s        r7   get_sequencesz#DatabaseIntrospection.get_sequences  sX     44VZHH 	J 	JJ:#333",
HHIIII 4 	r8   c                 V    |                      ||          }i }|D ]\  }}}||f||<   |S )z
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        )get_key_columns)r4   r9   rG   constraints	relationsmy_fieldnameother_tableother_fields           r7   get_relationsz#DatabaseIntrospection.get_relations  sN     **6:>>	6A 	A 	A2L+{'2K&@Il##r8   c                     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)rD   extendrE   )r4   r9   rG   key_columnss       r7   r}   z%DatabaseIntrospection.get_key_columns,  sQ     "$: L		
 		
 		
 	6??,,---r8   c                     |                     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   )rD   rU   rW   features_mysql_storage_engine)r4   r9   rG   results       r7   get_storage_enginez(DatabaseIntrospection.get_storage_engineA  sT    
 	PL	
 	
 	
 "" 	B?+AAayr8   check_clausecolumnsc                    t                      }t          j        |          d         }d |                                D             }|D ]|}|j        t          j        j        k    r`| j        j        	                    |j
                  |j
        k    r3|j
        dd         |v r"|                    |j
        dd                    }|S )Nr   c              3   (   K   | ]}|j         	|V  d S rO   )is_whitespace)rA   tokens     r7   	<genexpr>zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>V  s*      TTE@ST%TTTTTTr8   r?   )r   sqlparseparseflattenttypetokensNamerW   rX   rY   valuerm   )r4   r   r   check_columns	statementr   r   s          r7   _parse_constraint_columnsz/DatabaseIntrospection._parse_constraint_columnsQ  s     %/LLN<003	TTY%6%6%8%8TTT 	5 	5Ex333O'225;??5;NNK"%00!!%+ad"3444r8   c                 <   i }d}|                     ||g           |                                D ]f\  }}}}||vr:t                      dddd|r||fndd||<   | j        j        j        rg ||         d<   ||         d                             |           gd}	|                     |	|g           |                                D ]W\  }}
|
                                dk    rd	||         d
<   d	||         d<   4|
                                dk    rd	||         d<   X| j        j        j        rd}d | 	                    ||          D             }d}	|                     |	|g           |                                D ]F\  }}| 
                    ||          }t          |          |hk    r|dz  }d| d}|dddd	dd||<   G|                     d| j        j                            |                      d |                                D             D ]\  }}}}}}}||vr3t                      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    rdnd           |                                D ]}t%          |d                   |d<   |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   rh   ri   indexcheckforeign_key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 keyTrh   ri   r   c                     h | ]	}|j         
S rv   )rz   )rA   rd   s     r7   	<setcomp>z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>  s'       "	  r8   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?   __unnamed_constraint___rg   c                 6    g | ]}|d d         |d         fz   S )NrT   
   rv   )rA   xs     r7   rC   z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>  s8     5
 5
 5
!"AbqbEQrUH5
 5
 5
r8   )r   rh   ri   r   r   r   BTREEtypeDDESCASC)rD   rE   r   rW   r   supports_index_column_orderingrm   lower can_introspect_check_constraintsre   r   rl   rX   rY   r   suffixrZ   valuesrk   )r4   r9   rG   r~   
name_query
constraintrt   	ref_table
ref_column
type_querykindunnamed_constraints_indexr   r   constraint_columns_r   ordertype_s                      r7   get_constraintsz%DatabaseIntrospection.get_constraints`  s    ')
 	zJ<0009?9J9J 	; 	;5J	:,,)||#(#"">H#RIz#:#:d+ +J' ?+J ;8:K
+H5
#I.226::::
 	zJ<000 & 1 1 	9 	9Jzz||},,9=J'648J'11))48J'1?#D #	()% &*&@&@&T&T  GJ NN:
|444,2OO,=,=  (
L%)%C%C '& &" )**zl::-2-!V9R!V!V!VJ1#(#"!#'+ +J'' 	V$/*=*H*H*T*TVVWWW5
 5
&,oo&7&75
 5
 5
 	W 	W0Aq%FE5 K'')||#(#"#'& &E" ?+J 635K&x0*.Kw' % 0 0ekkmm v& y)--f555'F WE"8,33esllFFPUVVV%,,.. 	@ 	@J$(I)>$?$?Jy!!r8   )rv   )1__name__
__module____qualname____doc__r   BLOBDECIMAL
NEWDECIMALDATEDATETIMEDOUBLEFLOATINT24LONGLONGLONGSHORTSTRINGTIME	TIMESTAMPTINY	TINY_BLOBMEDIUM_BLOB	LONG_BLOB
VAR_STRINGdata_types_reversestrr   r3   r   r   rF   re   r   rP   boolrq   r   ru   r   r{   r
   r   r}   r   r	   r   r   r   __classcell__)r6   s   @r7   r   r   S   s       ??> 	n 		
 	O 	, 	 	 	 	- 	, 	+ 	 	_ 	  	[!" 	{#$ 	[k' , )       ,
_ 
i 
 
 
 
d%d36d	id d d dL%36	c4T	?"	#   6	%	36		#	 	 	 	 MO %36FI	d38n	   %36	c5c?"	#   %36	eCcM"	#   * c c     *-c(	   m%m36m	c3hm m m m m m m mr8   r   )r   collectionsr   typingr   r   r   r   r   r	   r
   r   djangor   rV   %django.db.backends.base.introspectionr   r   BaseFieldInfor   django.db.modelsr   django.utils.datastructuresr   mysql.connector.constantsr   mysql.connector.django.baser   _fieldsr   r   rv   r8   r7   <module>r      s  >   " " " " " " G G G G G G G G G G G G G G G G G G  , , , , , ,         
 # " " " " " 2 2 2 2 2 2 / / / / / /  :999999 JKK 	 Iz	 HH z	  Hz z z z z5 z z z z zr8   