3
gf                 @   sd  d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZ ddlmZ ddlZddlmZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZ ddlmZm Z  ddl!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( ddl)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2 dd Z3dd Z4dd Z5dd Z6e6  ej7ddj8 ej7d e3e  ej7d!e3e ej7d"e3e ej9ej:e; G d#d$ d$eZ<e$d%Z=G d&d' d'ej>Z?dDd(d)Z@d*d+ ZAd,d- ZBd.d/ ZCd0d1 ZDdEd2d3ZEd4d5 ZFd6d7 ZGe4d8d9 ZHe4d:d; ZIe4d<d= ZJe4d>d? ZKe4d@dA ZLe4dBdC ZMdS )Fz@
SQLite backend for the sqlite3 module in the standard library.
    N)chain)dbapi2)ImproperlyConfigured)IntegrityError)utils)BaseDatabaseWrapper)timezone)async_unsafe)parse_datetime
parse_time)duration_microseconds)_lazy_re_compile)PY38   )DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditorc                s    fddS )zR
    Convert bytestrings from Python's sqlite3 interface to a regular string.
    c                s    | j  S )N)decode)s)	conv_func ]/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/db/backends/sqlite3/base.py<lambda>*   s    zdecoder.<locals>.<lambda>r   )r   r   )r   r   decoder&   s    r   c                s   t j  fdd}|S )a  
    Decorator that returns None if any of the arguments to the decorated
    function are None. Many SQL functions return NULL if any of their arguments
    are NULL. This decorator simplifies the implementation of this for the
    custom functions registered below.
    c                 s   d | krd S  | |S )Nr   )argskwargs)funcr   r   wrapper4   s    znone_guard.<locals>.wrapper)	functoolswraps)r   r    r   )r   r   
none_guard-   s    r#   c             C   s   t dtf| tjdS )zx
    Return an aggregate class that accumulates values in a list and applies
    the provided function to the data.
    ZListAggregate)finalizestep)typelistappend)functionr   r   r   list_aggregate:   s    r*   c               C   s   t jdk rtdt j d S )N   	   r   z-SQLite 3.9.0 or later is required (found %s).)r+   r,   r   )DatabaseZsqlite_version_infor   Zsqlite_versionr   r   r   r   check_sqlite_versionB   s    
r.   bool   1timedatetime	timestampc               @   s4  e Zd Zd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ZdddddZddddZdddddddd d!d"ddddd#Zd$Z	d%d&d'd(d)d*d+Z
eZeZeZeZeZeZeZd,d- Zed.d/ Zd0d1 ZdGd3d4Zed5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!dHd?d@Z"dAdB Z#dCdD Z$dEdF Z%d2S )IDatabaseWrapperZsqliteZSQLiteintegerZBLOBr/   zvarchar(%(max_length)s)dater2   decimalZbigintrealzchar(15)zchar(39)textzbigint unsignedzinteger unsignedzsmallint unsignedZsmallintr1   zchar(32))	AutoFieldBigAutoFieldZBinaryFieldZBooleanFieldZ	CharFieldZ	DateFieldZDateTimeFieldZDecimalFieldZDurationFieldZ	FileFieldZFilePathFieldZ
FloatFieldZIntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressField	JSONFieldZNullBooleanFieldZOneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerFieldZ	SlugFieldSmallAutoFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldz"%(column)s" >= 0z2(JSON_VALID("%(column)s") OR "%(column)s" IS NULL))r=   r<   r>   r?   ZAUTOINCREMENT)r:   r;   r@   z= %szLIKE %s ESCAPE '\'z	REGEXP %szREGEXP '(?i)' || %sz> %sz>= %sz< %sz<= %s)exactZiexactcontains	icontainsregexZiregexgtZgteltZlte
startswithendswithistartswith	iendswithz@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')z"LIKE '%%' || {} || '%%' ESCAPE '\'z)LIKE '%%' || UPPER({}) || '%%' ESCAPE '\'zLIKE {} || '%%' ESCAPE '\'z!LIKE UPPER({}) || '%%' ESCAPE '\'zLIKE '%%' || {} ESCAPE '\'z!LIKE '%%' || UPPER({}) ESCAPE '\')rB   rC   rG   rI   rH   rJ   c             C   sh   | j }|d stdt|d tjtjB d|d }d|krT|d rTtjdt |j	ddd	 |S )
NNAMEzJsettings.DATABASES is improperly configured. Please supply the NAME value.)ZdatabaseZdetect_typesOPTIONScheck_same_threadzThe `check_same_thread` option was provided and set to True. It will be overridden with False. Use the `DatabaseWrapper.allow_thread_sharing` property instead for controlling thread shareability.FT)rM   uri)
settings_dictr   strr-   ZPARSE_DECLTYPESZPARSE_COLNAMESwarningswarnRuntimeWarningupdate)selfrO   r   r   r   r   get_connection_params   s    

