
    h1                         d dl 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  edej                  dz         Z ed	d
      Z G d de      Zy)    )
namedtupleN)
FIELD_TYPE)BaseDatabaseIntrospection	FieldInfo	TableInfo)Index)
OrderedSetr   )extrais_unsignedhas_json_constraintInfoLinezNcol_name data_type max_len num_prec num_scale extra column_default is_unsignedc            	       r    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j0                  diZ fdZd Zd ZddZd Zd Zd Z d Z!d Z" xZ#S )DatabaseIntrospection	TextField	CharFieldDecimalField	DateFieldDateTimeField
FloatFieldIntegerField	JSONFieldBigIntegerFieldSmallIntegerField	TimeFieldc                     t         |   ||      }d|j                  v r|dk(  ry|dk(  ry|dk(  ry|j                  r|dk(  ry|dk(  ry	|dk(  ry
|j                  ry|S )Nauto_incrementr   	AutoFieldr   BigAutoFieldr   SmallAutoFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerFieldr   )superget_field_typer
   r   r   )self	data_typedescription
field_type	__class__s       i/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/mysql/introspection.pyr$   z$DatabaseIntrospection.get_field_type)   s    W+I{C
{000^+"00%22'""..0~--222 **    c           
          |j                  d       |j                         D cg c]&  }t        |d   dddj                  |d               ( c}S c c}w )z>Return a list of table and view names in the current database.zSHOW FULL TABLESr   tv)z
BASE TABLEVIEW   )executefetchallr   get)r%   cursorrows      r*   get_table_listz$DatabaseIntrospection.get_table_list?   sU    )*!??,. #a&c"B"F"Fs1v"NO . 	. .s   +Ac           	      >   i }| j                   j                  rS| j                   j                  j                  r3|j	                  d|g       |j                         D ch c]  }|d   	 }}|j	                  d|g       |j                         D ci c]  }|d   t        |  }}|j	                  d| j                   j                  j                  |      z         d }g }|j                  D ]  }||d      }	|j                  t        g |dd  ||	j                        xs |d    ||	j                        xs |d    ||	j                        xs |d	   |d
   |	j                  |	j                   |	j"                  |d   |v          |S c c}w c c}w )zj
        Return a description of the table with the DB-API cursor.description
        interface."
        aZ  
                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()
            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()zSELECT * FROM %s LIMIT 1c                      | t        |       S | S N)int)is    r*   to_intz;DatabaseIntrospection.get_table_description.<locals>.to_intj   s    ]3q611r+   N            )
connectionmysql_is_mariadbfeaturescan_introspect_json_fieldr1   r2   r   ops
quote_namer'   appendr   max_lennum_prec	num_scalecolumn_defaultr
   r   )
r%   r4   
table_namejson_constraintsr5   line
field_infor<   fieldsinfos
             r*   get_table_descriptionz+DatabaseIntrospection.get_table_descriptionE   s   
 ??++0H0H0b0b NN   39//2CD3ADD 	 	C FPL		R <B??;LM4d1gx.M
M1DOO4G4G4R4RS]4^^_	2 && 	Dd1g&DMM) 
bq
t||$/Q
 t}}%0a
 t~~&1$q'	

 Q
 ##
 


   
 Q++
 
	 K  E  Ns   FFc                 t    | j                  ||      D ]"  }d|j                  v s||j                  dgc S  g S )Nr   )tablecolumn)rR   r
   name)r%   r4   rL   table_fieldsrO   s        r*   get_sequencesz#DatabaseIntrospection.get_sequences}   sG    44VZH 	JJ:#3#33",
