B
    CVvg‰O  ã               @   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-install-o3oxmrkh/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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                   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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r|x>|D ]6}|d }d| }|  d||g¡ 	¡ }|rBˆ 
|¡ qBW ‡ ‡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                sH   g | ]@\}}}}}}t ||d t|ƒd d | |ˆ  |¡|dk|ˆkƒ‘qS )Nr
   )r   r   Úget)r2   Zcidr   r/   ZnotnullÚdefaultr   )Ú
collationsÚjson_columnsr   r   r4   h   s   z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)r5   Ú
connectionÚopsÚ
quote_namer6   Ú_get_column_collationsÚsetÚfeaturesZcan_introspect_json_fieldÚfetchoneÚadd)r&   r7   Ú
table_nameZ
table_infoÚlineÚcolumnZjson_constraint_sqlr	   r   )r;   r<   r   Úget_table_descriptionP   s    

z+DatabaseIntrospection.get_table_descriptionr   c             C   s   |   ||¡}||dœgS )N)ÚtablerG   )Úget_primary_key_column)r&   r7   rE   Ztable_fieldsZpk_colr   r   r   Úget_sequenceso   s    z#DatabaseIntrospection.get_sequencesc             C   s†  i }|  d|g¡ | ¡ \}}|dkr*|S || d¡d | d¡… }x8| d¡D ](}| ¡ }| d¡rnqTt d|tj	¡}|s„qTd	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¡rJq.| dd¡d  d¡}||
kr.||	f||< P q.W qTW |S )z—
        Return a dictionary of {field_name: (field_name_other_table, other_table)}
        representing all relationships to the given table.
        zUSELECT 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$   )r2   Úsr   r   r   r4   ’   s    z7DatabaseIntrospection.get_relations.<locals>.<listcomp>zFOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*rP   r   z1SELECT sql FROM sqlite_master WHERE tbl_name = %sú )r5   rC   ÚindexÚrindexr#   r$   Ú
startswithÚrer   ÚIÚgroupsÚmatchr6   )r&   r7   rE   Z	relationsÚ
create_sqlÚ
table_typeÚresultsÚ
field_descr   rI   rG   Ú
field_nameÚresultZother_table_resultsÚliÚriZ
other_descZ
other_namer   r   r   Úget_relationss   sD    


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 = %srI   r   r!   r
   rM   rN   rO   z("(.*)".*references (.*) \(["|](.*)["|]\)c             s   s   | ]}|  d ¡V  qdS )rP   N)r$   )r2   rQ   r   r   r   ú	<genexpr>Æ   s    z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>)r5   rC   r$   rS   rT   Ú	enumerater#   rU   rV   r   rW   ÚappendÚtuplerX   )r&   r7   rE   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¡… }xB| d¡D ]4}| ¡ }t d	|¡}|rf|d r’|d S |d
 S qfW dS )z>Return the column name of the primary key for the given table.zUSELECT sql, type FROM sqlite_master WHERE tbl_name = %s AND type IN ('table', 'view')NzTable %s does not existrL   r!   r
   rM   rN   z1(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*é   )	r5   rC   Ú
ValueErrorrS   rT   r#   r$   rV   rY   )	r&   r7   rE   r3   rZ   r[   Z
fields_sqlr]   r   r   r   r   rJ   Ê   s     z,DatabaseIntrospection.get_primary_key_columnc       
      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)é   F)ÚcolumnsÚprimary_keyÚuniqueÚforeign_keyÚcheckrS   zfk_%d)r5   r=   r>   r?   r6   )
r&   r7   rE   Úconstraintsr3   Zid_Ú_rI   Ú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}xX|D ]N}|  tjjd¡rL|d7 }n>|  tjjd¡rp|d8 }|dk rŠP n|dkrŠ|  tjjd¡rŠP |d kr¨|  tjjd¡}|r¨q,|rz|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rP| |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rD|j|kr||
 |j¡ q,|jtjjj	j
kr,|jdd… |kr,|
 |jdd… ¡ q,W |r˜d
|dd dddœnd }|
r´d
|
ddd ddœnd }||||fS )NFr   r!   r
   rM   rN   Z
