
^Q\0                 @   s   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  j
 d  Z d d   Z Gd d	   d	 e  Z Gd
 d   d e  Z d S)    N)BaseDatabaseIntrospection	FieldInfo	TableInfo)Index)RemovedInDjango21Warningz&^\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   N/var/www/dbchiro/venv/build/Django/django/db/backends/sqlite3/introspection.pyget_field_size   s    r   c               @   s   e  Z d  Z i d d 6d d 6d d 6d d 6d d 6d	 d
 6d	 d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6d d 6Z d  d!   Z d" S)#FlexibleFieldLookupDictZBooleanFieldboolbooleanZSmallIntegerFieldZsmallintZPositiveSmallIntegerFieldzsmallint unsignedZsmallintegerZIntegerFieldr
   integerZBigIntegerFieldZbigintZPositiveIntegerFieldzinteger unsignedZDecimalFielddecimalZ
FloatFieldrealZ	TextFieldtext	CharFieldcharZBinaryFieldZblobZ	DateFielddateZDateTimeFielddatetimeZ	TimeFieldtimec             C   sc   | j    } y |  j | SWnA t k
 r^ t |  } | d  k	 rT d i | d 6f St  Yn Xd  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               @   s   e  Z d  Z e   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 d S)DatabaseIntrospectionc             C   s$   | j  d  d d   | j   D S)zQ
        Returns 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>F   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   |  j  | |  D S)zQReturns a description of the table, with the DB-API cursor.description interface.c             S   sE   g  |  ]; } t  | d  | d d | d d d | d | d   q S)r   typeNr#   null_okdefault)r   )r)   infor   r   r   r+   K   s   		z?DatabaseIntrospection.get_table_description.<locals>.<listcomp>)_table_info)r!   r.   
table_namer   r   r   get_table_descriptionH   s    		z+DatabaseIntrospection.get_table_descriptionc             C   s7   |  j  j j d k  r/ | j d  d	 j d  S| Sd 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
                 .r   "N)r7   r8   r9   )
connectionZDatabaseZsqlite_version_infosplitstrip)r!   r   r   r   r   column_name_converterW   s    
z+DatabaseIntrospection.column_name_converterc             C   s3  i  } | j  d | d g  y | j   d j   } Wn t k
 rN | SYn X| | j d  d | j d   } x| j d  D]} | j   } | j d  r q n  t j	 d	 | t j
  } | s q n  d
 d   | j   D \ } } | j d  r2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 |  } xw | j d  D]f } | j   } | j d  rqn  | j d d  d j d  } | | k r| | f | |	 <PqqWq W| 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 = %stabler   (r   ),UNIQUEz$references (\S*) ?\(["|]?(.*)["|]?\)c             S   s   g  |  ] } | j  d    q S)r;   )r?   )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,   fetchoner?   	TypeErrorindexrindexr>   
startswithrer	   Igroupsmatchr-   )r!   r.   r5   Z	relationsresults
field_descr   rA   column
field_nameresultZother_table_resultsliriZ
other_descZ
other_namer   r   r   get_relationsf   sB    	&z#DatabaseIntrospection.get_relationsc             C   s   g  } | j  d | d g  | j   d j   } | | j d  d | j d   } x t | j d   D]w \ } } | j   } | j d  r qn n  t j	 d	 | t j
  } | s qn n  | j t d
 d   | j   D   qn W| S)z
        Returns 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   rB   r   rC   rD   rE   z("(.*)".*references (.*) \(["|](.*)["|]\)c             s   s   |  ] } | j  d   Vq d S)r;   N)r?   )r)   rF   r   r   r   	<genexpr>   s    z8DatabaseIntrospection.get_key_columns.<locals>.<genexpr>)r,   rH   r?   rJ   rK   	enumerater>   rL   rM   r	   rN   appendtuplerO   )r!   r.   r5   Zkey_columnsrQ   Zfield_indexrR   r   r   r   r   get_key_columns   s    &"*z%DatabaseIntrospection.get_key_columnsc             C   s8  t  j d t d d i  } xI |  j | |  D]5 } | d d k r/ i d d 6d d	 6| | d
 <q/ q/ W| j d |  j j j |   x d d   | j   D D] \ } } | j d |  j j j |   | j   } t	 |  d k r q n  | d d } i | j
 | i   j
 d d  d 6| d	 6| | <q W| S)Nz:get_indexes() is deprecated in favor of get_constraints().