z%DatabaseWrapper.get_connection_paramsc             C   sZ  t jf |}tr"tj|jdd}n|j}|ddt |ddt |ddt |d	dt	 |d
dt |ddt
 |ddt |ddt |ddt |ddt |ddt |ddt |ddttj |ddttj |ddttj |ddttj |ddttj |ddttj |ddttj |ddtdd  |ddttj |ddttj |ddttj |d dttj |d!dtd"d  |d#dt |d$dtd%d  |d&dttj  |d'd(d)d  |d*dttj! |d+dttj" |d,dttj# |d-dtd.d  |d/dt$ |d0dtd1d  |d2dtd3d  |d4dtd5d  |d6dtd7d  |d8dtd9d  |d:dtd;d  |d<dttj% |d=dttj& |d>dttj' |jd?d(t(j( |j)d@dt*t+j, |j)dAdt*t+j- |j)dBdt*t+j. |j)dCdt*t+j/ |j0dD |S )ENT)ZdeterministicZdjango_date_extract   Zdjango_date_trunc   Zdjango_datetime_cast_dater+   Zdjango_datetime_cast_timeZdjango_datetime_extractZdjango_datetime_truncZdjango_time_extractZdjango_time_truncZdjango_time_diffZdjango_timestamp_diffZdjango_format_dtdeltaregexpZACOSr   ZASINZATANZATAN2ZBITXORZCEILINGZCOSZCOTc             S   s   dt j|  S )Nr   )mathtan)xr   r   r   r      s    z4DatabaseWrapper.get_new_connection.<locals>.<lambda>ZDEGREESZEXPZFLOORLNZLOGc             S   s   t j|| S )N)rZ   log)r\   yr   r   r   r      s    ZLPADMD5c             S   s   t j| j j S )N)hashlibmd5encode	hexdigest)r\   r   r   r   r      s    ZMODPIr   c               S   s   t jS )N)rZ   pir   r   r   r   r      s    ZPOWERZRADIANSREPEATZREVERSEc             S   s   | d d d S )Nr   r   )r\   r   r   r   r      s    ZRPADSHA1c             S   s   t j| j j S )N)ra   sha1rc   rd   )r\   r   r   r   r      s    SHA224c             S   s   t j| j j S )N)ra   sha224rc   rd   )r\   r   r   r   r      s    SHA256c             S   s   t j| j j S )N)ra   sha256rc   rd   )r\   r   r   r   r      s    SHA384c             S   s   t j| j j S )N)ra   sha384rc   rd   )r\   r   r   r   r      s    SHA512c             S   s   t j| j j S )N)ra   sha512rc   rd   )r\   r   r   r   r      s    ZSIGNc             S   s   | dk| dk  S )Nr   r   )r\   r   r   r   r      s    ZSINZSQRTZTANZRANDZ
STDDEV_POPZSTDDEV_SAMPZVAR_POPZVAR_SAMPzPRAGMA foreign_keys = ON)1r-   connectr   r!   partialZcreate_function_sqlite_datetime_extract_sqlite_date_trunc_sqlite_datetime_cast_date_sqlite_datetime_cast_time_sqlite_datetime_trunc_sqlite_time_extract_sqlite_time_trunc_sqlite_time_diff_sqlite_timestamp_diff_sqlite_format_dtdelta_sqlite_regexpr#   rZ   acosasinatanatan2operatorxorceilcosdegreesexpfloorr^   _sqlite_lpadfmodpowradiansmul_sqlite_rpadsinsqrtr[   randomZcreate_aggregater*   
statisticsZpstdevZstdevZ	pvarianceZvarianceexecute)rU   Zconn_paramsconnZcreate_deterministic_functionr   r   r   get_new_connection   sp    

z"DatabaseWrapper.get_new_connectionc             C   s   d S )Nr   )rU   r   r   r   init_connection_state  s    z%DatabaseWrapper.init_connection_stateNc             C   s   | j jtdS )N)factory)
connectioncursorSQLiteCursorWrapper)rU   namer   r   r   create_cursor  s    zDatabaseWrapper.create_cursorc             C   s   | j   | j stj|  d S )N)Zvalidate_thread_sharingis_in_memory_dbr   close)rU   r   r   r   r     s    zDatabaseWrapper.closec             C   s   | j S )N)Zin_atomic_block)rU   r   r   r   _savepoint_allowed  s    z"DatabaseWrapper._savepoint_allowedc          	   C   s,   |r
d }nd}| j  || j_W d Q R X d S )N )Zwrap_database_errorsr   Zisolation_level)rU   Z
autocommitlevelr   r   r   _set_autocommit%  s
    zDatabaseWrapper._set_autocommitc          	   C   s:   | j  "}|jd |jdj d }W d Q R X t| S )NzPRAGMA foreign_keys = OFFzPRAGMA foreign_keysr   )r   r   fetchoner/   )rU   r   enabledr   r   r   disable_constraint_checking1  s    

