B
    ©0H[¥3  ã               @   sp   d dl 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¡Zdd„ ZG dd	„ d	ƒZG d
d„ deƒZdS )é    N)ÚBaseDatabaseIntrospectionÚ	FieldInfoÚ	TableInfo)ÚIndex)ÚRemovedInDjango21Warningz&^\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   úlC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\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œZdd„ ZdS )ÚFlexibleFieldLookupDictZBooleanFieldZSmallIntegerFieldZPositiveSmallIntegerFieldZIntegerFieldZBigIntegerFieldZPositiveIntegerFieldZDecimalFieldZ
FloatFieldZ	TextFieldÚ	CharFieldZBinaryFieldZ	DateFieldZDateTimeFieldZ	TimeField)ÚboolÚbooleanZsmallintzsmallint unsignedZsmallintegerr
   ÚintegerZbigintzinteger unsignedÚdecimalÚrealÚtextÚcharZblobÚdateÚdatetimeÚtimec             C   sL   |  ¡ }y
| j| S  tk
rF   t|ƒ}|d k	r>dd|ifS t‚Y nX d S )Nr   Ú
max_length)ÚlowerÚbase_data_types_reverseÚKeyErrorr   )ÚselfÚkeyÚsizer   r   r   Ú__getitem__.   s    
z#FlexibleFieldLookupDict.__getitem__N)Ú__name__Ú
__module__Ú__qualname__r   r$   r   r   r   r   r      s$   r   c               @   sl   e Zd Zeƒ 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dS )ÚDatabaseIntrospectionc             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>D   s    z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)ÚexecuteÚfetchall)r!   Úcursorr   r   r   Úget_table_list<   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   s6   g | ].}t |d  |d d|d dd|d |d ƒ‘qS )r   ÚtypeNr#   Únull_okÚdefault)r   )r)   Úinfor   r   r   r+   L   s   	z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)Ú_table_info)r!   r.   Ú
table_namer   r   r   Úget_table_descriptionF   s    	z+DatabaseIntrospection.get_table_descriptionr   c             C   s   |   ||¡}||dœgS )N)ÚtableÚcolumn)Úget_primary_key_column)r!   r.   r5   Ztable_fieldsZpk_colr   r   r   Úget_sequencesX   s    z#DatabaseIntrospection.get_sequencesc             C   s*   | j jjdk r"| d¡d  d¡S |S dS )a  
        SQLite will in some cases, e.g. when returning columns from views and
        subselects, return column names in 'alias."column"' format instead of
        simply 'column'.

        Affects SQLite < 3.7.15, fixed by http://www.sqlite.org/src/info/5526e0aa3c
        )é   é   é   Ú.éÿÿÿÿú"N)Ú
connectionZDatabaseZsqlite_version_infoÚsplitÚstrip)r!   r   r   r   r   Úcolumn_name_converter\   s    
z+DatabaseIntrospection.column_name_converterc             C   sž  i }|  d|dg¡ y| ¡ d  ¡ }W n tk
r<   |S X || d¡d | d¡… }�x<| d¡D �],}| ¡ }| d¡r‚qht 	d	|tj
¡}|s˜qhd
d„ | ¡ D ƒ\}}| d¡rÜt d|tj
¡}| ¡ d  d¡}	n| ¡ d  d¡}	|  d|g¡ | ¡ d }
|
d  ¡ }| d¡| d¡ }}||d |… }xZ| d¡D ]L}| ¡ }| d¡�rb�qF| dd¡d  d¡}||k�rF||f||	< P �qFW qhW |S )z—
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        z?SELECT sql FROM sqlite_master WHERE tbl_name = %s AND type = %sr7   r   ú(r   ú)ú,ÚUNIQUEz$references (\S*) ?\(["|]?(.*)["|]?\)c             S   s   g | ]}|  d ¡‘qS )r@   )rC   )r)   Úsr   r   r   r+   ‡   s    z7DatabaseIntrospection.get_relations.<locals>.<listcomp>zFOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*r@   z1SELECT sql FROM sqlite_master WHERE tbl_name = %sú )r,   ÚfetchonerC   Ú	TypeErrorÚindexÚrindexrB   Ú
startswithÚrer	   ÚIÚgroupsÚmatchr-   )r!   r.   r5   Z	relationsÚresultsÚ
field_descr   r7   r8   Ú
field_nameÚresultZother_table_resultsÚliÚriZ
other_descZ
other_namer   r   r   Úget_relationsk   sB    


