
v^G                 @   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 Gd
 d   d  Z Gd 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   Sd 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-8lau8j11/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 d d d d d d d d d d d d d d d d  i Z d! d"   Z d# S)$FlexibleFieldLookupDictboolZBooleanFieldbooleanZsmallintSmallIntegerFieldzsmallint unsignedZPositiveSmallIntegerFieldZsmallintegerr   IntegerFieldintegerZbigintBigIntegerFieldzinteger unsignedZPositiveIntegerFielddecimalZDecimalFieldrealZ
FloatFieldtextZ	TextFieldcharZ	CharFieldZvarcharZblobZBinaryFielddateZ	DateFielddatetimeZDateTimeFieldtimeZ	TimeFieldc             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  d d  Z d	 d
   Z	 d d   Z
 d d   Z d d   Z d d   Z d d   Z d d   Z   S)DatabaseIntrospectionc                s2   t    j | |  } | j r. | d k r. d S| S)Nr   r   r   Z	AutoField>   SmallIntegerFieldBigIntegerFieldIntegerField)superget_field_typer   )r%   	data_typedescriptionZ
field_type)	__class__r   r   r0   :   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   s7   | j  d |  j j j |   d d   | j   D S)zi
        Return a description of the table with the DB-API cursor.description
        interface.
        zPRAGMA table_info(%s)c             S   sS   g  |  ]I \ } } } } } } t  | | d  t |  d  d  | | | d k 	  q S)Nr   )r   r   )r4   Zcidr   r1   Znotnulldefaultr   r   r   r   r6   S   s   	z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)r7   
