B
    ©0H[òH  ã               @   sþ  d 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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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„ Z$e %ddd„ ¡ e %de$eƒ¡ e %de$eƒ¡ e %de$eƒ¡ e %de$eƒ¡ e %de$eƒ¡ e %de$ej&ƒ¡ e 'ej&ej(¡ G dd„ deƒZ)e *d¡Z+G dd„ dej,ƒZ-d d!„ Z.d"d#„ Z/d$d%„ Z0d&d'„ Z1d(d)„ Z2d*d+„ Z3d,d-„ Z4d.d/„ Z5d0d1„ Z6d2d3„ Z7d4d5„ Z8d6d7„ Z9d8d9„ Z:d:d;„ Z;dS )<zA
SQLite3 backend for the sqlite3 module in the standard library.
é    N)Údbapi2)ÚImproperlyConfigured)Úutils)ÚBaseDatabaseWrapper)Útimezone)Ú
parse_dateÚparse_datetimeÚparse_durationÚ
parse_timeé   )Ú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   ˆ |   ¡ ƒS )N)Údecode)Ús)Ú	conv_func© úcC:\Users\HIRONO~1\AppData\Local\Temp\pip-install-6bm3nxem\django\django\db\backends\sqlite3\base.pyÚ<lambda>!   s    zdecoder.<locals>.<lambda>r   )r   r   )r   r   Údecoder   s    r   Úboolc             C   s   | dkS )Nó   1r   )r   r   r   r   r   $   s    r   ÚtimeÚdateÚdatetimeÚ	timestampÚ	TIMESTAMPÚdecimalc               @   s  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œZ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d*d+„ Zd,d-„ ZdCd/d0„Zd1d2„ Zd3d4„ Zd5d6„ Zd7d8„ Zd9d:„ ZdDd;d<„Z d=d>„ Z!d?d@„ Z"dAdB„ Z#d.S )EÚDatabaseWrapperZsqliteZSQLiteÚintegerZBLOBr   zvarchar(%(max_length)s)r   r   r    ZbigintÚrealzchar(15)zchar(39)zinteger unsignedzsmallint unsignedZsmallintÚtextr   zchar(32))Ú	AutoFieldÚBigAutoFieldZBinaryFieldZBooleanFieldZ	CharFieldZ	DateFieldZDateTimeFieldZDecimalFieldZDurationFieldZ	FileFieldZFilePathFieldZ
FloatFieldZIntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressFieldZNullBooleanFieldZOneToOneFieldZPositiveIntegerFieldZPositiveSmallIntegerFieldZ	SlugFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldZAUTOINCREMENT)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 '\')r(   r)   r-   r/   r.   r0   c             C   s~   | j }|d stdƒ‚|d tjtjB dœ}| |d ¡ d|krV|d rVt dt¡ | ddi¡ | j	j
rz| dd	i¡ |S )
NÚNAMEzJsettings.DATABASES is improperly configured. Please supply the NAME value.)ZdatabaseZdetect_typesÚOPTIONSZcheck_same_threadzÃThe `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.FÚuriT)Úsettings_dictr   ÚDatabaseZPARSE_DECLTYPESZPARSE_COLNAMESÚupdateÚwarningsÚwarnÚRuntimeWarningÚfeaturesZcan_share_in_memory_db)Úselfr4   Úkwargsr   r   r   Úget_connection_paramsƒ   s    z%DatabaseWrapper.get_connection_paramsc             C   sÐ   t jf |Ž}| 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¡ | d¡ |S )NZdjango_date_extracté   Zdjango_date_truncZdjango_datetime_cast_dateZdjango_datetime_cast_timeZdjango_datetime_extracté   Zdjango_datetime_truncZdjango_time_extractZdjango_time_truncZdjango_time_diffZdjango_timestamp_diffÚregexpZdjango_format_dtdeltaZdjango_powerzPRAGMA foreign_keys = ON)r5   ÚconnectZcreate_functionÚ_sqlite_date_extractÚ_sqlite_date_truncÚ_sqlite_datetime_cast_dateÚ_sqlite_datetime_cast_timeÚ_sqlite_datetime_extractÚ_sqlite_datetime_truncÚ_sqlite_time_extractÚ_sqlite_time_truncÚ_sqlite_time_diffÚ_sqlite_timestamp_diffÚ_sqlite_regexpÚ_sqlite_format_dtdeltaÚ_sqlite_powerÚexecute)r;   Zconn_paramsÚconnr   r   r   Úget_new_connection¡   s     
z"DatabaseWrapper.get_new_connectionc             C   s   d S )Nr   )r;   r   r   r   Úinit_connection_state³   s    z%DatabaseWrapper.init_connection_stateNc             C   s   | j jtd�S )N)Úfactory)Ú
connectionÚcursorÚSQLiteCursorWrapper)r;   Únamer   r   r   Úcreate_cursor¶   s    zDatabaseWrapper.create_cursorc             C   s   |   ¡  |  ¡ st | ¡ d S )N)Zvalidate_thread_sharingÚis_in_memory_dbr   Úclose)r;   r   r   r   rZ   ¹   s    zDatabaseWrapper.closec             C   s   | j jo| jS )N)r:   Zuses_savepointsÚin_atomic_block)r;   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_errorsrT   Zisolation_level)r;   Z
autocommitÚlevelr   r   r   Ú_set_autocommitÍ   s
    zDatabaseWrapper._set_autocommitc             C   s   | j r
dS |  ¡  d¡ dS )NFzPRAGMA foreign_keys = OFFT)r[   rU   rO   )r;   r   r   r   Údisable_constraint_checkingÙ   s    z+DatabaseWrapper.disable_constraint_checkingc             C   s   |   ¡  d¡ d S )NzPRAGMA foreign_keys = ON)rU   rO   )r;   r   r   r   Úenable_constraint_checkingà   s    z*DatabaseWrapper.enable_constraint_checkingc       
      C   s¸   |   ¡ }|dkr| j |¡}x–|D ]Ž}| j ||¡}|s:q"| j ||¡}xf|D ]^\}}}| d||||||||f ¡ x4| ¡ D ](}	t d||	d |||	d ||f ¡‚q€W qNW q"W 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.

        Raise an IntegrityError on the first invalid foreign key reference
        encountered (if any) and provide detailed information about the
        invalid reference in the error message.

        Backends can override this method if they can more directly apply
        constraint checking (e.g. via "SET CONSTRAINTS ALL IMMEDIATE")
        Na  
                    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
                    z–The 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.r   r   )	rU   ÚintrospectionÚtable_namesZget_primary_key_columnZget_key_columnsrO   Zfetchallr   ZIntegrityError)
r;   rc   rU   Z
table_nameZprimary_key_column_nameZkey_columnsZcolumn_nameZreferenced_table_nameZreferenced_column_nameZbad_rowr   r   r   Úcheck_constraintsã   s&    
z!DatabaseWrapper.check_constraintsc             C   s   dS )NTr   )r;   r   r   r   Ú	is_usable  s    zDatabaseWrapper.is_usablec             C   s   |   ¡  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)rU   rO   )r;   r   r   r   Ú#_start_transaction_under_autocommit  s    z3DatabaseWrapper._start_transaction_under_autocommitc             C   s   | j  | jd ¡S )Nr1   )ÚcreationrY   r4   )r;   r   r   r   rY     s    zDatabaseWrapper.is_in_memory_db)N)N)$Ú__name__Ú
__module__Ú__qualname__ÚvendorZdisplay_nameZ
data_typesZdata_types_suffixÚ	operatorsZpattern_escZpattern_opsr5   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classr=   rQ   rR   rX   rZ   r\   r_   r`   ra   rd   re   rf   rY   r   r   r   r   r!   /   sŒ   