z#DatabaseIntrospection.get_relationsc             C   s¦   g }|  d|dg¡ | ¡ d  ¡ }|| d¡d | d¡… }x`t| d¡ƒD ]N\}}| ¡ }| d¡rlqPt 	d	|tj
¡}|s‚qP| td
d„ | ¡ D ƒƒ¡ qPW |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 = %sr7   r   rE   r   rF   rG   rH   z("(.*)".*references (.*) \(["|](.*)["|]\)c             s   s   | ]}|  d ¡V  qdS )r@   N)rC   )r)   rI   r   r   r   ú	<genexpr>»   s    z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>)r,   rK   rC   rM   rN   Ú	enumeraterB   rO   rP   r	   rQ   ÚappendÚtuplerR   )r!   r.   r5   Zkey_columnsrT   Zfield_indexrU   r   r   r   r   Úget_key_columns¢   s    
 z%DatabaseIntrospection.get_key_columnsc             C   sÜ   t jdtdd� i }x2|  ||¡D ]"}|d dkr"dddœ||d	 < q"W | d
| jj |¡ ¡ xvdd„ | ¡ D ƒD ]`\}}| d| jj |¡ ¡ | ¡ }t	|ƒdkrªqt|d d }| 
|i ¡ 
dd¡|dœ||< qtW |S )Nz:get_indexes() is deprecated in favor of get_constraints().é   )Ú
stacklevelÚpkr   TF)Úprimary_keyÚuniquer   zPRAGMA index_list(%s)c             S   s   g | ]}|d  |d f‘qS )r   r`   r   )r)   Úfieldr   r   r   r+   Ë   s    z5DatabaseIntrospection.get_indexes.<locals>.<listcomp>zPRAGMA index_info(%s)r   rc   )ÚwarningsÚwarnr   r4   r,   rA   ÚopsÚ
quote_namer-   ÚlenÚget)r!   r.   r5   Úindexesr3   rM   rd   r   r   r   r   Úget_indexes¿   s$    
z!DatabaseIntrospection.get_indexesc             C   s�   |  d|dg¡ | ¡ }|dkr,td| ƒ‚|d  ¡ }|| d¡d | d¡… }x6| d	¡D ](}| ¡ }t d
|¡}|r`| 	¡ d S q`W dS )z>Return the column name of the primary key for the given table.z?SELECT sql FROM sqlite_master WHERE tbl_name = %s AND type = %sr7   NzTable %s does not existr   rE   r   rF   rG   z$"(.*)".*PRIMARY KEY( AUTOINCREMENT)?)
r,   rK   Ú
ValueErrorrC   rM   rN   rB   rP   r	   rR   )r!   r.   r5   r*   rT   rU   r   r   r   r   r9   Ö   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 | ]4}|d  |d t |d ƒ|d  |d |d dœ‘qS )r   r`   r;   é   é   )r   r0   r#   r1   r2   rb   )r   )r)   re   r   r   r   r+   é   s   z5DatabaseIntrospection._table_info.<locals>.<listcomp>)r,   rA   rh   ri   r-   )r!   r.   r   r   r   r   r4   æ   s    z!DatabaseIntrospection._table_infoc       
      C   sh   i }|  d| jj |¡ ¡ xF| ¡ D ]:}|d d… \}}}}}	|gdd||	fdddœ|d| < q&W |S )NzPRAGMA foreign_key_list(%s)rp   F)Úcolumnsrc   rd   Úforeign_keyÚcheckrM   zfk_%d)r,   rA   rh   ri   r-   )
r!   r.   r5   Úconstraintsr*   Zid_Ú_r7   Úfrom_Útor   r   r   Ú_get_foreign_key_constraintsò   s    z2DatabaseIntrospection._get_foreign_key_constraintsc          	   C   sv  i }|  d| jj |¡ ¡ �x| ¡ D �]}|dd… \}}}|  d| jj |¡ ¡ xJ| ¡ D ]>\}}	}
||krŽg dt|ƒddddœ||< || d  |
¡ qbW || d	 r(|| d
 s(tj|| d< |  d| jj |¡ ¡ g }x>| ¡ D ]2\}| 	d¡d  	d¡d  	d¡}dd„ |D ƒ}qðW ||| d< q(W |  
||¡}|�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PRAGMA index_list(%s)Nr;   zPRAGMA index_info(%s)FT)rq   rc   rd   rr   rs   rM   rq   rM   rd   r0   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%srE   r?   rF   r   rG   c             S   s   g | ]}|  d ¡rd nd‘qS )ZDESCÚASC)Úendswith)r)   r3   r   r   r   r+   '  s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>ÚordersZ__primary__)r,   rA   rh   ri   r-   r   r]   r   ÚsuffixrB   r9   Úupdaterx   )r!   r.   r5   rt   r*   ÚnumberrM   rd   Z
index_rankZcolumn_rankr8   r{   ZsqlZ
order_infoZ	pk_columnr   r   r   Úget_constraints  sD    z%DatabaseIntrospection.get_constraintsN)r   )r%   r&   r'   r   Zdata_types_reverser/   r6   r:   rD   rZ   r_   rm   r9   r4   rx   r   r   r   r   r   r(   9   s   

7r(   )rP   rf   Z%django.db.backends.base.introspectionr   r   r   Zdjango.db.models.indexesr   Zdjango.utils.deprecationr   Úcompiler   r   r   r(   r   r   r   r   Ú<module>   s   
	#