
    Dhg4                     n   d dl Z d dlmZ d dlZej                  dk\  rd dlmZmZmZ nd dl	mZ ej                  dk\  r0ej                  dk  rd dl	mZ d dl
mZ ej                  d	k\  rd d
lmZ d dlmZ  e j                   d      Zej                  dk\  r edej$                  dz         Z G d de      Zy)    N)
namedtuple      )BaseDatabaseIntrospection	FieldInfo	TableInfo)r   r      )r   )
force_text)r      )
OrderedSet)	FieldTypezQ\sCONSTRAINT `[^`]*` FOREIGN KEY \(`([^`]*)`\) REFERENCES `([^`]*)` \(`([^`]*)`\)r   )extrac                       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                  ej                   dk  rdnd	ej"                  d
ej$                  dej&                  dej(                  dej*                  dej,                  dej.                  dej0                  d
iZ fdZd Zej                   dk\  rd Znd Zd Zd Zd Zd Z d Z!d Z"d Z# xZ$S )DatabaseIntrospection	TextFieldDecimalField	DateFieldDateTimeField
FloatFieldIntegerFieldBigIntegerFieldr   SmallIntegerField	CharField	TimeFieldc                 X    t         t        |   ||      }|dk(  rd|j                  v ry|S )Nr   auto_increment	AutoField)superr   get_field_typer   )self	data_typedescription
field_type	__class__s       d/var/www/html/civilisation/venv/lib/python3.12/site-packages/mysql/connector/django/introspection.pyr!   z$DatabaseIntrospection.get_field_type8   s9    0$F{$
.($(9(99    c           
          |j                  d       t        j                  dk\  r@|j                         D cg c]&  }t	        |d   dddj                  |d               ( c}S |j                         D cg c]  }|d   	 c}S c c}w c c}w )z6Returns a list of table names in the current database.zSHOW FULL TABLESr   r   tv)z
BASE TABLEVIEWr   )executedjangoVERSIONfetchallr	   get)r"   cursorrows      r'   get_table_listz$DatabaseIntrospection.get_table_list@   s    )*>>V# "??, #a&c"B"F"Fs1v"NO 
 '-oo&78sCF88
 9s   +B7Bc                 T   t        dd      |j                  d|g       t        fd|j                         D              }|j                  d| j                  j
                  j                  |      z         d }g }|j                  D ]  }t        |d         }|j                  t        |f|dd	 z    |||   j                        xs |d	    |||   j                        xs |d
    |||   j                        xs |d   fz   |d   fz   ||   j                  fz            |S )zx
            Returns a description of the table, with the DB-API
            cursor.description interface."
            InfoLinez3col_name data_type max_len num_prec num_scale extraz
                SELECT column_name, data_type, character_maximum_length,
                numeric_precision, numeric_scale, extra
                FROM information_schema.columns
                WHERE table_name = %s AND table_schema = DATABASE()c              3   2   K   | ]  }|d     | f  ywr   N ).0liner6   s     r'   	<genexpr>z>DatabaseIntrospection.get_table_description.<locals>.<genexpr>a   s#      /3a(D/*s   zSELECT * FROM %s LIMIT 1c                      | t        |       S | S )N)int)is    r'   <lambda>z=DatabaseIntrospection.get_table_description.<locals>.<lambda>g   s    s1v A r(   r   r            r   )r   r-   dictr0   