HII	J 	r+   c                 R    | j                  ||      }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)r%   r4   rL   constraints	relationsmy_fieldnameother_tableother_fields           r*   get_relationsz#DatabaseIntrospection.get_relations   sH    
 **6:>	6A 	A2L+{'2K&@Il#	Ar+   c                 n    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)r1   extendr2   )r%   r4   rL   key_columnss       r*   rZ   z%DatabaseIntrospection.get_key_columns   s@    
  : =G<	I 	6??,-r+   c                     |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   )r1   fetchonerA   rC   _mysql_storage_engine)r%   r4   rL   results       r*   get_storage_enginez(DatabaseIntrospection.get_storage_engine   sK    
 	$&0\	3 "??++AAAayr+   c                    t               }t        j                  |      d   }d |j                         D        }|D ]  }|j                  t        j
                  j                  k(  s+| j                  j                  j                  |j                        |j                  k(  sh|j                  dd |v sz|j                  |j                  dd         |S )Nr   c              3   :   K   | ]  }|j                   r|  y wr9   )is_whitespace).0tokens     r*   	<genexpr>zBDatabaseIntrospection._parse_constraint_columns.<locals>.<genexpr>   s     TE@S@S%Ts   r0   )r	   sqlparseparseflattenttypetokensNamerA   rE   rF   valueadd)r%   check_clausecolumnscheck_columns	statementrt   rm   s          r*   _parse_constraint_columnsz/DatabaseIntrospection._parse_constraint_columns   s    "NN<03	TY%6%6%8T 	5Ex333##..u{{;u{{JAb!W,!!%++a"34	5 r+   c                 4   i }d}|j                  ||g       |j                         D ]<  \  }}}}||vrt               dddd|r||fndd||<   ||   d   j                  |       > d}	|j                  |	|g       |j                         D ]E  \  }}
|
j	                         dk(  rd||   d	<   d||   d
<   *|
j	                         d
k(  s>d||   d
<   G | j
                  j                  j                  rd}| j                  ||      D ch c]  }|j                   }}| j
                  j                  rd}	nd}	|j                  |	|g       |j                         D ]<  \  }}| j                  ||      }t        |      |hk(  r
|dz  }d|z  }|dddddd||<   > |j                  d| j
                  j                  j                  |      z         |j                         D cg c]  }|dd |d   fz    c}D ]j  \  }}}}}}||vrt               ddddd||<   d||   d<   |dk(  rt        j                   n|j	                         ||   d<   ||   d   j                  |       l |j#                         D ]  }t%        |d         |d<    |S c c}w c c}w )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)ry   primary_keyuniqueindexcheckforeign_keyry   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   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
                r0   z__unnamed_constraint_%s__zSHOW INDEX FROM %sr?   
   )ry   r~   r   r   r   r   BTREEtype)r1   r2   r	   rw   lowerrA   rC    can_introspect_check_constraintsrR   rV   rB   r|   setrE   rF   r   suffixvalueslist)r%   r4   rL   r[   
name_query
constraintrU   	ref_table
ref_column
type_querykindunnamed_constraints_indexrQ   ry   rx   constraint_columnsxrT   
non_uniquer   colseqtype_s                         r*   get_constraintsz%DatabaseIntrospection.get_constraints   s   
 
 	zJ<09?9J 
	;5J	:,)|#(#"">HIz#:d+J' 
#I.226:
	;
 	zJ<0 & 1 	9Jzz|},9=J'648J'1)48J'1	9 ??##DD()%-1-G-GPZ-[\Ttyy\G\//

 NN:
|4,2OO,= (
L%)%C%CLRY%Z" )*zl:-2-!<?X!XJ1#(#"!#'+J'" 	+doo.A.A.L.LZ.XXYZ`ZiZiZk?lUV"12@P?l 	6;E:uffeK')|#(#"#'&E" +/Kw'9>'9Iu{{}Kv&y)--f5	6 &,,. 	@J$(I)>$?Jy!	@q ]R @ms   
J%J) )$__name__
__module____qualname__r   BLOBCHARDECIMAL
NEWDECIMALDATEDATETIMEDOUBLEFLOATINT24JSONLONGLONGLONGSHORTSTRINGTIME	TIMESTAMPTINY	TINY_BLOBMEDIUM_BLOB	LONG_BLOB
VAR_STRINGdata_types_reverser$   r6   rR   rX   r`   rZ   rh   r|   r   __classcell__)r)   s   @r*   r   r      s    	N 	~	
 	 	_ 	< 	, 	. 	 	 	. 	- 	; 	  	o!" 	#$ 	kk{+0,.6p	 fr+   r   )collectionsr   rp   MySQLdb.constantsr   %django.db.backends.base.introspectionr   r   BaseFieldInfor   django.db.modelsr   django.utils.datastructuresr	   _fieldsr   r   r   r+   r*   <module>r      sT    "  (  # 2{M$9$9<k$kl	j"rsP5 Pr+   