o
    þÞh
F  ã                   @   sž   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ ed	ejd
 ƒZedƒZdd„ ZG dd„ dƒZG dd„ deƒZdS )é    )Ú
namedtupleN)ÚDatabaseError)ÚBaseDatabaseIntrospection)Ú	FieldInfo©Ú	TableInfo)ÚIndex)Ú_lazy_re_compiler   )ÚpkÚhas_json_constraintz&^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$c                 C   s   t  | ¡}|rt|d ƒS dS )z6Extract the size number from a "varchar(11)" type nameé   N)Úfield_size_reÚsearchÚint)ÚnameÚm© r   úh/var/www/html/premium_crap/venv/lib/python3.10/site-packages/django/db/backends/sqlite3/introspection.pyÚget_field_size   s   
r   c                   @   sˆ   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"d#„ Zd$S )%Ú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                 C   s"   |  ¡  dd¡d  ¡ }| j| S )Nú(r   r   )ÚlowerÚsplitÚstripÚbase_data_types_reverse)ÚselfÚkeyr   r   r   Ú__getitem__6   s   
z#FlexibleFieldLookupDict.__getitem__N)Ú__name__Ú
__module__Ú__qualname__r8   r;   r   r   r   r   r      sP    ÿþýüûúùø	÷
öõôóòñðïír   c                       st   e Zd Zeƒ Z‡ fdd„Zdd„ Zdd„ Zddd	„Zd
d„ Z	dd„ Z
dd„ Zdd„ Zdd„ Zdd„ Zdd„ Z‡  ZS )ÚDatabaseIntrospectionc                    s.   t ƒ  ||¡}|jr|dv rdS |jrdS |S )N>   r   r    r   Ú	AutoFieldÚ	JSONField)ÚsuperÚget_field_typer
   r   )r9   Ú	data_typeÚdescriptionÚ
field_type©Ú	__class__r   r   rC   >   s   z$DatabaseIntrospection.get_field_typec                 C   s   |  d¡ dd„ | ¡ D ƒS )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 namec                 S   s"   g | ]}t |d  |d d  ƒ‘qS )r   r   r   )Ú.0Úrowr   r   r   Ú
<listcomp>V   s   " z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r9   Úcursorr   r   r   Úget_table_listL   s   ÿz$DatabaseIntrospection.get_table_listc                    sà   |  d| jj |¡ ¡ | ¡ }|std|› d�ƒ‚|  ||¡‰ tƒ ‰| jjj	rF|D ]}|d }d| }|  d||g¡ 
¡ }|rEˆ |¡ q*‡ ‡fdd„|D ƒ}d	d„ t|ƒD ƒ}	t|	ƒdkrn|	D ]}
||
 jd
d�||
< qa|S )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        zPRAGMA table_xinfo(%s)zTable z does not exist (empty pragma).r   z%%json_valid("%s")%%zæ
                    SELECT sql
                    FROM sqlite_master
                    WHERE
                        type = 'table' AND
                        name = %s AND
                        sql LIKE %s
                c                    sR   g | ]%\}}}}}}}|d v rt ||t|ƒddd| |ˆ  |¡t|ƒ|ˆv ƒ‘qS ))r   é   é   N)r   r   Úgetr   )rI   Úcidr   rD   ÚnotnullÚdefaultr
   Úhidden©Ú
collationsÚjson_columnsr   r   rK   v   s&    ÿòõz?DatabaseIntrospection.get_table_description.<locals>.<listcomp>c                 S   s   g | ]	\}}|j r|‘qS r   ©r
   )rI   ÚindexÚ
field_infor   r   r   rK   Ž   s
    