z+DatabaseWrapper.disable_constraint_checkingc          	   C   s"   | j  }|jd W d Q R X d S )NzPRAGMA foreign_keys = ON)r   r   )rU   r   r   r   r   enable_constraint_checking:  s    
z*DatabaseWrapper.enable_constraint_checkingc                s  j jrj ܉ |dkr* jdj }ntj fdd|D }x|D ]\}}}} jdjj| j | }|dd \}}	j	j
 |}
 jdjj|
jj|jj|f |fj \}}td	|||||||	f qJW W dQ R X nʈj  |dkrj	j }x|D ]}j	j
 |}
|
s6qj	j |}xh|D ]`\}}}	 jd
|
|||||	||	f  x4 j D ](}td	||d |||d ||	f q|W qJW qW W dQ R X dS )a]  
        Check each table name in `table_names` for rows with invalid foreign
        key references. This method is intended to be used in conjunction with
        `disable_constraint_checking()` and `enable_constraint_checking()`, to
        determine if rows with invalid references were entered while constraint
        checks were off.
        NzPRAGMA foreign_key_checkc             3   s(   | ] } j d jj| j V  qdS )zPRAGMA foreign_key_check(%s)N)r   ops
quote_namefetchall).0
table_name)r   rU   r   r   	<genexpr>L  s   z4DatabaseWrapper.check_constraints.<locals>.<genexpr>zPRAGMA foreign_key_list(%s)r+      z'SELECT %s, %s FROM %s WHERE rowid = %%szThe row in table '%s' with primary key '%s' has an invalid foreign key: %s.%s contains a value '%s' that does not have a corresponding value in %s.%s.aD  
                            SELECT REFERRING.`%s`, REFERRING.`%s` FROM `%s` as REFERRING
                            LEFT JOIN `%s` as REFERRED
                            ON (REFERRING.`%s` = REFERRED.`%s`)
                            WHERE REFERRING.`%s` IS NOT NULL AND REFERRED.`%s` IS NULL
                            r   r   )featuresZ!supports_pragma_foreign_key_checkr   r   r   r   from_iterabler   r   introspectionZget_primary_key_columnr   r   table_namesZget_key_columns)rU   r   Z
violationsr   ZrowidZreferenced_table_nameZforeign_key_indexZforeign_keyZcolumn_nameZreferenced_column_nameZprimary_key_column_nameZprimary_key_valueZ	bad_valueZkey_columnsZbad_rowr   )r   rU   r   check_constraints>  sT    






z!DatabaseWrapper.check_constraintsc             C   s   dS )NTr   )rU   r   r   r   	is_usable  s    zDatabaseWrapper.is_usablec             C   s   | j  jd dS )z
        Start a transaction explicitly in autocommit mode.

        Staying in autocommit mode works around a bug of sqlite3 that breaks
        savepoints when autocommit is disabled.
        ZBEGINN)r   r   )rU   r   r   r   #_start_transaction_under_autocommit  s    z3DatabaseWrapper._start_transaction_under_autocommitc             C   s   | j j| jd S )NrK   )creationr   rO   )rU   r   r   r   r     s    zDatabaseWrapper.is_in_memory_db)N)N)&__name__
__module____qualname__vendorZdisplay_nameZ
data_typesZdata_type_check_constraintsZdata_types_suffix	operatorsZpattern_escZpattern_opsr-   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classrV   r	   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r4   S   s   ?
		
L	r4   z(?<!%)%sc               @   s*   e Zd ZdZd	ddZdd Zdd ZdS )
r   z
    Django uses "format" style placeholders, but pysqlite2 uses "qmark" style.
    This fixes it -- but note that if you want to use a literal "%s" in a query,
    you'll need to use "%%s".
    Nc             C   s0   |d krt jj| |S | j|}t jj| ||S )N)r-   Cursorr   convert_query)rU   queryparamsr   r   r   r     s    
zSQLiteCursorWrapper.executec             C   s   | j |}tjj| ||S )N)r   r-   r   executemany)rU   r   Z
param_listr   r   r   r     s    
zSQLiteCursorWrapper.executemanyc             C   s   t jd|jddS )N?z%%%)FORMAT_QMARK_REGEXsubreplace)rU   r   r   r   r   r     s    z!SQLiteCursorWrapper.convert_query)N)r   r   r   __doc__r   r   r   r   r   r   r   r     s   
r   c       	      C   s   | d krd S yt j| } W n ttfk
r2   d S X |rJ| jtj|d} |d k	r||kr|jd|jd d }|dkr|| }|j|\}}|r|jd\}}t	j
t|t|d}| |dkr|n| 7 } tj| tj|} | S )N)tzinfo+-r   :)hoursminutesrh   )backend_utilstypecast_timestamp	TypeError
ValueErrorr   pytzr   findsplitr2   	timedeltaint	localtime)	dttznameconn_tznameZ
sign_indexsignoffsetr   r   Zoffset_deltar   r   r   _sqlite_datetime_parse  s&    r   c             C   s   t |||}|d krd S | dkr*d|j S | dkrT|j|jd d  }d|j|f S | dkrld|j|jf S | dkr|tj|j d	 }d
|j|j|jf S | dkrd
|j|j|jf S d S )Nyearz%i-01-01quarterr   r+   z
%i-%02i-01monthweek)daysz%i-%02i-%02iday)r   r   r   r2   r   weekdayr   )lookup_typer   r   r   month_in_quarterr   r   r   rv     s    
rv   c             C   s   |d krd S t |||}|d krJytj|}W qN ttfk
rF   d S X n|}| dkr`d|j S | dkrxd|j|jf S | dkrd|j|j|jf S d S )Nhourz
%02i:00:00minutez%02i:%02i:00secondz%02i:%02i:%02i)r   r   typecast_timer   r   r   r   r   )r   r   r   r   Z	dt_parsedr   r   r   r{     s    
r{   c             C   s$   t | ||} | d krd S | j j S )N)r   r6   	isoformat)r   r   r   r   r   r   rw     s    rw   c             C   s$   t | ||} | d krd S | j j S )N)r   r1   r   )r   r   r   r   r   r   rx     s    rx   c             C   s   t |||}|d krd S | dkr0|j d d S | dkr@|j S | dkrT|j d S | dkrltj|jd S | dkr|j d	 S t|| S d S )
NZweek_day   r   Ziso_week_dayr   r   r+   Ziso_yearr   )r   
isoweekdayisocalendarrZ   r   r   getattr)r   r   r   r   r   r   r   ru     s    ru   c             C   s,  t |||}|d krd S | dkr*d|j S | dkrT|j|jd d  }d|j|f S | dkrld|j|jf S | dkr|tj|j d	 }d
|j|j|jf S | dkrd
|j|j|jf S | dkrd|j|j|j|jf S | dk rd|j|j|j|j|jf S | dkr(d|j|j|j|j|j|j	f S d S )Nr   z%i-01-01 00:00:00r   r   r+   z%i-%02i-01 00:00:00r   r   )r   z%i-%02i-%02i 00:00:00r   r   z%i-%02i-%02i %02i:00:00r   z%i-%02i-%02i %02i:%02i:00r   z%i-%02i-%02i %02i:%02i:%02i)
r   r   r   r2   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   ry     s*    


