U
    R+|j<6  ã                   @   s¦  d Z ddlZddlZddl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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'm(Z( dd„ Z)dd„ Z*dd„ Z+e ,ddj-¡ e ,de)eƒ¡ e ,de)eƒ¡ e ,de)eƒ¡ e ,de)eƒ¡ e .ej/e0¡ e .ej1e*¡ e .eje+¡ G d d!„ d!eƒZ2ed"ƒZ3G d#d$„ d$ej4ƒZ5dS )%z@
SQLite backend for the sqlite3 module in the standard library.
é    N)ÚMapping)ÚchainÚtee)Údbapi2)ÚImproperlyConfigured)ÚIntegrityError)ÚBaseDatabaseWrapper)Úasync_unsafe)Ú
parse_dateÚparse_datetimeÚ
parse_time)Ú_lazy_re_compileé   )Úregister)Ú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©Z	conv_func© úgc:\users\snmko\desktop\web_content\django_cbt\venv\Lib\site-packages\django/db/backends/sqlite3/base.pyÚ<lambda>   ó    zdecoder.<locals>.<lambda>r   r   r   r   r   Údecoder   s    r   c                 C   s   |   ¡ S r   ©Ú	isoformat©Úvalr   r   r   Ú
adapt_date"   s    r#   c                 C   s
   |   d¡S )Nú r   r!   r   r   r   Úadapt_datetime&   s    r%   Úbooló   1ÚdateÚtimeÚdatetimeÚ	timestampc                   @   s2  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œ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d.d/„ Ze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)r(   r*   ÚdecimalZbigintÚrealzchar(15)zchar(39)Útextzbigint unsignedzinteger unsignedzsmallint unsignedZsmallintr)   zchar(32))Ú	AutoFieldÚBigAutoFieldZBinaryFieldZBooleanFieldZ	CharFieldZ	DateFieldZDateTimeFieldZDecimalFieldZDurationFieldZ	FileFieldZFilePathFieldZ
FloatFieldZIntegerFieldZBigIntegerFieldZIPAddressFieldZGenericIPAddressFieldÚ	JSONFieldZOneToOneFieldÚPositiveBigIntegerFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldZ	SlugFieldÚSmallAutoFieldZSmallIntegerFieldZ	TextFieldZ	TimeFieldZ	UUIDFieldz"%(column)s" >= 0z2(JSON_VALID("%(column)s") OR "%(column)s" IS NULL))r4   r3   r5   r6   ZAUTOINCREMENT)r1   r2   r7   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 '\')r9   r:   r>   r@   r?   rA   c                 C   sd   | j }|d stdƒ‚|d tjtjB dœ|d –}d|krP|d rPt dt¡ | ddd	œ¡ |S )
NÚNAMEzJsettings.DATABASES is improperly configured. Please supply the NAME value.)ZdatabaseZdetect_typesÚOPTIONSÚ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.FT)rD   Úuri)	Úsettings_dictr   ÚDatabaseZPARSE_DECLTYPESZPARSE_COLNAMESÚwarningsÚwarnÚRuntimeWarningÚupdate)ÚselfrF   Úkwargsr   r   r   Úget_connection_params’   s"    ÿ
þýûz%DatabaseWrapper.get_connection_paramsc                 C   s   | j jS r   )rG   Zsqlite_version_info©rL   r   r   r   Úget_database_version¯   s    z$DatabaseWrapper.get_database_versionc                 C   s,   t jf |Ž}t|ƒ | d¡ | d¡ |S )NúPRAGMA foreign_keys = ONzPRAGMA legacy_alter_table = OFF)rG   ÚconnectÚregister_functionsÚexecute)rL   Zconn_paramsÚconnr   r   r   Úget_new_connection²   s
    

z"DatabaseWrapper.get_new_connectionNc                 C   s   | j jtd�S )N)Úfactory)Ú
connectionÚcursorÚSQLiteCursorWrapper)rL   Únamer   r   r   Úcreate_cursor½   s    zDatabaseWrapper.create_cursorc                 C   s   |   ¡  |  ¡ st | ¡ d S r   )Zvalidate_thread_sharingÚis_in_memory_dbr   ÚcloserO   r   r   r   r^   À   s    zDatabaseWrapper.closec                 C   s   | j S r   )Zin_atomic_blockrO   r   r   r   Ú_savepoint_allowedÉ   s    z"DatabaseWrapper._savepoint_allowedc              	   C   s,   |r
d }nd}| j � || j_W 5 Q R X d S )NÚ )Zwrap_database_errorsrX   Zisolation_level)rL   Z
autocommitÚlevelr   r   r   Ú_set_autocommitÑ   s
    zDatabaseWrapper._set_autocommitc              	   C   s:   |   ¡ �"}| d¡ | d¡ ¡ d }W 5 Q R X t|ƒ S )NzPRAGMA foreign_keys = OFFzPRAGMA foreign_keysr   )rY   rT   Úfetchoner&   )rL   rY   Úenabledr   r   r   Údisable_constraint_checkingÝ   s    