stacklevel   pkr   Tprimary_keyF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   )warningswarnr   r4   r,   r=   ops
quote_namer-   lenget)r!   r.   r5   indexesr3   rJ   rb   r   r   r   r   get_indexes   s$    
 & "z!DatabaseIntrospection.get_indexesc             C   s   | j  d | d g  | j   } | d k rA t d |   n  | d j   } | | j d  d | j d   } xI | j d	  D]8 } | j   } t j d
 |  } | r | j	   d Sq Wd S)zM
        Get the column name of the primary key for the given table.
        z?SELECT sql FROM sqlite_master WHERE tbl_name = %s AND type = %srA   NzTable %s does not existr   rB   r   rC   rD   z$"(.*)".*PRIMARY KEY( AUTOINCREMENT)?)
r,   rH   
ValueErrorr?   rJ   rK   r>   rM   r	   rO   )r!   r.   r5   r*   rQ   rR   r   r   r   r   get_primary_key_column   s    &z,DatabaseIntrospection.get_primary_key_columnc             C   s7   | j  d |  j j j |   d d   | j   D S)NzPRAGMA table_info(%s)c             S   s_   g  |  ]U } i | d  d 6| d d 6t  | d  d 6| d d 6| d d 6| d	 d
 6 q S)r   r   r_   r0   r#   r7   r1      r2      r`   )r   )r)   rc   r   r   r   r+      s   	z5DatabaseIntrospection._table_info.<locals>.<listcomp>)r,   r=   rf   rg   r-   )r!   r.   r   r   r   r   r4      s     	z!DatabaseIntrospection._table_infoc             C   s  i  } | j  d |  j j j |   x| j   D]x} | d d  \ } } } | j  d |  j j j |   x{ | j   D]m \ } }	 }
 | | k r i g  d 6d d 6t |  d 6d d	 6d d
 6d d 6| | <n  | | d j |
  q W| | d r3 | | d r3 t j | | d <| j  d |  j j j |   g  } xS | j   D]E \ } | j	 d  d j	 d  d j	 d  } d d   | D } qQW| | | d <q3 q3 W|  j
 | |  } | ri | g d 6d d 6d d 6d d	 6d d
 6d d 6| d <n  | S)zn
        Retrieves any constraints or keys (unique, pk, fk, check, index) across one or more columns.
        zPRAGMA index_list(%s)Nr7   zPRAGMA index_info(%s)columnsFra   rb   Zforeign_keycheckTrJ   r0   z<SELECT sql FROM sqlite_master WHERE type='index' AND name=%srB   r   rC   r   rD   c             S   s+   g  |  ]! } | j  d   r! d  n d  q S)ZDESCZASC)endswith)r)   r3   r   r   r   r+     s   	 z9DatabaseIntrospection.get_constraints.<locals>.<listcomp>ordersZ__primary__r<   )r,   r=   rf   rg   r-   r   r[   r   suffixr>   rm   )r!   r.   r5   constraintsr*   numberrJ   rb   Z
index_rankZcolumn_rankrS   rs   ZsqlZ
order_infoZ	pk_columnr   r   r   get_constraints   sF      )
z%DatabaseIntrospection.get_constraintsN)r%   r&   r'   r   Zdata_types_reverser/   r6   r@   rX   r]   rk   rm   r4   rw   r   r   r   r   r(   9   s   	7r(   )rM   rd   Z%django.db.backends.base.introspectionr   r   r   Zdjango.db.models.indexesr   Zdjango.utils.deprecationr   compiler   r   objectr   r(   r   r   r   r   <module>   s   	#