3
gO                 @   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 j| }|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   f/var/www/tester-filtro-web/env/lib/python3.6/site-packages/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"   |j  jddd j }| 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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dd Z  ZS )DatabaseIntrospectionc                s.   t  j||}|jr |dkr dS |jr*dS |S )Nr   r   r   Z	AutoFieldZ	JSONField>   r   r   r   )superget_field_typer   r	   )r&   	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>N   s    z8DatabaseIntrospection.get_table_list.<locals>.<listcomp>)executefetchall)r&   cursorr   r   r   get_table_listF   s    z$DatabaseIntrospection.get_table_listc                s   |j d| jjj|  |j }| j|| t | jjjr|x>|D ]6}|d }d| }|j d||gj	 }|rBj
| 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 | | j||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_descriptionc             C   s   | j ||}||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 }|j d|g |j \}}|dkr*|S ||jdd |jd }x8|jdD ](}|j }|jdrnqTtjd|tj	}|sqTd	d
 |j
 D \}	}
|jdrtjd|t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rJq.|jddd j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 | ]}|j 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 }|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 = %srI   r   r!   r
   rM   rN   rO   z("(.*)".*references (.*) \(["|](.*)["|]\)c             s   s   | ]}|j 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   |j d|g |j }|dkr*td| |\}}|dkr>dS ||jdd |jd }xB|jdD ]4}|j }tj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 }|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)   F)columnsprimary_keyuniqueforeign_keycheckrS   zfk_%d)r5   r=   r>   r?   r6   )
r&   r7   rE   constraintsr3   Zid__rI   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
   rM   rN   Z
CONSTRAINTrO   TZCHECK)rm   rk   rl   rn   ro   rS   )ro   rk   rl   rm   rn   rS   rt   rt   rt   rt   )rY   sqlparsetokensPunctuationKeywordZttypeNamevalueLiteralStringZSymbolre   )r&   rv   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 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)r2   r}   r   r   r   rc   Q  s    zADatabaseIntrospection._parse_table_constraints.<locals>.<genexpr>r!   r
   z__unnamed_constraint_%s__rM   )ru   parseflattenrY   rv   rw   r   )r&   sqlrk   Z	statementrp   Zunnamed_constrains_indexrv   r}   r~   rm   ro   Z	end_tokenr   r   r   _parse_table_constraintsK  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 rtj|| d< | j|
}|dk	r||| 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   )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=%szPRAGMA index_info(%s)FT)rk   rl   rm   rn   ro   rS   rk   rS   typeordersZ__primary__)N)r5   r=   r>   r?   rC   	TypeErrorrH   updater   r6   r   re   r   suffix_get_index_columns_ordersrJ   rs   )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 j|d }x<|D ]4}t|t jjrt|jdjd}dd |D S qW d S )Nr   z()z, c             S   s   g | ]}|j 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>)ru   r   
isinstancer   ZParenthesisstrr$   r#   )r&   r   rv   r}   rk   r   r   r   r     s    
z/DatabaseIntrospection._get_index_columns_ordersc             C   s   |j d|gj }|si S |d }ttj|d d jdjd}i }xb|D ]Z}|dd  j }|d j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   r
   z()z, rP   ZCOLLATErt   )r5   rC   r   ru   r   r$   r#   rd   )r&   r7   rE   r3   r   rk   r;   rG   rv   Zcolumn_namerS   r}   Z	collationr   r   r   r@     s"    "
z,DatabaseIntrospection._get_column_collations)r)   r*   r+   r   Zdata_types_reverser.   r8   rH   rK   rb   rg   rJ   rs   r   r   r   r   r@   __classcell__r   r   )r1   r   r,   9   s   

:ZOr,   )r   r	   )rV   collectionsr   ru   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   	