CONSTRAINTéÿÿÿÿrO   TZCHECK)rm   rk   rl   rn   ro   rS   )ro   rk   rl   rm   rn   rS   )rY   ÚsqlparseÚtokensÚPunctuationÚKeywordZttypeÚNameÚvalueÚLiteralÚStringZSymbolre   )r&   rw   rk   ÚtokenZis_constraint_definitionr^   Úconstraint_namerm   Zunique_columnsro   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 ƒ}x|D ]}| t jjd¡r.P q.W xv|  ||¡\}}	}
}|	r„|rp|	||< n|d7 }|	|d| < |
rª|r–|
||< n|d7 }|
|d| < | t jjd¡rJP qJW |S )Nr   c             s   s   | ]}|j s|V  qd S )N)Zis_whitespace)r2   r~   r   r   r   rc   Q  s    zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r!   r
   z__unnamed_constraint_%s__rM   )rv   ÚparseÚflattenrY   rw   rx   r€   )r&   Úsqlrk   Z	statementrp   Zunnamed_constrains_indexrw   r~   r   rm   ro   Z	end_tokenr   r   r   Ú_parse_table_constraintsK  s,    


z.DatabaseIntrospection._parse_table_constraintsc          	   C   s®  i }y&|  d| jj |¡f ¡ ¡ d }W n tk
r>   Y n*X dd„ |  ||¡D ƒ}| |  ||¡¡ |  d| jj |¡ ¡ xì| 	¡ D ]à}|dd… \}}}	|  d| jj |¡ ¡ | ¡ pÂd	\}
|
sÌqŠ|  d
| jj |¡ ¡ xL| 	¡ D ]@\}}}||krg dt
|	ƒddddœ||< || d  |¡ qîW || d rŠtj|| d< |  |
¡}|dk	rŠ||| 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<SELECT sql FROM sqlite_master WHERE type='table' and name=%sr   c             S   s   h | ]
}|j ’qS r   )r   )r2   Úinfor   r   r   ú	<setcomp>z  s    z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>zPRAGMA index_list(%s)Né   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%s)NzPRAGMA index_info(%s)FT)rk   rl   rm   rn   ro   rS   rk   rS   ÚtypeÚordersZ__primary__)r5   r=   r>   r?   rC   Ú	TypeErrorrH   Úupdater„   r6   r   re   r   ÚsuffixÚ_get_index_columns_ordersrJ   rt   )r&   r7   rE   rp   Ztable_schemark   r3   ÚnumberrS   rm   rƒ   Z
index_rankZcolumn_rankrG   r‰   Z	pk_columnr   r   r   Úget_constraintsi  sX    


z%DatabaseIntrospection.get_constraintsc             C   sP   t  |¡d }x<|D ]4}t|t jjƒrt|ƒ d¡ d¡}dd„ |D ƒS qW d S )Nr   z()z, c             S   s   g | ]}|  d ¡rd nd‘qS )ZDESCÚASC)Úendswith)r2   r…   r   r   r   r4   ½  s    zCDatabaseIntrospection._get_index_columns_orders.<locals>.<listcomp>)rv   r   Ú
isinstancerƒ   ZParenthesisÚstrr$   r#   )r&   rƒ   rw   r~   rk   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 }xb|D ]Z}|dd …  ¡ }|d  d¡}	x.t|ƒD ]\}
}|dkrz||
d  }P qzW d }|||	< qNW |S )	Nzn
            SELECT sql
            FROM sqlite_master
            WHERE type = 'table' AND name = %s
        r   ru   z()z, r
   rP   ZCOLLATE)r5   rC   r“   rv   r   r$   r#   rd   )r&   r7   rE   r3   rƒ   rk   r;   rG   rw   Zcolumn_namerS   r~   Z	collationr   r   r   r@   À  s"    "
z,DatabaseIntrospection._get_column_collations)r   )r)   r*   r+   r   Zdata_types_reverser.   r8   rH   rK   rb   rg   rJ   rt   r€   r„   r   r   r@   Ú__classcell__r   r   )r1   r   r,   9   s   


:ZOr,   )rV   Úcollectionsr   rv   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   	