connectionops
quote_namer$   r   appendr   max_lennum_prec	num_scaler   )	r"   r2   
table_name
field_infoto_intfieldsr;   col_namer6   s	           @r'   get_table_descriptionz+DatabaseIntrospection.get_table_descriptionL   sk    "EH NN G
 '<)  7=7H J NN5!__00;;JGH I=FF** %d1g."&q)!,#)*X*>*F*F#G $.&*1g#)*X*>*G*G#H $.&*1g#)*X*>*H*H#I $.&*1g#/!/ $(7*!- $.h#7#=#="?	!@ 	B Mr(   c                    |j                  d|g       t        |j                               }|j                  d|g       t        d |j                         D              }|j                  dj                  | j                  j
                  j                  |                   t        j                  dk\  rm|j                  D cg c]W  }t        t        |d         f|dd z   |j                  |d   |d         fz   |j                  |d   |d	d
       z   |d
   fz    Y c}S |j                  D cg c]'  }|dd |j                  |d   |d         fz   |d	d z   ) c}S c c}w c c}w )zw
            Returns a description of the table, with the DB-API
            cursor.description interface.
            zSELECT column_name, character_maximum_length FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = %s AND table_schema = DATABASE() AND character_maximum_length IS NOT NULLzSELECT column_name, numeric_precision, numeric_scale FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = %s AND table_schema = DATABASE() AND data_type='decimal'c           
   3   z   K   | ].  }|d    t        |dd D cg c]  }t        |       c}      f 0 yc c}w w)r   r   N)tupler>   )r:   r;   ns      r'   r<   z>DatabaseIntrospection.get_table_description.<locals>.<genexpr>   s>      >#' !%QQR/I1A/I)JK >/Is   ;6;zSELECT * FROM {0} LIMIT 1r
   r   r   rA   rB   r   N)r-   rD   r0   formatrE   rF   rG   r.   r/   r$   r   r   r1   )r"   r2   rL   
length_mapnumeric_mapr;   s         r'   rQ   z+DatabaseIntrospection.get_table_descriptiony   s    NN; >HL	J
 foo/0J NND 	
  >+1??+<> >K NN6==##..z:< = ~~' %+$6$68
 ! "ZQ%8$:&*1Qi%0'1~~d1gtAw'G&I%J '2ood1gtAay&I%J (,Awj	%1 3 8 8 !' 2 2 !H
tAwQ @BBT!"XM 8s   AE 1,E%c           	      X    t        d t        | j                  ||            D              S )zu
        Returns a dictionary of {field_name: field_index} for the given table.
        Indexes are 0-based.
        c              3   0   K   | ]  \  }}|d    |f  ywr8   r9   )r:   r?   ds      r'   r<   z7DatabaseIntrospection._name_to_index.<locals>.<genexpr>   s"      E$!QQqT1I Es   )rD   	enumeraterQ   )r"   r2   rL   s      r'   _name_to_indexz$DatabaseIntrospection._name_to_index   s7    
  E)..vzB+D E E 	Er(   c                     | j                  ||      }i }t        j                  dk\  r|D ]  \  }}}||f||<    |S | j                  ||      }|D ]'  \  }}}| j                  ||      |   }	||   }
|	|f||
<   ) |S )z
        Returns a dictionary of {field_index: (field_index_other_table,
        other_table)}
        representing all relationships to the given table. Indexes are 0-based.
        r   )get_key_columnsr.   r/   r]   )r"   r2   rL   constraints	relationsmy_fieldnameother_tableother_fieldmy_field_dictother_field_indexmy_field_indexs              r'   get_relationsz#DatabaseIntrospection.get_relations   s     **6:>	>>V#:E E6k;+6*D	,'E //
