
    hK                         d dl Z d dlmZ d dl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      Zd	 Z G d
 d      Z G d de      Zy)    N)
namedtuple)BaseDatabaseIntrospection	FieldInfo	TableInfo)Index)_lazy_re_compiler   )pkhas_json_constraintz&^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$c                 P    t         j                  |       }|rt        |d         S dS )z8 Extract the size number from a "varchar(11)" type name    N)field_size_researchint)namems     k/var/www/html/ranktracker/api/venv/lib/python3.12/site-packages/django/db/backends/sqlite3/introspection.pyget_field_sizer      s'    T"A3qt9#t#    c                       e Zd Zi ddddddddddd	d
dd
dddddddddddddddddddddd d!Zd" Zy#)$FlexibleFieldLookupDictboolBooleanFieldbooleansmallintSmallIntegerFieldzsmallint unsignedPositiveSmallIntegerFieldsmallintegerr   IntegerFieldintegerbigintBigIntegerFieldzinteger unsignedPositiveIntegerFieldzbigint unsignedPositiveBigIntegerFielddecimalDecimalFieldreal
FloatFieldtext	TextFieldchar	CharFieldvarcharblobBinaryFielddate	DateFieldDateTimeField	TimeField)datetimetimec                     |j                         j                  dd      d   j                         }| j                  |   S )N(r   r   )lowersplitstripbase_data_types_reverse)selfkeys     r   __getitem__z#FlexibleFieldLookupDict.__getitem__4   s9    iikQ'*002++C00r   N)__name__
__module____qualname__r:   r=    r   r   r   r      s    > 	' 	8	
 	+ 	~ 	> 	# 	2 	4 	> 	 	 	 	;  	!" 	#$ $',1r   r   c                   j     e Zd Z e       Z fdZd Zd ZddZd Z	d Z
d Zd Zd	 Zd
 Zd Z xZS )DatabaseIntrospectionc                 d    t         |   ||      }|j                  r|dv ry|j                  ry|S )N>   r   r!   r   	AutoField	JSONField)superget_field_typer	   r
   )r;   	data_typedescription
field_type	__class__s       r   rH   z$DatabaseIntrospection.get_field_type<   s:    W+I{C
>>j,dd **r   c                     |j                  d       |j                         D cg c]  }t        |d   |d   d          c}S c c}w )z>Return a list of table and view names in the current database.z
            SELECT name, type FROM sqlite_master
            WHERE type in ('table', 'view') AND NOT name='sqlite_sequence'
            ORDER BY namer   r   )executefetchallr   )r;   cursorrows      r   get_table_listz$DatabaseIntrospection.get_table_listF   sE     	  	 9?8IJ	#a&#a&),JJJs   Ac                 
   |j                  d| j                  j                  j                  |      z         |j	                         }t               }| j                  j                  j                  rG|D ]B  }|d   }d|z  }|j                  d||g      j                         }|s2|j                  |       D |D 	
cg c],  \  }	}
}}}}t        |
|dt        |      dd| ||dk(  |
|v 
      . c}}}}}
}	S c c}}}}}
}	w )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        zPRAGMA table_info(%s)r   z%%json_valid("%s")%%z
                    SELECT sql
                    FROM sqlite_master
                    WHERE
                        type = 'table' AND
                        name = %s AND
                        sql LIKE %s
                N)rN   
connectionops
quote_namerO   setfeaturescan_introspect_json_fieldfetchoneaddr   r   )r;   rP   
table_name
table_infojson_columnslinecolumnjson_constraint_sqlr
   cidr   rI   notnulldefaultr	   s                  r   get_table_descriptionz+DatabaseIntrospection.get_table_descriptionP   s   
 	.1D1D1O1OPZ1[[\__&
u??##==" -a&<v&E#&,nn 6 !"56'8 9A
 $ ' $$V,-$ ?I
 

 ;T9gw	 i~i'@$WbAgt|/C
 	
 
s   1C;c                 2    | j                  ||      }||dgS )N)tabler`   )get_primary_key_column)r;   rP   r\   table_fieldspk_cols        r   get_sequencesz#DatabaseIntrospection.get_sequencesn   s"    ,,VZ@$788r   c                 T   i }|j                  d|g       |j                         \  }}|dk(  r|S ||j                  d      dz   |j                  d       }|j	                  d      D ]  }|j                         }|j                  d      r&t        j                  d|t        j                        }|sN|j                         D 	cg c]  }	|	j                  d	       c}	\  }
}|j                  d
      r:t        j                  d|t        j                        }|d   j                  d	      }n"|j	                         d   j                  d	      }|j                  d|
g       |j                         d   }|d   j                         }|j                  d      |j                  d      }}||dz   | }|j	                  d      D ]W  }|j                         }|j                  d      r%|j	                  dd      d   j                  d	      }||k(  sO||
f||<      |S c c}	w )z
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        USELECT sql, type FROM sqlite_master WHERE tbl_name = %s AND type IN ('table', 'view')viewr6   r   ),UNIQUEz$references (\S*) ?\(["|]?(.*)["|]?\)"zFOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*r   z1SELECT sql FROM sqlite_master WHERE tbl_name = %s )rN   rZ   indexrindexr8   r9   
startswithrer   IgroupsmatchrO   )r;   rP   r\   	relations
create_sql
table_typeresults
field_descr   srg   r`   
field_nameresultother_table_resultsliri
other_desc
other_names                      r   get_relationsz#DatabaseIntrospection.get_relationsr   s     	 	@L	

 "(!2
