a
    ¥Q•hÍC  ã                   @   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/sistema_ama/venv/lib/python3.9/site-packages/django/db/backends/sqlite3/introspection.pyÚget_field_size   s    
r   c                   @   s@   e Zd Z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ÚBooleanFieldÚSmallIntegerFieldÚPositiveSmallIntegerFieldÚIntegerFieldÚBigIntegerFieldÚPositiveIntegerFieldÚPositiveBigIntegerFieldÚDecimalFieldÚ
FloatFieldÚ	TextFieldÚ	CharFieldÚBinaryFieldÚ	DateFieldÚDateTimeFieldÚ	TimeField)ÚboolÚbooleanÚsmallintzsmallint unsignedZsmallintegerr   ÚintegerÚbigintzinteger unsignedzbigint unsignedÚdecimalÚrealÚtextÚcharZvarcharZblobÚdateÚ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__r5   r8   r   r   r   r   r      s*   í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   )r6   Ú	data_typeÚdescriptionÚ
field_type©Ú	__class__r   r   r@   >   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   ó    z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r6   Úcursorr   r   r   Úget_table_listL   s    ÿz$DatabaseIntrospection.get_table_listc                    s    |  d| jj |¡ ¡ | ¡ }|s4td|› d�ƒ‚|  ||¡‰ tƒ ‰| jjj	rŒ|D ]6}|d }d| }|  d||g¡ 
¡ }|rTˆ |¡ qT‡ ‡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 ||t|ƒd d d | |ˆ  |¡|dk|ˆv ƒ‘qS )Nr   )r   r   Úget)rF   Úcidr   rA   ZnotnullÚdefaultr
   ©Ú