CM:E M6k;$($7$7K%))4%6!!.|!<->,L	.)	M
 r(   c                 n    g }|j                  d|g       |j                  |j                                |S )z
        Returns a list of (column_name, referenced_table_name,
        referenced_column_name) for all key columns in given table.
        zSELECT 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-   extendr0   )r"   r2   rL   key_columnss       r'   r_   z%DatabaseIntrospection.get_key_columns   s@    
 5
 8Bl	D 	6??,-r(   c                    |j                  dj                  | j                  j                  j	                  |                   t        |j                               }t               }|D ]  }|d   dkD  s|j                  |d          ! i }|D ]@  }|d   |v r|d   |vrddd||d   <   |d   dk(  rd	||d      d
<   |d   r6d	||d      d<   B |S )NzSHOW INDEX FROM {0}rA   r      rB   F)primary_keyuniquePRIMARYTrn   ro   )	r-   rV   rE   rF   rG   listr0   setadd)r"   r2   rL   rowsmulticol_indexesr3   indexess          r'   get_indexesz!DatabaseIntrospection.get_indexes   s      &!4!4!?!?
!KL	N
 FOO%&5 	-C1vz $$SV,	-  
	1C1v))1vW$275"IA 1v"15A.q6,0A)
	1 r(   c                 l    | j                  ||      j                         D ]  }|d   d   s|d   c S  y)zP
        Returns the name of the primary key column for the given table
        r   rn   r   N)rw   items)r"   r2   rL   columns       r'   get_primary_key_columnz,DatabaseIntrospection.get_primary_key_column   sD    
 &&vz:@@B 	!Fay'ay 	! r(   c                     |j                  d|g       |j                         }|s | j                  j                  j                  S |d   S )z
        Retrieves the storage engine for a given table. Returns the default
        storage engine if the table doesn't exist.
        zBSELECT engine FROM information_schema.tables WHERE table_name = %sr   )r-   fetchonerE   featuresmysql_storage_engine)r"   r2   rL   results       r'   get_storage_enginez(DatabaseIntrospection.get_storage_engine   sK    
 	$&0\	3 "??++@@@ayr(   c                    i }d}|j                  || j                  j                  d   |g       |j                         D ]=  \  }}}}||vrt	               dddd|r||fndfd||<   ||   d   j                  |       ? d}	|j                  |	| j                  j                  d   |g       |j                         D ]E  \  }}
|
j                         dk(  rd	||   d
<   d	||   d<   *|
j                         dk(  s>d	||   d<   G |j                  d| j                  j                  j                  |      z         |j                         D cg c]  }|dd 	 c}D ]?  \  }}}}}||vrt	               ddd	ddd||<   d	||   d<   ||   d   j                  |       A |j                         D ]  }t        |d         |d<    |S c c}w )zv
        Retrieves any constraints or keys (unique, pk, fk, check, index) across
        one or more columns.
        zSELECT 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 = %s AND kc.table_name = %sNAMEFN)columnsrn   ro   indexcheckforeign_keyr   z
            SELECT c.constraint_name, c.constraint_type
            FROM information_schema.table_constraints AS c
            WHERE
                c.table_schema = %s AND
                c.table_name = %s
        zprimary keyTrn   ro   zSHOW INDEX FROM %srC   r   )r-   rE   settings_dictr0   r   rs   lowerrF   rG   valuesrq   )r"   r2   rL   r`   
name_query
constraintrz   	ref_table
ref_column
type_querykindxtable
non_uniquer   colseqs                   r'   get_constraintsz%DatabaseIntrospection.get_constraints   s7    ! 	 	zDOO$A$A&$I$.$0 	19?9J 	;5J	:,)|#(#""3=J/4$	+J' 
#I.226:	;
 	zDOO$A$A&$I$.$0 	1 & 1 	9Jzz|},9=J'648J'1)48J'1	9 	+doo.A.A.L.L/  	 :@9J9L12A 9L 	64E:uffK')|#(#!"#'&E" +/Kw'y)--f5	6 &,,. 	@J$(I)>$?Jy!	@!9Ls   G)%__name__
__module____qualname__r   BLOBDECIMAL
NEWDECIMALDATEDATETIMEDOUBLEFLOATINT24LONGLONGLONGSHORTr.   r/   STRINGTIME	TIMESTAMPTINY	TINY_BLOBMEDIUM_BLOB	LONG_BLOB
VAR_STRINGdata_types_reverser!   r4   rQ   r]   rh   r_   rw   r{   r   r   __classcell__)r&   s   @r'   r   r      s   > 	n 		
 	O 	, 	 	 	 	- 	$nnv5N;N 	+ 	  	_!" 	#$ 	[%& 	{'( 	[k+0	9 ~~+	Z'	RE* 2Br(   r   )recollectionsr   r.   r/   %django.db.backends.base.introspectionr   r   r	   django.db.backendsdjango.utils.encodingr   django.utils.datastructuresr   mysql.connector.constantsr   compileforeign_key_re_fieldsr   r9   r(   r'   <module>r      s    
 " 	>>V  =	>>V~~00~~: / B C 
>>V;	(9(9J(FGIc5 cr(   