3
7^WI                 @   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 j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 j| }|rt|j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   J/tmp/pip-build-8app2_gc/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Zdd ZdS )FlexibleFieldLookupDictZBooleanFieldZSmallIntegerFieldZPositiveSmallIntegerFieldIntegerFieldBigIntegerFieldZPositiveIntegerFieldZDecimalFieldZ
FloatFieldZ	TextFieldZ	CharFieldZBinaryFieldZ	DateFieldZDateTimeFieldZ	TimeField)boolbooleanZsmallintzsmallint unsignedZsmallintegerr   integerZbigintzinteger unsigneddecimalrealtextcharZvarcharZblobdatedatetimetimec             C   s"   |j  jddd j }| 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__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f f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||}|jr |dkr dS |S )Nr   r   Z	AutoField>   r   r   )superget_field_typer   )r$   Z	data_typedescriptionZ
field_type)	__class__r   r   r,   :   s    z$DatabaseIntrospection.get_field_typec             C   s   |j d dd |j 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)r$   cursorr   r   r   get_table_listB   s    z$DatabaseIntrospection.get_table_listc             C   s   dd | j ||D S )zi
        Return a description of the table with the DB-API cursor.description
        interface.
        c             S   s@   g | ]8}t |d  |d d|d dd|d |d |d dk	qS )r   typeNsizenull_okdefaultr   r   )r   )r/   infor   r   r   r1   R   s   
z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)_table_info)r$   r4   
table_namer   r   r   get_table_descriptionL   s    
z+DatabaseIntrospection.get_table_descriptionc             C   s   | j ||}||dgS )N)tablecolumn)get_primary_key_column)r$   r4   r<   Ztable_fieldsZpk_colr   r   r   get_sequences_   s    z#DatabaseIntrospection.get_sequencesc             C   s  i }|j d|g |j \}}|dkr*|S ||jdd |jd }x<|jdD ],}|j }|jdrnqTtjd|tj	}|sqTd	d
 |j
 D \}	}
|jdrtjd|tj	}|j
 d jd}n|j d jd}|j d|	g |j d }|d j }|jd|jd }}||d | }xZ|jdD ]L}|j }|jdrNq2|jddd jd}||
kr2||	f||< P q2W 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 | ]}|j d qS )")r"   )r/   sr   r   r   r1      s    z7DatabaseIntrospection.get_relations.<locals>.<listcomp>zFOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*r   rF   z1SELECT sql FROM sqlite_master WHERE tbl_name = %s )r2   fetchoneindexrindexr!   r"   
startswithrer
   Igroupsmatchr3   )r$   r4   r<   Z	relations
create_sql
table_typeresults
field_descr   r>   r?   
field_nameresultZother_table_resultsliriZ
other_descZ
other_namer   r   r   get_relationsc   sD    


z#DatabaseIntrospection.get_relationsc             C   s   g }|j d|dg |j d j }||jdd |jd }x`t|jdD ]N\}}|j }|jdrlqPtj	d	|tj
}|sqP|jtd
d |j 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 = %sr>   r   r   r   rC   rD   rE   z("(.*)".*references (.*) \(["|](.*)["|]\)c             s   s   | ]}|j d V  qdS )rF   N)r"   )r/   rG   r   r   r   	<genexpr>   s    z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>)r2   rI   r"   rJ   rK   	enumerater!   rL   rM   r
   rN   appendtuplerO   )r$   r4   r<   Zkey_columnsrS   Zfield_indexrT   r   r   r   r   get_key_columns   s    
 z%DatabaseIntrospection.get_key_columnsc       	      C   s   |j d|g |j }|dkr*td| |\}}|dkr>dS ||jdd |jd }xH|jdD ]:}|j }tjd	|}|rf|j	dr|j	dS |j	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 existrB   r   r   rC   rD   z1(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*   )