z+DatabaseWrapper.disable_constraint_checkingc              	   C   s"   |   ¡ �}| d¡ W 5 Q R X d S )NrQ   ©rY   rT   )rL   rY   r   r   r   Úenable_constraint_checkingæ   s    
z*DatabaseWrapper.enable_constraint_checkingc                    sê   ˆ  ¡ �Ø‰ |dkr"ˆ  d¡ ¡ }nt ‡ ‡fdd„|D ƒ¡}|D ]š\}}}}ˆ  dˆj |¡ ¡ ¡ | }|dd… \}}	ˆj ˆ |¡}
ˆ  dˆj |
¡ˆj |¡ˆj |¡f |f¡ 	¡ \}}t
d	|||||||	f ƒ‚q@W 5 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(   | ] }ˆ   d ˆj |¡ ¡ ¡ V  qdS )zPRAGMA foreign_key_check(%s)N)rT   ÚopsÚ
quote_nameÚfetchall)Ú.0Ú
table_name©rY   rL   r   r   Ú	<genexpr>ö   s   ýÿz4DatabaseWrapper.check_constraints.<locals>.<genexpr>zPRAGMA foreign_key_list(%s)é   é   z'SELECT %s, %s FROM %s WHERE rowid = %%sz–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.)rY   rT   rj   r   Úfrom_iterablerh   ri   ÚintrospectionZget_primary_key_columnrc   r   )rL   Ztable_namesZ
violationsrl   ZrowidZreferenced_table_nameZforeign_key_indexZforeign_keyZcolumn_nameZreferenced_column_nameZprimary_key_column_nameZprimary_key_valueZ	bad_valuer   rm   r   Úcheck_constraintsê   sV    
üûÿþ ÿ


ýÿù	ùýÿz!DatabaseWrapper.check_constraintsc                 C   s   dS )NTr   rO   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BEGINNrf   rO   r   r   r   Ú#_start_transaction_under_autocommit%  s    z3DatabaseWrapper._start_transaction_under_autocommitc                 C   s   | j  | jd ¡S )NrB   )Úcreationr]   rF   rO   r   r   r   r]   .  s    zDatabaseWrapper.is_in_memory_db)N)N)&Ú__name__Ú
__module__Ú__qualname__ÚvendorZdisplay_nameÚ
data_typesZdata_type_check_constraintsZdata_types_suffixÚ	operatorsZpattern_escZpattern_opsrG   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classrN   rP   r	   rV   r\   r^   r_   rb   re   rg   rs   rt   ru   r]   r   r   r   r   r,   5   s¨   åüý	òú	



	
8	r,   z(?<!%)%sc                       s<   e Zd ZdZd
‡ fdd„	Z‡ fdd„Zddœdd	„Z‡  ZS )rZ   aQ  
    Django uses the "format" and "pyformat" styles, but Python's sqlite3 module
    supports neither of these styles.

    This wrapper performs the following conversions:

    - "format" style to "qmark" style
    - "pyformat" style to "named" style

    In both cases, if you want to use a literal "%s", you'll need to use "%%s".
    Nc                    sF   |d krt ƒ  |¡S t|tƒr&t|ƒnd }| j||d�}t ƒ  ||¡S ©N©Úparam_names)ÚsuperrT   Ú
isinstancer   ÚlistÚconvert_query)rL   ÚqueryÚparamsr   ©Ú	__class__r   r   rT   B  s
    zSQLiteCursorWrapper.executec                    sR   t t|ƒƒ\}}t|d ƒ }r2t|tƒr2t|ƒ}nd }| j||d�}tƒ  ||¡S r}   )	r   ÚiterÚnextr�   r   r‚   rƒ   r€   Úexecutemany)rL   r„   Z
param_listZpeekabler…   r   r†   r   r   rŠ   J  s    
zSQLiteCursorWrapper.executemanyr~   c                C   s2   |d krt  d|¡ dd¡S |dd„ |D ƒ S d S )Nú?z%%ú%c                 S   s   i | ]}|d |› �“qS )ú:r   )rk   r[   r   r   r   Ú
<dictcomp>[  s      z5SQLiteCursorWrapper.convert_query.<locals>.<dictcomp>)ÚFORMAT_QMARK_REGEXÚsubÚreplace)rL   r„   r   r   r   r   rƒ   U  s    z!SQLiteCursorWrapper.convert_query)N)rw   rx   ry   Ú__doc__rT   rŠ   rƒ   Ú__classcell__r   r   r†   r   rZ   5  s   rZ   )6r’   r*   r.   rH   Úcollections.abcr   Ú	itertoolsr   r   Zsqlite3r   rG   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backends.base.baser   Zdjango.utils.asyncior	   Zdjango.utils.dateparser
   r   r   Zdjango.utils.regex_helperr   Z
_functionsr   rS   Úclientr   rv   r   Úfeaturesr   rr   r   Ú
operationsr   Zschemar   r   r#   r%   Zregister_converterÚ__eq__Zregister_adapterÚDecimalÚstrr(   r,   r�   ÚCursorrZ   r   r   r   r   Ú<module>   sD    ~