o
    ÕèFh�D  ã                   @   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   úa/var/www/html/loop/nvenv/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.
        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| |ˆ  |¡|dk|ˆv ƒ‘qS ))r   é   é   Nr   )r   r   Úget)rI   Úcidr   rD   ÚnotnullÚdefaultr
   Úhidden©Ú
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   rW   r   Úget_table_descriptionX   s0   ÿ
÷
ö
€òz+DatabaseIntrospection.get_table_descriptionr   c                 C   s   |   ||¡}||dœgS )N)Útablerf   )Úget_primary_key_column)r9   rN   rc   Ú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   rZ   r[   r\   rM   ©r9   rN   rc   r   r   r   Úget_relations‘   s   ÿ	÷z#DatabaseIntrospection.get_relationsc                 C   rn   )NzPRAGMA table_info(%s)c                 S   s   g | ]�^}}}}|r|‘qS r   r   )rI   ro   r   r
   r   r   r   rK   ©   ó    zADatabaseIntrospection.get_primary_key_columns.<locals>.<listcomp>rt   ru   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ÚcolumnsÚprimary_keyÚforeign_keyÚcheckÚindex)rƒ   r€   r�   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__ry   )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| 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Ä|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>F  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€   r�   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„   rq   rr   rp   r   r   r   rs   ‰  s    	øúÿz9DatabaseIntrospection.get_constraints.<locals>.<dictcomp>)rL   rZ   r[   r\   ra   Ú	TypeErrorrh   Úupdater§   rM   r   r�   r   ÚsuffixÚ_get_index_columns_ordersrx   Ú	enumeraterv   Úitems)r9   rN   rc   r¤   Útable_schemar€   rJ   Únumberr„   r   r¢   Ú
index_rankÚcolumn_rankrf   r­   Ú
pk_columnsÚ	relationsr   r   r   Úget_constraints6  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   œ  rw   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   ra   rÄ   r†   r    r7   r6   r´   )r9   rN   rc   rJ   r¢   r€   rX   rf   r‡   rq   r„   r‘   Ú	collationr   r   r   r]   Ÿ  s,   úù"þ
z,DatabaseIntrospection._get_column_collations)r   )r<   r=   r>   r   Údata_types_reverserC   rO   rh   rm   rv   rx   rœ   r§   r¼   r³   r]   Ú__classcell__r   r   rG   r   r?   ;   s    
5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    
ÿ	