/	r!   z(?<!%)%sc               @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
rV   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 | |¡S |  |¡}t j | ||¡S )N)r5   ÚCursorrO   Úconvert_query)r;   ÚqueryÚparamsr   r   r   rO   +  s    
zSQLiteCursorWrapper.executec             C   s   |   |¡}tj | ||¡S )N)rn   r5   rm   Úexecutemany)r;   ro   Z
param_listr   r   r   rq   1  s    
zSQLiteCursorWrapper.executemanyc             C   s   t  d|¡ dd¡S )Nú?z%%ú%)ÚFORMAT_QMARK_REGEXÚsubÚreplace)r;   ro   r   r   r   rn   5  s    z!SQLiteCursorWrapper.convert_query)N)rh   ri   rj   Ú__doc__rO   rq   rn   r   r   r   r   rV   %  s   
rV   c          	   C   s†   |d krd S yt  |¡}W n ttfk
r2   d S X | dkrL| ¡ d d S | dkr`| ¡ d S | dkrxt |jd ¡S t	|| ƒS d S )NÚweek_dayé   r   ÚweekÚquarterr?   )
Úbackend_utilsÚtypecast_timestampÚ
ValueErrorÚ	TypeErrorÚ
isoweekdayÚisocalendarÚmathÚceilÚmonthÚgetattr)Úlookup_typeÚdtr   r   r   rB   9  s    rB   c          	   C   sœ   yt  |¡}W n ttfk
r&   d S X | dkr:d|j S | dkrd|j|jd d  }d|j|f S | dkr|d|j|jf S | dkr˜d	|j|j|jf S d S )
NÚyearz%i-01-01r{   r   r?   z
%i-%02i-01r„   Údayz%i-%02i-%02i)r|   r}   r~   r   rˆ   r„   r‰   )r†   r‡   Úmonth_in_quarterr   r   r   rC   J  s    
rC   c          	   C   sr   yt  |¡}W n ttfk
r&   d S X | dkr:d|j S | dkrRd|j|jf S | dkrnd|j|j|jf S d S )NÚhourz
%02i:00:00Úminutez%02i:%02i:00Úsecondz%02i:%02i:%02i)r|   Útypecast_timer~   r   r‹   rŒ   r�   )r†   r‡   r   r   r   rI   Z  s    
rI   c          	   C   sR   | d krd S yt  | ¡} W n ttfk
r2   d S X |d k	rNt | t |¡¡} | S )N)r|   r}   r~   r   r   Ú	localtimeÚpytz)r‡   Útznamer   r   r   Ú_sqlite_datetime_parseg  s    r’   c             C   s"   t | |ƒ} | d krd S |  ¡  ¡ S )N)r’   r   Ú	isoformat)r‡   r‘   r   r   r   rD   s  s    
rD   c             C   s"   t | |ƒ} | d krd S |  ¡  ¡ S )N)r’   r   r“   )r‡   r‘   r   r   r   rE   z  s    
rE   c             C   sh   t ||ƒ}|d krd S | dkr.| ¡ d d S | dkrB| ¡ d S | dkrZt |jd ¡S t|| ƒS d S )Nrx   ry   r   rz   r{   r?   )r’   r€   r�   r‚   rƒ   r„   r…   )r†   r‡   r‘   r   r   r   rF   �  s    
rF   c             C   sö   t ||ƒ}|d krd S | dkr(d|j S | dkrR|j|jd d  }d|j|f S | dkrjd|j|jf S | dkr†d	|j|j|jf S | d
kr¦d|j|j|j|jf S | dkrÊd|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‰   z%i-%02i-%02i 00:00:00r‹   z%i-%02i-%02i %02i:00:00rŒ   z%i-%02i-%02i %02i:%02i:00r�   z%i-%02i-%02i %02i:%02i:%02i)r’   rˆ   r„   r‰   r‹   rŒ   r�   )r†   r‡   r‘   rŠ   r   r   r   rG   �  s$    

rG   c          	   C   s>   |d krd S yt  |¡}W n ttfk
r2   d S X t|| ƒS )N)r|   rŽ   r~   r   r…   )r†   r‡   r   r   r   rH   ¤  s    rH   c          	   C   s¼   yšt |tƒr$tt |¡t d¡ ƒ}t|ƒ}|dkr>t |¡}t |tƒr`tt |¡t d¡ ƒ}t|ƒ}|dkrzt |¡}|  ¡ dkr�|| }n|| }W n t	t
fk
r²   dS X t|ƒS )z¢
    LHS and RHS can be either:
    - An integer number of microseconds
    - A string representing a timedelta object
    - A string representing a datetime
    i@B Nú+)Ú