ÿÿFrZ   )rL   Ú
connectionÚopsÚ
quote_namerM   r   Ú_get_column_collationsÚsetÚfeaturesÚcan_introspect_json_fieldÚfetchoneÚaddÚ	enumerateÚlenÚ_replace)r9   rN   Ú
table_nameÚ
table_infoÚlineÚcolumnÚjson_constraint_sqlr   Útable_descriptionÚprimary_keyr[   r   rW   r   Úget_table_descriptionX   s>   ÿ
÷
ö
€òÿz+DatabaseIntrospection.get_table_descriptionr   c                 C   s   |   ||¡}||dœgS )N)Útablerl   )Úget_primary_key_column)r9   rN   ri   Útable_fieldsÚpk_colr   r   r   Úget_sequences–   s   z#DatabaseIntrospection.get_sequencesc                 C   ó*   |  d| jj |¡ ¡ dd„ | ¡ D ƒS )z“
        Return a dictionary of {column_name: (ref_column_name, ref_table_name)}
        representing all foreign keys in the given table.
        zPRAGMA foreign_key_list(%s)c                 S   s"   i | ]^}}}}}}|||f“qS r   r   )rI   Ú_Úref_table_nameÚcolumn_nameÚref_column_namer   r   r   Ú
<dictcomp>¢   s    ùÿz7DatabaseIntrospection.get_relations.<locals>.<dictcomp>©rL   r]   r^   r_   rM   ©r9   rN   ri   r   r   r   Úget_relationsš   s   ÿ	÷z#DatabaseIntrospection.get_relationsc                 C   rv   )NzPRAGMA table_info(%s)c                 S   s   g | ]�^}}}}|r|‘qS r   r   )rI   rw   r   r
   r   r   r   rK   ²   ó    zADatabaseIntrospection.get_primary_key_columns.<locals>.<listcomp>r|   r}   r   r   r   Úget_primary_key_columns®   s   ÿz-DatabaseIntrospection.get_primary_key_columnsc                 C   s²  d }d }d }d }d}g }d}	g }
d}|D �]!}|  tjjd¡r$|d7 }n"|  tjjd¡r8|d8 }|dk r7 �n n|dkrF|  tjjd¡rF nñ|d u rU|  tjjd¡}|rUq|r¸|d u rz|jtjjtjjfv rj|j}n|jtjjj	j
krz|jdd… }|  tjjd	¡r‡d
}|}n_|r·||kr’|r‘d}q|jtjjtjjfv r¤| |j¡ nB|jtjjj	j
kr·| |jdd… ¡ n.|d u rÛ|jtjjtjjfv rË|j}n|jtjjj	j
krÛ|jdd… }|  tjjd	¡ræ|g}|  tjjd¡ród
}	|}q|	�r6||krÿ|
rþd}	q|jtjjtjjfv �r|j|v �r|
 |j¡ q|jtjjj	j
k�r6|jdd… |v �r6|
 |jdd… ¡ q|�rCd
|dd dddœnd }|
�rQd
|
ddd ddœnd }||||fS )NFr   r4   r   ú)ú,Ú
CONSTRAINTéÿÿÿÿÚUNIQUETÚCHECK)ÚuniqueÚcolumnsro   Úforeign_keyÚcheckr[   )rŠ   rˆ   ro   r‡   r‰   r[   )ÚmatchÚsqlparseÚtokensÚPunctuationÚKeywordÚttypeÚNameÚvalueÚLiteralÚStringÚSymbolÚappend)r9   r�   rˆ   ÚtokenÚis_constraint_definitionÚ
field_nameÚconstraint_namer‡   Úunique_columnsrŠ   Úcheck_columnsÚbraces_deepÚunique_braces_deepÚcheck_braces_deepÚunique_constraintÚcheck_constraintr   r   r   Ú&_parse_column_or_constraint_definition´   s´   