ry   c             C   s>   |d krd S yt j|}W n ttfk
r2   d S X t|| S )N)r   r   r   r   r   )r   r   r   r   r   rz   $  s    rz   c             C   s   yft |trtjdd|ntj|}t |tr<tjdd|ntj|}| j dkr\|| }n|| }W n ttfk
r~   dS X t	|S )zs
    LHS and RHS can be either:
    - An integer number of microseconds
    - A string representing a datetime
    r   r   N)

isinstancer   r2   r   r   r   stripr   r   rP   )r   lhsrhsZreal_lhsZreal_rhsoutr   r   r   r~   .  s    ""
r~   c             C   st   t j| }t j|}|jd d d |jd d  |jd  |j |jd d d  |jd d  |jd  |j S )N<   i@B )r   r   r   r   r   microsecond)r   r   leftrightr   r   r   r|   C  s    

Xr|   c             C   s    t j| }t j|}t|| S )N)r   r   r   )r   r   r   r   r   r   r   r}   S  s    

r}   c             C   s   t tj| t|S )N)r/   researchrP   )Z
re_patternZ	re_stringr   r   r   r   Z  s    r   c             C   s4   t | |kr| d | S || d |t |   |  S )N)len)r9   length	fill_textr   r   r   r   _  s    r   c             C   s   | ||  d | S )Nr   )r9   r   r   r   r   r   r   f  s    r   )NN)NN)Nr   r2   r7   r!   ra   rZ   r   r   r   r   rQ   	itertoolsr   Zsqlite3r   r-   r   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backendsr   r   Zdjango.db.backends.base.baser   Zdjango.utilsr   Zdjango.utils.asyncior	   Zdjango.utils.dateparser
   r   Zdjango.utils.durationr   Zdjango.utils.regex_helperr   Zdjango.utils.versionr   clientr   r   r   r   r   r   r   
operationsr   Zschemar   r   r#   r*   r.   Zregister_converter__eq__Zregister_adapterDecimalrP   r4   r   r   r   r   rv   r{   rw   rx   ru   ry   rz   r~   r|   r}   r   r   r   r   r   r   r   <module>   st     I


