U
    8ÄT_K  ã                   @   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
 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)Ú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 )z8 Extract the size number from a "varchar(11)" type name é   N)Úfield_size_reÚsearchÚint)ÚnameÚm© r   úL/tmp/pip-unpacked-wheel-dv63caxw/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 )ÚFlexibleFieldLookupDictZBooleanFieldÚSmallIntegerFieldZPositiveSmallIntegerFieldÚIntegerFieldÚBigIntegerFieldZPositiveIntegerFieldZPositiveBigIntegerFieldZDecimalFieldZ
FloatFieldZ	TextFieldZ	CharFieldZBinaryFieldZ	DateFieldZDateTimeFieldZ	TimeField)ÚboolÚbooleanZsmallintzsmallint unsignedZsmallintegerr   ÚintegerZ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__4   s    z#FlexibleFieldLookupDict.__getitem__N)Ú__name__Ú
__module__Ú__qualname__r%   r(   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kr dS |jr*dS |S )N>   r   r   r   Z	AutoFieldZ	JSONField)ÚsuperÚget_field_typer   r	   )r&   Ú	data_typeÚdescriptionZ
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>N   s     z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r&   Úcursorr   r   r   Úget_table_listF   s    
z$DatabaseIntrospection.get_table_listc                    s~   |  d| jj |¡ ¡ | ¡ }tƒ ‰ | jjjrl|D ]6}|d }d| }|  d||g¡ ¡ }|r4ˆ  	|¡ q4‡ fdd„|D ƒS )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        zPRAGMA table_info(%s)r
   z%%json_valid("%s")%%zæ
                    SELECT sql
                    FROM sqlite_master
                    WHERE
                        type = 'table' AND
                        name = %s AND
                        sql LIKE %s
                c                    s@   g | ]8\}}}}}}t ||d t|ƒd d | ||dk|ˆ kƒ
‘qS )Nr
   )r   r   )r3   Zcidr   r/   ZnotnullÚdefaultr   ©Zjson_columnsr   r   r5   f   s   ü        þz?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)
r6   Ú
connectionÚopsÚ
quote_namer7   ÚsetÚfeaturesZcan_introspect_json_fieldÚfetchoneÚadd)r&   r8   Ú
table_nameZ
table_infoÚlineÚcolumnZjson_constraint_sqlr	   r   r;   r   Úget_table_descriptionP   s    
ù
ûz+DatabaseIntrospection.get_table_descriptionr   c                 C   s   |   ||¡}||dœgS )N)ÚtablerE   )Úget_primary_key_column)r&   r8   rC   Ztable_fieldsZpk_colr   r   r   Úget_sequencesn   s    z#DatabaseIntrospection.get_sequencesc                 C   s~  i }|  d|g¡ | ¡ \}}|dkr*|S || d¡d | d¡… }| d¡D �]&}| ¡ }| d¡rjqPt d|tj	¡}|s€qPd	d
„ | 
¡ D ƒ\}	}
| d¡rÀt d|tj	¡}|d  d¡}n| ¡ d  d¡}|  d|	g¡ | ¡ d }|d  ¡ }| d¡| d¡ }}||d |… }| d¡D ]N}| ¡ }| d¡�rD�q(| dd¡d  d¡}||
k�r(||	f||<  qP�q(qP|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')Úviewr!   r
   ú)ú,ÚUNIQUEz$references (\S*) ?\(["|]?(.*)["|]?\)c                 S   s   g | ]}|  d ¡‘qS )ú"©r$   ©r3   Úsr   r   r   r5   ‘   s     z7DatabaseIntrospection.get_relations.<locals>.<listcomp>zFOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*rO   r   z1SELECT sql FROM sqlite_master WHERE tbl_name = %sú )r6   rA   ÚindexÚrindexr#   r$   Ú
startswithÚrer   ÚIÚgroupsÚmatchr7   )r&   r8   rC   Z	relationsÚ
create_sqlÚ
table_typeÚresultsÚ
field_descr   rG   rE   Ú
field_nameÚresultZother_table_resultsÚliÚriZ
other_descZ
other_namer   r   r   Úget_relationsr   sF    ý



z#DatabaseIntrospection.get_relationsc                 C   s¢   g }|  d|dg¡ | ¡ d  ¡ }|| d¡d | d¡… }t| d¡ƒD ]N\}}| ¡ }| d¡rjqNt 	d	|tj
¡}|s€qN| td
d„ | ¡ D ƒƒ¡ qN|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 = %srG   r   r!   r
   rL   rM   rN   z("(.*)".*references (.*) \(["|](.*)["|]\)c                 s   s   | ]}|  d ¡V  qdS )rO   NrP   rQ   r   r   r   Ú	<genexpr>Å   s     z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>)r6   rA   r$   rT   rU   Ú	enumerater#   rV   rW   r   rX   ÚappendÚtuplerY   )r&   r8   rC   Zkey_columnsr]   Zfield_indexr^   r   r   r   r   Úget_key_columns¬   s    