JZ--c2Q6z7H7H7MN
 "--, 	J#))+J$$X.		A:rttTA3488:>aQWWS\>ME6$$]3HH<j"$$OqTZZ_
'--/288=
NNNQVPWX__&q)F"()//"3(..s35H5O5OPS5TB"5b1fR"@177< 
'--/
((2'--c15a8>>sC
'-7,?Ij)/	B 3 ?s   H%c                    g }|j                  d|dg       |j                         d   j                         }||j                  d      dz   |j	                  d       }t        |j                  d            D ]~  \  }}|j                         }|j                  d      r(t        j                  d	|t        j                        }|sP|j                  t        d
 |j                         D                      |S )z
        Return a list of (column_name, referenced_table_name, referenced_column_name)
        for all key columns in given table.
        z?SELECT sql FROM sqlite_master WHERE tbl_name = %s AND type = %srg   r   r6   r   ro   rp   rq   z("(.*)".*references (.*) \(["|](.*)["|]\)c              3   >   K   | ]  }|j                  d         yw)rr   N)r9   ).0r   s     r   	<genexpr>z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>   s     $FaQWWS\$Fs   )rN   rZ   r9   rt   ru   	enumerater8   rv   rw   r   rx   appendtuplery   )r;   rP   r\   key_columnsr~   field_indexr   r   s           r   get_key_columnsz%DatabaseIntrospection.get_key_columns   s    
  	X[egnZop//#A&,,.'--,q01DE
 (1s1C'D 
	H#K#))+J$$X.		EzSUSWSWXA u$F188:$FFG
	H r   c                 n   |j                  d|g       |j                         }|t        d|z        |\  }}|dk(  ry||j                  d      dz   |j	                  d       }|j                  d      D ]=  }|j                         }t        j                  d	|      }|s,|d   r|d   c S |d
   c S  y)z>Return the column name of the primary key for the given table.rm   NzTable %s does not existrn   r6   r   ro   rp   z1(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*   )	rN   rZ   
ValueErrorrt   ru   r8   r9   rw   rz   )	r;   rP   r\   rQ   r|   r}   
fields_sqlr   r   s	            r   rh   z,DatabaseIntrospection.get_primary_key_column   s     	@L	

 oo;6CDD!$
J
 0 0 5 9*:K:KC:PQ
$**3/ 	.J#))+JMzZA tqt-1-		.
 r   c                     i }|j                  d| j                  j                  j                  |      z         |j	                         D ]  }|d d \  }}}}}	|gdd||	fddd|d|z  <   ! |S )NzPRAGMA foreign_key_list(%s)   Fcolumnsprimary_keyuniqueforeign_keycheckrt   zfk_%d)rN   rT   rU   rV   rO   )