þÿ€€€
øú	öøú	öz<DatabaseIntrospection._parse_column_or_constraint_definitionc                 C   sÀ   t  |¡d }i }d}dd„ | ¡ D ƒ}|D ]}| t jjd¡r" nq	 |  ||¡\}}	}
}|	rA|r7|	||< n
|d7 }|	|d| < |
rT|rJ|
||< n
|d7 }|
|d| < | t jjd¡r_	 |S q$)	Nr   c                 s   s   � | ]}|j s|V  qd S ©N)Úis_whitespace)rI   r—   r   r   r   Ú	<genexpr>  s   € zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r4   Tr   z__unnamed_constraint_%s__r�   )rŒ   ÚparseÚflattenr‹   r�   rŽ   r¢   )r9   Úsqlrˆ   Ú	statementÚconstraintsÚunnamed_constrains_indexr�   r—   rš   r‡   rŠ   Ú	end_tokenr   r   r   Ú_parse_table_constraints  sF   ÿ
û
þÿ
þÿçz.DatabaseIntrospection._parse_table_constraintsc              	   C   sž  i }z|  d|g¡ ¡ d }W n	 ty   Y nw dd„ |  ||¡D ƒ}| |  ||¡¡ |  d| jj |¡ ¡ | 	¡ D ]h}|dd… \}}}	|  d|g¡ | ¡ pTd	\}
|
sYq=|  d
| jj |¡ ¡ | 	¡ D ]\}}}||vrg dt
|	ƒddddœ||< || d  |¡ qi|| d r¥tj|| d< |  |
¡}|dur¥||| d< q=|  ||¡}|r¹|ddddddœ|d< t|  ||¡ ¡ ƒ}| dd„ |D ƒ¡ |S )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=%sr   c                 S   s   h | ]}|j ’qS r   )r   ©rI   Úinfor   r   r   Ú	<setcomp>O  s    ÿz8DatabaseIntrospection.get_constraints.<locals>.<setcomp>zPRAGMA index_list(%s)NrQ   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%sr£   zPRAGMA index_info(%s)FT©rˆ   ro   r‡   r‰   rŠ   r[   rˆ   r[   ÚtypeÚordersÚ__primary__c              
   S   s8   i | ]\}\}\}}d |› �|gdd||fdddœ“qS )Úfk_Fr±   r   )rI   r[   ry   rz   rx   r   r   r   r{   ’  s    	øúÿz9DatabaseIntrospection.get_constraints.<locals>.<dictcomp>)rL   rd   Ú	TypeErrorrp   Úupdater­   r]   r^   r_   rM   r   r–   r   ÚsuffixÚ_get_index_columns_ordersr€   rf   r~   Úitems)r9   rN   ri   rª   Útable_schemarˆ   rJ   Únumberr[   r‡   r¨   Ú
index_rankÚcolumn_rankrl   r³   Ú
pk_columnsÚ	relationsr   r   r   Úget_constraints?  s|   þýþ
ÿÿþÿ
ú
€
ú	÷ÿz%DatabaseIntrospection.get_constraintsc                 C   sP   t  |¡d }|D ]}t|t jjƒr%t|ƒ d¡ d¡}dd„ |D ƒ  S q	d S )Nr   ú()ú, c                 S   s   g | ]}|  d ¡rd nd‘qS )ÚDESCÚASC)Úendswithr®   r   r   r   rK   ¥  r   zCDatabaseIntrospection._get_index_columns_orders.<locals>.<listcomp>)rŒ   r¦   Ú
isinstancer¨   ÚParenthesisÚstrr7   r6   )r9   r¨   r�   r—   rˆ   r   r   r   r¹      s   þz/DatabaseIntrospection._get_index_columns_ordersc                 C   sª   |  d|g¡ ¡ }|si S |d }tt |¡d d ƒ d¡ d¡}i }|D ],}|dd …  ¡ }|d  d¡}	t|ƒD ]\}
}|dkrK||
d  } nq;d }|||	< q&|S )	Nzn
            SELECT sql
            FROM sqlite_master
            WHERE type = 'table' AND name = %s
        r   r„   rÂ   rÃ   r   ú"ÚCOLLATE)rL   rd   rÉ   rŒ   r¦   r7   r6   rf   )r9   rN   ri   rJ   r¨   rˆ   rX   rl   r�   ry   r[   r—   Ú	collationr   r   r   r`   ¨  s,   úù"þ
z,DatabaseIntrospection._get_column_collations)r   )r<   r=   r>   r   Údata_types_reverserC   rO   rp   ru   r~   r€   r¢   r­   rÁ   r¹   r`   Ú__classcell__r   r   rG   r   r?   ;   s    
>d'ar?   )Úcollectionsr   rŒ   Ú	django.dbr   Ú%django.db.backends.base.introspectionr   r   ÚBaseFieldInfor   Údjango.db.modelsr   Údjango.utils.regex_helperr	   Ú_fieldsr   r   r   r?   r   r   r   r   Ú<module>   s    
ÿ	