collationsZjson_columnsr   r   rH   v   s   óõz?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)rJ   Ú
connectionÚopsÚ
quote_namerK   r   Ú_get_column_collationsÚsetÚfeaturesÚcan_introspect_json_fieldÚfetchoneÚadd)r6   rL   Ú
table_nameZ
table_infoÚlineÚcolumnZjson_constraint_sqlr   r   rR   r   Úget_table_descriptionX   s*    ÿ
÷òz+DatabaseIntrospection.get_table_descriptionr   c                 C   s   |   ||¡}||dœgS )N)Útabler_   )Úget_primary_key_column)r6   rL   r]   Ztable_fieldsZ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   )rF   Ú_Úref_table_nameÚcolumn_nameÚref_column_namer   r   r   Ú
<dictcomp>“   s   ùz7DatabaseIntrospection.get_relations.<locals>.<dictcomp>©rJ   rT   rU   rV   rK   ©r6   rL   r]   r   r   r   Úget_relations‹   s    ÿ	÷z#DatabaseIntrospection.get_relationsc                 C   s*   |  d| jj |¡ ¡ dd„ | ¡ D ƒS )NrN   c                 S   s   g | ]�^}}}}|r|‘qS r   r   )rF   rd   r   r
   r   r   r   rH   £   rI   zADatabaseIntrospection.get_primary_key_columns.<locals>.<listcomp>ri   rj   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 �]V}|  tjjd¡rH|d7 }nF|  tjjd¡rp|d8 }|dk rŽ �q‚n|dkrŽ|  tjjd¡rŽ �q‚|d u r¬|  tjjd¡}|r¬q(|�r~|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d
}|}nh|�râ||k�r.|r(d}q(|jtjjtjjfv �rT| |j¡ n(|jtjjj	j
k�râ| |jdd… ¡ nd|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(|	r(||k�r|
r(d}	q(|jtjjtjjfv �rH|j|v �r€|
 |j¡ q(|jtjjj	j
kr(|jdd… |v r(|
 |jdd… ¡ q(|�ršd
|dd dddœnd }|
�r¶d
|
ddd ddœnd }||||fS )NFr   r1   r   ú)ú,Z
CONSTRAINTéÿÿÿÿZUNIQUETZCHECK)ÚuniqueÚcolumnsÚprimary_keyÚforeign_keyÚcheckÚindex)rt   rq   rr   rp   rs   ru   )ÚmatchÚsqlparseÚtokensÚPunctuationZKeywordZttypeÚNameÚvalueÚLiteralÚStringZSymbolÚappend)r6   rx   rq   ÚtokenZis_constraint_definitionÚ
field_nameÚconstraint_namerp   Zunique_columnsrt   Zcheck_columnsZbraces_deepZunique_braces_deepZcheck_braces_deepZunique_constraintZ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, qFq,|  ||¡\}}	}
}|	r€|rl|	||< n|d7 }|	|d| < |
r¦|r’|
||< n|d7 }|
|d| < | t jjd¡rFqºqF|S )Nr   c                 s   s   | ]}|j s|V  qd S ©N)Zis_whitespace)rF   r   r   r   r   Ú	<genexpr>  rI   zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r1   r   z__unnamed_constraint_%s__rm   )rw   ÚparseÚflattenrv   rx   ry   r‚   )r6   Úsqlrq   Ú	statementÚconstraintsZunnamed_constrains_indexrx   r   r�   rp   rt   Z	end_tokenr   r   r   Ú_parse_table_constraints	  s@    
û
þÿ
þÿz.DatabaseIntrospection._parse_table_constraintsc              	   C   s¸  i }z&|  d| jj |¡f ¡ ¡ d }W n ty<   Y n*0 dd„ |  ||¡D ƒ}| |  ||¡¡ |  d| jj |¡ ¡ | 	¡ D ]Ü}|dd… \}}}	|  d| jj |¡ ¡ | ¡ p¾d	\}
|
sÈq†|  d
| jj |¡ ¡ | 	¡ D ]@\}}}||v�rg dt
|	ƒddddœ||< || d  |¡ qè|| 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   ©rF   Úinfor   r   r   Ú	<setcomp>@  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©rq   rr   rp   rs   rt   ru   rq   ru   ÚtypeÚordersZ__primary__c              
   S   s8   i | ]0\}\}\}}d |› �|gdd||fdddœ“qS )Zfk_Fr�   r   )rF   ru   rf   rg   re   r   r   r   rh   ƒ  s   	øúz9DatabaseIntrospection.get_constraints.<locals>.<dictcomp>)rJ   rT   rU   rV   r[   Ú	TypeErrorr`   ÚupdaterŠ   rK   r%   r~   r   ÚsuffixÚ_get_index_columns_ordersrl   Ú	enumeraterk   Úitems)r6   rL   r]   r‰   Ztable_schemarq   rG   Únumberru   rp   r‡   Z
index_rankZcolumn_rankr_   r‘   Z
pk_columnsÚ	relationsr   r   r   Úget_constraints0  s|    ÿÿý
ÿÿÿÿÿ
ú

ú
	÷ÿz%DatabaseIntrospection.get_constraintsc                 C   sP   t  |¡d }|D ]8}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   rH   –  rI   zCDatabaseIntrospection._get_index_columns_orders.<locals>.<listcomp>)rw   r…   Ú
isinstancer‡   ZParenthesisÚstrr4   r3   )r6   r‡   rx   r   rq   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 ]X}|dd …  ¡ }|d  d¡}	t|ƒD ] \}
}|dkrv||
d  } qœqvd }|||	< qL|S )	Nzn
            SELECT sql
            FROM sqlite_master
            WHERE type = 'table' AND name = %s
        r   ro   r›   rœ   r   ú"ÚCOLLATE)rJ   r[   r¡   rw   r…   r4   r3   r–   )r6   rL   r]   rG   r‡   rq   rS   r_   rx   rf   ru   r   Ú	collationr   r   r   rW   ™  s&    ú"
z,DatabaseIntrospection._get_column_collations)r   )r9   r:   r;   r   Zdata_types_reverser@   rM   r`   rc   rk   rl   r‚   rŠ   rš   r•   rW   Ú__classcell__r   r   rD   r   r<   ;   s   /
d'ar<   )Úcollectionsr   rw   Ú	django.dbr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Údjango.db.modelsr   Údjango.utils.regex_helperr	   Ú_fieldsr   r   r   r<   r   r   r   r   Ú<module>   s   
ÿ	