o
    ˜¨ÊhGD  ã                   @   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   úZ/var/www/html/env/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 ƒS )	zi
        Return a description of the table with the DB-API cursor.description
        interface.
        úPRAGMA table_info(%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                    sH   g | ] \}}}}}}t ||d t|ƒd d | |ˆ  |¡|dk|ˆv ƒ‘qS )Nr   )r   r   Úget)rI   Úcidr   rD   ÚnotnullÚdefaultr
   ©Ú
collationsÚjson_columnsr   r   rK   v   s     óõÿz?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)rL   Ú
connectionÚopsÚ
quote_namerM   r   Ú_get_column_collationsÚsetÚfeaturesÚcan_introspect_json_fieldÚfetchoneÚadd)r9   rN   Ú
table_nameÚ
table_infoÚlineÚcolumnÚjson_constraint_sqlr   r   rU   r   Úget_table_descriptionX   s0   ÿ
÷
ö
€òz+DatabaseIntrospection.get_table_descriptionr   c                 C   s   |   ||¡}||dœgS )N)Útablerd   )Úget_primary_key_column)r9   rN   ra   Útable_fieldsÚpk_colr   r   r   Úget_sequences‡   s   z#DatabaseIntrospection.get_sequencesc                 C   s*   |  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   rX   rY   rZ   rM   )r9   rN   ra   r   r   r   Úget_relations‹   s   ÿ	÷z#DatabaseIntrospection.get_relationsc                 C   s@   |  d| jj |¡ ¡ | ¡ D ]�^}}}}|r|  S qdS )z>Return the column name of the primary key for the given table.rP   Nrq   )r9   rN   ra   rl   r   r
   r   r   r   rh   Ÿ   s   ÿÿz,DatabaseIntrospection.get_primary_key_columnc                 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ÚcolumnsÚprimary_keyÚforeign_keyÚcheckÚindex)r}   rz   r{   ry   r|   r~   )ÚmatchÚsqlparseÚtokensÚPunctuationÚKeywordÚttypeÚNameÚvalueÚLiteralÚStringÚSymbolÚappend)r9   r�   rz   ÚtokenÚis_constraint_definitionÚ
field_nameÚconstraint_namery   Ú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__rs   )r€   ÚparseÚflattenr   r�   r‚   r–   )r9   Úsqlrz   Ú	statementÚconstraintsÚunnamed_constrains_indexr�   r‹   rŽ   ry   r}   Ú	end_tokenr   r   r   Ú_parse_table_constraints  sF   ÿ
û
þÿ
þÿçz.DatabaseIntrospection._parse_table_constraintsc              	   C   s¶  i }z|  d| jj |¡f ¡ ¡ d }W n	 ty   Y nw dd„ |  ||¡D ƒ}| |  ||¡¡ |  d| jj |¡ ¡ | 	¡ D ]m}|dd… \}}}	|  d| jj |¡ ¡ | ¡ p_d	\}
|
sdqC|  d
| jj |¡ ¡ | 	¡ D ]\}}}||vrŠg dt
|	ƒddddœ||< || d  |¡ qt|| d r°tj|| d< |  |
¡}|dur°||| d< qC|  ||¡}|rÅ|g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>D  s    ÿz8DatabaseIntrospection.get_constraints.<locals>.<setcomp>zPRAGMA index_list(%s)Né   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%sr—   zPRAGMA index_info(%s)FT©rz   r{   ry   r|   r}   r~   rz   r~   ÚtypeÚordersÚ__primary__c              
   S   s8   i | ]\}\}\}}d |› �|gdd||fdddœ“qS )Úfk_Fr¦   r   )rI   r~   rn   ro   rm   r   r   r   rp   ‡  s    	øúÿz9DatabaseIntrospection.get_constraints.<locals>.<dictcomp>)rL   rX   rY   rZ   r_   Ú	TypeErrorrf   Úupdater¡   rM   r   rŠ   r   ÚsuffixÚ_get_index_columns_ordersrh   Ú	enumeraterr   Úitems)r9   rN   ra   rž   Útable_schemarz   rJ   Únumberr~   ry   rœ   Ú
index_rankÚcolumn_rankrd   r¨   Ú	pk_columnÚ	relationsr   r   r   Úget_constraints4  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   š  s    zCDatabaseIntrospection._get_index_columns_orders.<locals>.<listcomp>)r€   rš   Ú
isinstancerœ   ÚParenthesisÚstrr7   r6   )r9   rœ   r�   r‹   rz   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   rv   r¸   r¹   r   ú"ÚCOLLATE)rL   r_   r¿   r€   rš   r7   r6   r¯   )r9   rN   ra   rJ   rœ   rz   rV   rd   r�   rn   r~   r‹   Ú	collationr   r   r   r[   �  s,   úù"þ
z,DatabaseIntrospection._get_column_collations)r   )r<   r=   r>   r   Údata_types_reverserC   rO   rf   rk   rr   rh   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    
ÿ	