o
    uvXjWI  ã                   @   s€   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
 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 )é    N)Ú
namedtuple)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)ÚIndexr   )Úpkz&^\s*(?:var)?char\s*\(\s*(\d+)\s*\)\s*$c                 C   s    t  | ¡}|rt| d¡ƒS dS )z8 Extract the size number from a "varchar(11)" type name é   N)Úfield_size_reÚsearchÚintÚgroup)ÚnameÚm© r   úe/var/www/html/myproject/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 i¥Zd!d"„ Zd#S )$ÚFlexibleFieldLookupDictÚboolÚBooleanFieldÚbooleanÚsmallintÚSmallIntegerFieldzsmallint unsignedÚPositiveSmallIntegerFieldÚsmallintegerr   ÚIntegerFieldÚintegerÚbigintÚBigIntegerFieldzinteger unsignedÚPositiveIntegerFieldÚdecimalÚDecimalFieldÚrealÚ
FloatFieldÚtextÚ	TextFieldÚcharÚ	CharFieldÚvarcharÚblobÚBinaryFieldÚdateÚ	DateFieldÚdatetimeÚDateTimeFieldÚtimeÚ	TimeFieldc                 C   s"   |  ¡  dd¡d  ¡ }| j| S )Nú(r   r   )ÚlowerÚsplitÚstripÚbase_data_types_reverse)ÚselfÚkeyr   r   r   Ú__getitem__2   s   
z#FlexibleFieldLookupDict.__getitem__N)Ú__name__Ú
__module__Ú__qualname__r4   r7   r   r   r   r   r      sN    ÿþýüûúùø	÷
öõôóòñðïîr   c                       s|   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dd„ Z‡  ZS )ÚDatabaseIntrospectionc                    s$   t ƒ  ||¡}|jr|dv rdS |S )N>   r   r   Ú	AutoField)ÚsuperÚget_field_typer   )r5   Ú	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>J   s   " z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r5   Úcursorr   r   r   Úget_table_listB   s   
z$DatabaseIntrospection.get_table_listc                 C   s   dd„ |   ||¡D ƒS )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        c                 S   s@   g | ]}t |d  |d d|d dd|d |d |d dkƒ	‘qS )r   ÚtypeNÚsizeÚnull_okÚdefaultr   r   )r   ©rD   Úinfor   r   r   rF   Q   s    ö
÷ÿz?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)Ú_table_info)r5   rI   Ú
table_namer   r   r   Úget_table_descriptionL   s   
õz+DatabaseIntrospection.get_table_descriptionr   c                 C   s   |   ||¡}||dœgS )N)ÚtableÚcolumn)Úget_primary_key_column)r5   rI   rR   Útable_fieldsÚpk_colr   r   r   Úget_sequences_   s   z#DatabaseIntrospection.get_sequencesc                 C   sx  i }|  d|g¡ | ¡ \}}|dkr|S || d¡d | d¡… }| d¡D ]‘}| ¡ }| d¡r4q(t d|tj	¡}|s?q(d	d
„ | 
¡ D ƒ\}	}
| d¡rat d|tj	¡}| 
¡ d  d¡}n	| ¡ d  d¡}|  d|	g¡ | ¡ d }|d  ¡ }| d¡| d¡}}||d |… }| d¡D ]#}| ¡ }| d¡r¡q•| dd¡d  d¡}||
kr¸||	f||<  nq•q(|S )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')Úviewr0   r   ú)ú,ÚUNIQUEz$references (\S*) ?\(["|]?(.*)["|]?\)c                 S   s   g | ]}|  d ¡‘qS )ú"©r3   ©rD   Úsr   r   r   rF   ‚   s    z7DatabaseIntrospection.get_relations.<locals>.<listcomp>zFOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*r   r_   z1SELECT sql FROM sqlite_master WHERE tbl_name = %sú )rG   ÚfetchoneÚindexÚrindexr2   r3   Ú
startswithÚrer
   ÚIÚgroupsÚmatchrH   )r5   rI   rR   Ú	relationsÚ
create_sqlÚ
table_typeÚresultsÚ
field_descr   rT   rU   Ú
field_nameÚresultÚother_table_resultsÚliÚriÚ
other_descÚ
other_namer   r   r   Úget_relationsc   sJ   ý


þ€z#DatabaseIntrospection.get_relationsc                 C   s¢   g }|  d|dg¡ | ¡ d  ¡ }|| d¡d | d¡… }t| d¡ƒD ]'\}}| ¡ }| d¡r5q't 	d	|tj
¡}|s@q'| td
d„ | ¡ D ƒƒ¡ q'|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 = %srT   r   r0   r   r\   r]   r^   z("(.*)".*references (.*) \(["|](.*)["|]\)c                 s   s   � | ]}|  d ¡V  qdS )r_   Nr`   ra   r   r   r   Ú	<genexpr>¶   ó   € z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>)rG   rd   r3   re   rf   Ú	enumerater2   rg   rh   r
   ri   ÚappendÚtuplerj   )r5   rI   rR   Úkey_columnsro   Úfield_indexrp   r   r   r   r   Úget_key_columns�   s   