r;   rP   r\   constraintsrQ   id__rg   from_tos
             r   _get_foreign_key_constraintsz2DatabaseIntrospection._get_foreign_key_constraints   s    4t7J7J7U7UV`7aab??$ 
	C'*2Aw$CE5"!7$ %r{*K#&
	 r   c                    d }d }d }d }d}g }d}	g }
d}|D ]<  }|j                  t        j                  j                  d      r|dz  }ni|j                  t        j                  j                  d      r|dz  }|dk  r5 n|dk(  r-|j                  t        j                  j                  d      r n|-|j                  t        j                  j                  d      }|r|r||j
                  t        j                  j                  t        j                  j                  fv r|j                  }nJ|j
                  t        j                  j                  j                  j                  k(  r|j                  dd }|j                  t        j                  j                  d	      rd
}|}n|r|k(  r|rd}|j
                  t        j                  j                  t        j                  j                  fv r|j                  |j                         n |j
                  t        j                  j                  j                  j                  k(  r|j                  |j                  dd        n||j
                  t        j                  j                  t        j                  j                  fv r|j                  }nJ|j
                  t        j                  j                  j                  j                  k(  r|j                  dd }|j                  t        j                  j                  d	      r|g}|j                  t        j                  j                  d      rd
}	|}S|	sW|k(  r|
rd}	b|j
                  t        j                  j                  t        j                  j                  fv r-|j                  |v s|
j                  |j                         |j
                  t        j                  j                  j                  j                  k(  s|j                  dd |v s|
j                  |j                  dd        ? |r	d
|dd dddnd }|
r	d
|
ddd ddnd }||||fS )NFr   r6   r   ro   rp   
CONSTRAINTrq   TCHECK)r   r   r   r   r   rt   )r   r   r   r   r   rt   )rz   sqlparsetokensPunctuationKeywordttypeNamevalueLiteralStringSymbolr   )r;   r   r   tokenis_constraint_definitionr   constraint_namer   unique_columnsr   check_columnsbraces_deepunique_braces_deepcheck_braces_deepunique_constraintcheck_constraints                   r   &_parse_column_or_constraint_definitionz<DatabaseIntrospection._parse_column_or_constraint_definition   s   #' 
 =	@E{{8??66<q X__88#>q ?!ekk(//2M2Ms&S'/+0;;x7N7NP\+](+'"*{{x';';X__=T=T&UU*/++(?(?(F(F(M(MM*/++a*;;;x66A!F)4&)[8)%*F {{x';';X__=T=T&UU&--ekk:(?(?(F(F(M(MM&--ekk!B.?@ %{{x';';X__=T=T&UU%*[[
(?(?(F(F(M(MM%*[[2%6
;;x66A&0\N{{8??22G<$/!$3$ %;;8??#7#79P9P"QQ{{g-%,,U[[9[[HOO$;$;$B$B$I$II{{1R(G3%,,U[[2->?{=	@J  % 
 "& 	  $ 
 !% 	  13CUJJr   c                    t        j                  |      d   }i }d}d |j                         D        }|D ].  }|j                  t         j                  j
                  d      s. n 	 | j                  ||      \  }}	}
}|	r|r|	||<   n|dz  }|	|d|z  <   |
r|r|
||<   n|dz  }|
|d|z  <   |j                  t         j                  j
                  d      r	 |S s)Nr   c              3   :   K   | ]  }|j                   r|  y wN)is_whitespace)r   r   s     r   r   zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>P  s     TE@S@S%Ts   r6   r   z__unnamed_constraint_%s__ro   )r   parseflattenrz   r   r   r   )r;   sqlr   	statementr   unnamed_constrains_indexr   r   r   r   r   	end_tokens               r   _parse_table_constraintsz.DatabaseIntrospection._parse_table_constraintsJ  s     NN3'*	#$ TY%6%6%8T 	E{{8??66<	 8<8c8cdjls8t5OVUI"39K0,1,Z`K ;>V VW"38K0,1,Z_K ;>V VWx::C@! r   c           	      D   i }	 |j                  d| j                  j                  j                  |            j	                         d   }| j                  ||      D ch c]  }|j                   }}|j                  | j                  ||             |j                  d| j                  j                  j                  |      z         |j                         D ]c  }|dd \  }}	}
|j                  d| j                  j                  j                  |	      z         |j	                         xs d\  }|s]|j                  d| j                  j                  j                  |	      z         |j                         D ]6  \  }}}|	|vrg d	t        |
      dd	d
d||	<   ||	   d   j                  |       8 ||	   d   s||	   d   rt        j                  ||	   d<   |j                  d      d   j                  d      d   j                  d      }|D cg c]  }|j!                  d      rdnd }}|||	   d<   f | j#                  ||      }|r|gd
d	dd	d	d|d<   |j                  | j%                  ||             |S c c}w # t        $ r Y w xY wc c}w )zu
        Retrieve any constraints or keys (unique, pk, fk, check, index) across
        one or more columns.
        z:SELECT sql FROM sqlite_master WHERE type='table' and name=r   zPRAGMA index_list(%s)N   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%sr   zPRAGMA index_info(%s)FTr   r   rt   r   typer6   r   ro   rp   DESCASCorders__primary__)rN   rT   rU   rV   rZ   re   r   updater   	TypeErrorrO   r   r   r   suffixr8   endswithrh   r   )r;   rP   r\   r   table_schemainfor   rQ   numberrt   r   r   
index_rankcolumn_rankr`   
order_infor   	pk_columns                     r   get_constraintsz%DatabaseIntrospection.get_constraintsh  s   
 	U!>>OO''22:> hj	L .2-G-GPZ-[\Ttyy\G\t<<\7ST 	.1D1D1O1OPZ1[[\??$ &	6C %(G!FE6NN137??3F3F3Q3QRW3XY
 ??$/DC NN2T__5H5H5S5STY5ZZ[39??3D 
=/
K+#%',"&v,'+!&!%*K& E"9-44V<
= 5!'*;u3Eh3O-2\\E"6* YYs^B/55c:1=CCCH
Q[\DMM&$9&uD\\/5E"8,M&	6P //
C	 &;##*K& 	4<<VZPQy ]	  		\ ]s   AJ  JJ	JJ)rA   )r>   r?   r@   r   data_types_reverserH   rR   re   rk   r   r   rh   r   r   r   r   __classcell__)rL   s   @r   rC   rC   9   sI    02K
<98t:. XKt<Mr   rC   )rw   collectionsr   r   %django.db.backends.base.introspectionr   r   BaseFieldInfor   django.db.modelsr   django.utils.regex_helperr   _fieldsr   r   r   rC   rA   r   r   <module>r      sa    	 "   # 6{M$9$9<Y$YZ	 !JK$1 1>|5 |r   