z%DatabaseIntrospection.get_key_columnsc           	      C   s¢   |  d|g¡ | ¡ }|dkr*td| ƒ‚|\}}|dkr>dS || d¡d | d¡… }| d¡D ]8}| ¡ }t d	|¡}|rd|d r�|d n|d
   S qddS )z>Return the column name of the primary key for the given table.rJ   NzTable %s does not existrK   r!   r
   rL   rM   z1(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*é   )	r6   rA   Ú
ValueErrorrT   rU   r#   r$   rW   rZ   )	r&   r8   rC   r4   r[   r\   Z
fields_sqlr^   r   r   r   r   rH   É   s"    ýz,DatabaseIntrospection.get_primary_key_columnc           
      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)é   F©ÚcolumnsÚprimary_keyÚuniqueÚforeign_keyÚcheckrT   zfk_%d)r6   r<   r=   r>   r7   )
r&   r8   rC   Úconstraintsr4   Zid_Ú_rG   Ú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 �]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 kr¬|  tjjd¡}|r¬q(|�r~|d krø|jtjjtjjfk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k�rT| |j¡ n(|jtjjj	j
k�râ| |jdd… ¡ nd|d k�rÊ|jtjjtjjfk�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k�rH|j|k�r€|
 |j¡ q(|jtjjj	j
kr(|jdd… |k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   r!   r
   rL   rM   Z
CONSTRAINTéÿÿÿÿrN   TZCHECK)ro   rm   rn   rp   rq   rT   )rq   rm   rn   ro   rp   rT   )rZ   ÚsqlparseÚtokensÚPunctuationÚKeywordÚttypeÚNameÚvalueÚLiteralÚStringZSymbolrf   )r&   ry   rm   ÚtokenZis_constraint_definitionr_   Úconstraint_namero   Zunique_columnsrq   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)r3   r�   r   r   r   rd   P  s      zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r!   r
   z__unnamed_constraint_%s__rL   )rx   ÚparseÚflattenrZ   ry   rz   rƒ   )r&   Úsqlrm   Z	statementrr   Zunnamed_constrains_indexry   r�   r‚   ro   rq   Z	end_tokenr   r   r   Ú_parse_table_constraintsJ  s*    

z.DatabaseIntrospection._parse_table_constraintsc              	   C   sÎ  i }z&|  d| jj |¡f ¡ ¡ d }W n tk
r>   Y n*X dd„ |  ||¡D ƒ}| |  ||¡¡ |  d| jj |¡ ¡ | 	¡ D �]}|dd… \}}}	|  d| jj |¡ ¡ | ¡ pÂd	\}
|
sÌqˆ|  d
| jj |¡ ¡ | 	¡ D ]@\}}}||k�rg dt
|	ƒddddœ||< || d  |¡ qì|| d rˆ|| d sˆtj|| d< |
 d¡d  d¡d  d¡}dd„ |D ƒ}||| d< qˆ|  ||¡}|�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   ©r3   Úinfor   r   r   Ú	<setcomp>y  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)FTrl   rm   rT   ro   Útyper!   rw   rL   rM   c                 S   s   g | ]}|  d ¡rd nd‘qS )ZDESCÚASC)Úendswithr‰   r   r   r   r5   £  s     z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>ÚordersZ__primary__)r6   r<   r=   r>   rA   Ú	TypeErrorrF   Úupdaterˆ   r7   r   rf   r   Úsuffixr#   rH   rv   )r&   r8   rC   rr   Ztable_schemarm   r4   ÚnumberrT   ro   r‡   Z
index_rankZcolumn_rankrE   Z
order_infor�   Z	pk_columnr   r   r   Úget_constraintsh  sf    ÿÿüÿÿ
ú
ú
z%DatabaseIntrospection.get_constraints)r   )r)   r*   r+   r   Zdata_types_reverser.   r9   rF   rI   rc   rh   rH   rv   rƒ   rˆ   r•   Ú__classcell__r   r   r1   r   r,   9   s   


:Zr,   )rW   Úcollectionsr   rx   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.db.modelsr   Zdjango.utils.regex_helperr   Ú_fieldsr   r   r   r,   r   r   r   r   Ú<module>   s   	