connectionops
quote_namer8   )r%   r9   
table_namer   r   r   get_table_descriptionL   s     	z+DatabaseIntrospection.get_table_descriptionc             C   s%   |  j  | |  } d | d | i g S)Ntablecolumn)get_primary_key_column)r%   r9   r?   Ztable_fieldsZpk_colr   r   r   get_sequencesZ   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  r qq t j d | t j	  } | s qq d	 d
   | j
   D \ }	 }
 | j d  rt 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 |  } xq | j d  D]` } | j   } | j d  rq| j d d  d j d  } | |
 k r| |	 f | | <PqWqq W| 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#   )r4   sr   r   r   r6   }   s   	 z7DatabaseIntrospection.get_relations.<locals>.<listcomp>zFOREIGN KEYzFOREIGN KEY\s*\(([^\)]*)\).*r   rI   z1SELECT sql FROM sqlite_master WHERE tbl_name = %s )r7   fetchoneindexrindexr"   r#   
startswithrer
   Igroupsmatchr8   )r%   r9   r?   Z	relations
create_sql
table_typeresults
field_descr   rA   rB   
field_nameresultZother_table_resultsliriZ
other_descZ
other_namer   r   r   get_relations^   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]q \ } } | j   } | j d  r qn t j	 d	 | t j
  } | s qn | j t d
 d   | j   D   qn W| 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 = %srA   r   r    r   rF   rG   rH   z("(.*)".*references (.*) \(["|](.*)["|]\)c             s   s   |  ] } | j  d   Vq d S)rI   N)r#   )r4   rJ   r   r   r   	<genexpr>   s    z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>)r7   rL   r#   rM   rN   	enumerater"   rO   rP   r
   rQ   appendtuplerR   )r%   r9   r?   Zkey_columnsrV   Zfield_indexrW   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 rW d S| | j d  d | j d   } xd | j d  D]S } | j   } t j d	 |  } | r | j	 d  r | j	 d  S| j	 d
  Sq Wd 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 existrE   r    r   rF   rG   z1(?:(?:["`\[])(.*)(?:["`\]])|(\w+)).*PRIMARY KEY.*   )
r7   rL   
ValueErrorrM   rN   r"   r#   rP   rS   r   )	r%   r9   r?   r5   rT   rU   Z
fields_sqlrW   r   r   r   r   rC      s     
&-z,DatabaseIntrospection.get_primary_key_columnc       
      C   s   i  } | j  d |  j j j |   xn | j   D]` } | d  d  \ } } } } }	 d | g d d d d d | |	 f d d d	 d i | d
 | <q3 W| S)NzPRAGMA foreign_key_list(%s)   columnsprimary_keyFuniqueforeign_keycheckrM   zfk_%d)r7   r<   r=   r>   r8   )
r%   r9   r?   constraintsr5   Zid__rA   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 } x9| D]1} | j  t j j d  rh | d 7} nW | j  t j j d  r | d 8} | d k  r Pn% | d k r | j  t j j d  r P| d  k r | j  t j j d  } | r q= | r| d  k rY| j t j j t j j f k r+| j } n. | j t j j j	 j
 k rY| j d d  } | j  t j j d  rd	 } | } q| r| | k r| r= d } q= | j t j j t j j f k r| j | j  q| j t j j j	 j
 k r| j | j d d   n | d  k rt| j t j j t j j f k rF| j } n. | j t j j j	 j
 k rt| j d d  } | j  t j j d  r| g } | j  t j j d
  rd	 }	 | } q= |	 r= | | k r|
 r= d }	 q= | j t j j t j j f k r | j | k rn|
 j | j  q= | j t j j j	 j
 k r= | j d d  | k r= |
 j | j d d   q= W| rd d	 d | d d d d  d d d d i n d  } |
 rd d	 d |
 d d d d d d  d d i n d  } | | | | f S)NFr   r    r   rF   rG   Z
CONSTRAINTrH   TZCHECKrg   re   rf   rh   ri   rM   ro   ro   ro   ro   )rS   sqlparsetokensPunctuationKeywordZttypeNamevalueLiteralStringZSymbolr_   )r%   rq   re   tokenZis_constraint_definitionrX   constraint_namerg   Zunique_columnsri   Zcheck_columnsZbraces_deepZunique_braces_deepZcheck_braces_deepZunique_constraintZcheck_constraintr   r   r   &_parse_column_or_constraint_definition   s    
$!	!!		!66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? Pq? Wx |  j | |  \ } }	 }
 } |	 r | r |	 | | <n | d 7} |	 | d | <|
 r | r |
 | | <n | d 7} |
 | d | <| j t  j j d  re Pqe W| S)Nr   c             s   s   |  ] } | j  s | Vq d  S)N)Zis_whitespace)r4   rx   r   r   r   r]   <  s    zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r    r   z__unnamed_constraint_%s__rF   )rp   parseflattenrS   rq   rr   rz   )r%   sqlre   Z	statementrj   Zunnamed_constrains_indexrq   rx   ry   rg   ri   Z	end_tokenr   r   r   _parse_table_constraints6  s,    

z.DatabaseIntrospection._parse_table_constraintsc             C   s  i  } y3 | j  d |  j j j |  f  j   d } Wn t k
 rM Yn9 Xd d   |  j | |  D } | j |  j | |   | j  d |  j j j |   xx| j	   D]j} | d d  \ } } }	 | j  d |  j j j |   | j   pd \ }
 |
 sq | j  d	 |  j j j |   xr | j	   D]d \ } } } | | k rd
 g  d d d t
 |	  d d d d d d i | | <| | d
 j |  q=W| | d r | | d r t j | | d <|
 j d  d j d  d j d  } d d   | D } | | | d <q W|  j | |  } | rjd
 | g d d d d d d d d d d i | 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 Sr   )r   )r4   infor   r   r   	<setcomp>e  s   	 z8DatabaseIntrospection.get_constraints.<locals>.<setcomp>zPRAGMA index_list(%s)N   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%szPRAGMA index_info(%s)re   rf   Frg   rh   ri   rM   Ttyper    r   rF   rG   c             S   s+   g  |  ]! } | j  d   r! d  n d  q S)ZDESCZASC)endswith)r4   r   r   r   r   r6     s   	 z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>ordersZ__primary__)Nro   )r7   r<   r=   r>   rL   	TypeErrorr@   updater~   r8   r   r_   r   suffixr"   rC   rn   )r%   r9   r?   rj   Ztable_schemare   r5   numberrM   rg   r}   Z
index_rankZcolumn_rankrB   Z
order_infor   Z	pk_columnr   r   r   get_constraintsT  sX      )	z%DatabaseIntrospection.get_constraints)r(   r)   r*   r   Zdata_types_reverser0   r:   r@   rD   r\   ra   rC   rn   rz   r~   r   r   r   )r3   r   r+   7   s   	
:Zr+   )zpk)rP   collectionsr   rp   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   	