isinstanceÚintÚstrr    ÚDecimalr	   r|   r}   Ústripr~   r   )rP   ÚlhsÚrhsZreal_lhsZreal_rhsÚoutr   r   r   rM   ®  s"    




rM   c             C   st   t  | ¡}t  |¡}|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   rJ   Ë  s    

XrJ   c             C   s$   t  | ¡}t  |¡}||  ¡ d S )Ni@B )r|   r}   Útotal_seconds)rš   r›   rŸ   r    r   r   r   rK   Ú  s    

rK   c             C   s    |d k	rt t | t|ƒ¡ƒS dS )NF)r   ÚreÚsearchr—   )Z
re_patternZ	re_stringr   r   r   rL   à  s    rL   c             C   s   | | S )Nr   )ÚxÚyr   r   r   rN   ä  s    rN   )<rw   r    r‚   r¢   r7   Zsqlite3r   r5   r�   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backendsr|   Zdjango.db.backends.base.baser   Zdjango.utilsr   Zdjango.utils.dateparser   r   r	   r
   Úclientr   rg   r   r:   r   rb   r   Ú
operationsr   Zschemar   r   Zregister_converterr˜   Zregister_adapterZrev_typecast_decimalr!   Úcompilert   rm   rV   rB   rC   rI   r’   rD   rE   rF   rG   rH   rM   rJ   rK   rL   rN   r   r   r   r   Ú<module>   sZ    t