z%DatabaseIntrospection.get_key_columnsc           	      C   s¬   |  d|g¡ | ¡ }|du rtd| ƒ‚|\}}|dkrdS || d¡d | d¡… }| d¡D ]!}| ¡ }t d	|¡}|rS| 	d¡rL| 	d¡  S | 	d
¡  S q2dS )z>Return the column name of the primary key for the given table.rZ   NzTable %s does not existr[   r0   r   r\   r]   z1(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*é   )
rG   rd   Ú
ValueErrorre   rf   r2   r3   rh   rk   r   )	r5   rI   rR   rE   rm   rn   Ú
fields_sqlrp   r   r   r   r   rV   º   s$   ý&ÿz,DatabaseIntrospection.get_primary_key_columnc                 C   s*   |  d| jj |¡ ¡ dd„ | ¡ D ƒS )NzPRAGMA table_info(%s)c              	   S   s<   g | ]}|d  |d t |d ƒ|d  |d |d dœ‘qS )r   r�   é   é   é   )r   rK   rL   rM   rN   r   )r   )rD   Úfieldr   r   r   rF   Ô   s    ú

úz5DatabaseIntrospection._table_info.<locals>.<listcomp>©rG   Ú
connectionÚopsÚ
quote_namerH   )r5   rI   r   r   r   r   rQ   Ñ   s   ùz!DatabaseIntrospection._table_infoc           
      C   sd   i }|  d| jj |¡ ¡ | ¡ D ]}|d d… \}}}}}	|gdd||	fdddœ|d| < q|S )NzPRAGMA foreign_key_list(%s)r†   F©ÚcolumnsÚprimary_keyÚuniqueÚforeign_keyÚcheckre   zfk_%drˆ   )
r5   rI   rR   ÚconstraintsrE   Úid_Ú_rT   Úfrom_Útor   r   r   Ú_get_foreign_key_constraintsÝ   s   úz2DatabaseIntrospection._get_foreign_key_constraintsc                 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   r0   r   r\   r]   Ú
CONSTRAINTéÿÿÿÿr^   TÚCHECK)r�   r�   rŽ   r�   r‘   re   )r‘   r�   rŽ   r�   r�   re   )rk   ÚsqlparseÚtokensÚPunctuationÚKeywordÚttypeÚNameÚvalueÚLiteralÚStringÚSymbolr|   )r5   rœ   r�   ÚtokenÚis_constraint_definitionrq   Ú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)rD   r¥   r   r   r   ry   M  rz   zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r0   Tr   z__unnamed_constraint_%s__r\   )r›   ÚparseÚflattenrk   rœ   r�   r¯   )r5   Úsqlr�   Ú	statementr’   Úunnamed_constrains_indexrœ   r¥   r§   r�   r‘   Ú	end_tokenr   r   r   Ú_parse_table_constraintsG  s0   ÿ

ð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 ]€}|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Ã|| d sÃtj|| d< |
 d¡d  d¡d  d¡}dd„ |D ƒ}||| d< qC|  ||¡}|rØ|gdddd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   rO   r   r   r   Ú	<setcomp>v  s    z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>zPRAGMA index_list(%s)Nr„   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%sr°   zPRAGMA index_info(%s)FTrŒ   r�   re   r�   rK   r0   r™   r\   r]   c                 S   s   g | ]}|  d ¡rd nd‘qS )ÚDESCÚASC)ÚendswithrO   r   r   r   rF      s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>ÚordersÚ__primary__)rG   r‰   rŠ   r‹   rd   Ú	TypeErrorrS   Úupdater¸   rH   r   r|   r   Úsuffixr2   rV   r—   )r5   rI   rR   r’   Útable_schemar�   rE   Únumberre   r�   r´   Ú
index_rankÚcolumn_rankrU   Ú
order_infor½   Ú	pk_columnr   r   r   Úget_constraintse  sj   ÿÿüþÿÿ
ú€
úz%DatabaseIntrospection.get_constraints)r   )r8   r9   r:   r   Údata_types_reverser>   rJ   rS   rY   rx   r€   rV   rQ   r—   r¯   r¸   rÈ   Ú__classcell__r   r   rB   r   r;   7   s    

:Zr;   )rh   Úcollectionsr   r›   Ú%django.db.backends.base.introspectionr   r   ÚBaseFieldInfor   Údjango.db.models.indexesr   Ú_fieldsÚcompiler	   r   r   r;   r   r   r   r   Ú<module>   s    
	