r2   rI   
ValueErrorrJ   rK   r!   r"   rM   rP   r   )	r$   r4   r<   r0   rQ   rR   Z
fields_sqlrT   r   r   r   r   r@      s     "z,DatabaseIntrospection.get_primary_key_columnc             C   s*   |j d| jjj|  dd |j 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   r6   r7   r8   r9   r   )r   )r/   fieldr   r   r   r1      s   z5DatabaseIntrospection._table_info.<locals>.<listcomp>)r2   
connectionops
quote_namer3   )r$   r4   r   r   r   r   r;      s    z!DatabaseIntrospection._table_infoc       
      C   sh   i }|j d| jjj|  xF|j D ]:}|d d \}}}}}	|gdd||	fddd|d| < q&W |S )NzPRAGMA foreign_key_list(%s)rc   F)columnsprimary_keyuniqueforeign_keycheckrJ   zfk_%d)r2   re   rf   rg   r3   )
r$   r4   r<   constraintsr0   Zid__r>   from_Z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}|j tjjdrL|d7 }n>|j tjjdrp|d8 }|dk rP n|dkr|j tjjdrP |d kr|j tjjd}|rq,|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 }|j tjjdrd	}|}nh|r||kr*|r,d}q,|jtjjtjjfkrP|j|j n(|jtjjj	j
kr|j|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 }|j tjjdr|g}|j tjjd
rd	}	|}q,|	r,||kr|
r,d}	q,|jtjjtjjfkrD|j|kr||
j|j q,|jtjjj	j
kr,|jdd |kr,|
j|jdd  q,W |rd	|dd dddnd }|
rd	|
ddd ddnd }||||fS )NFr   r   r   rC   rD   Z
CONSTRAINTrE   TZCHECK)rj   rh   ri   rk   rl   rJ   )rl   rh   ri   rj   rk   rJ   rq   rq   rq   rq   )rP   sqlparsetokensPunctuationKeywordZttypeNamevalueLiteralStringZSymbolr\   )r$   rs   rh   tokenZis_constraint_definitionrU   constraint_namerj   Zunique_columnsrl   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 j|d }i }d}dd |j D }x|D ]}|jt jjdr.P q.W xv| j||\}}	}
}|	r|rp|	||< n|d7 }|	|d| < |
r|r|
||< n|d7 }|
|d| < |jt jjdrJP qJW |S )Nr   c             s   s   | ]}|j s|V  qd S )N)Zis_whitespace)r/   rz   r   r   r   rZ   M  s    zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r   r   z__unnamed_constraint_%s__rC   )rr   parseflattenrP   rs   rt   r|   )r$   sqlrh   Z	statementrm   Zunnamed_constrains_indexrs   rz   r{   rj   rl   Z	end_tokenr   r   r   _parse_table_constraintsG  s,    


z.DatabaseIntrospection._parse_table_constraintsc             C   s  i }y&|j d| jjj|f j d }W n tk
r>   Y n*X dd | j||D }|j| j|| |j d| jjj|  x|j	 D ]}|dd \}}}	|j d| jjj|  |j pd\}
|
sq|j d	| jjj|  xL|j	 D ]@\}}}||kr g d
t
|	dd
dd||< || d j| qW || d r|| d  rtj|| d< |
jdd jdd jd}dd |D }||| d< qW | j||}|r|gdd
dd
d
d|d< |j| j|| |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   )r/   r:   r   r   r   	<setcomp>v  s    z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>zPRAGMA index_list(%s)Nra   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%szPRAGMA index_info(%s)FT)rh   ri   rj   rk   rl   rJ   rh   rJ   rj   r6   r   r   rC   rD   c             S   s   g | ]}|j d rd ndqS )ZDESCASC)endswith)r/   r:   r   r   r   r1     s    z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>ordersZ__primary__)Nrq   )r2   re   rf   rg   rI   	TypeErrorr=   updater   r3   r   r\   r   suffixr!   r@   rp   )r$   r4   r<   rm   Ztable_schemarh   r0   numberrJ   rj   r   Z
index_rankZcolumn_rankr?   Z
order_infor   Z	pk_columnr   r   r   get_constraintse  sX    

z%DatabaseIntrospection.get_constraints)r'   r(   r)   r   Zdata_types_reverser,   r5   r=   rA   rY   r^   r@   r;   rp   r|   r   r   __classcell__r   r   )r.   r   r*   7   s   
:Zr*   )r   )rM   collectionsr   rr   Z%django.db.backends.base.introspectionr   r   ZBaseFieldInfor   Zdjango.db.models.indexesr   _fieldscompiler	   r   r   r*   r   r   r   r   <module>   s   
	