o
    ˜¨ÊhÁ;  ã                   @   sN  d Z ddl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"m#Z# dd„ Z$e %ddj&¡ e %de$eƒ¡ e %de$eƒ¡ e %de$eƒ¡ e 'ej(e)¡ G dd„ deƒZ*edƒZ+G dd„ dej,ƒZ-dS )z@
SQLite backend for the sqlite3 module in the standard library.
é    N)Úchain)Údbapi2)ÚImproperlyConfigured)ÚIntegrityError)ÚBaseDatabaseWrapper)Úasync_unsafe)Ú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©Ú	conv_func© úQ/var/www/html/env/lib/python3.10/site-packages/django/db/backends/sqlite3/base.pyÚ<lambda>   s    zdecoder.<locals>.<lambda>r   r   r   r   r   Údecoder   s   r   Úbooló   1ÚtimeÚdatetimeÚ	timestampc                   @   sz  e Zd ZdZdZi 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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/d0d1d2d3d-d-d-d-d4œZd5Z	d6d7d8d9d:d;d<œZ
eZeZeZeZeZeZeZd=d>„ Zd?d@„ ZedAdB„ ƒZdXdDdE„ZedFdG„ ƒZdHdI„ ZdJdK„ ZdLdM„ Z dNdO„ Z!dXdPdQ„Z"dRdS„ Z#dTdU„ Z$dVdW„ Z%dCS )YÚDatabaseWrapperÚsqliteÚSQLiteÚ	AutoFieldÚintegerÚBigAutoFieldÚBinaryFieldÚBLOBÚBooleanFieldr   Ú	CharFieldzvarchar(%(max_length)s)Ú	DateFieldÚdateÚDateTimeFieldr   ÚDecimalFieldÚdecimalÚDurationFieldÚbigintÚ	FileFieldÚFilePathFieldÚ
FloatFieldÚrealÚIntegerFieldÚBigIntegerFieldÚIPAddressFieldzchar(15)ÚGenericIPAddressFieldzchar(39)Ú	JSONFieldÚtextzbigint unsignedzinteger unsignedzsmallint unsignedÚsmallintr   zchar(32))
ÚOneToOneFieldÚPositiveBigIntegerFieldÚPositiveIntegerFieldÚPositiveSmallIntegerFieldÚ	SlugFieldÚSmallAutoFieldÚSmallIntegerFieldÚ	TextFieldÚ	TimeFieldÚ	UUIDFieldz"%(column)s" >= 0z2(JSON_VALID("%(column)s") OR "%(column)s" IS NULL))r>   r:   r?   r@   ÚAUTOINCREMENT)r$   r&   rB   z= %szLIKE %s ESCAPE '\'z	REGEXP %szREGEXP '(?i)' || %sz> %sz>= %sz< %sz<= %s)ÚexactÚiexactÚcontainsÚ	icontainsÚregexÚiregexÚgtÚgteÚltÚ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 '\')rJ   rK   rR   rT   rS   rU   c                 C   sd   | j }|d stdƒ‚|d tjtjB dœ|d ¥}d|v r(|d r(t dt¡ | ddd	œ¡ |S )
NÚNAMEzJsettings.DATABASES is improperly configured. Please supply the NAME value.)ÚdatabaseÚ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)rZ   Úuri)	Úsettings_dictr   ÚDatabaseÚPARSE_DECLTYPESÚPARSE_COLNAMESÚwarningsÚwarnÚRuntimeWarningÚupdate)Úselfr\   Úkwargsr   r   r   Úget_connection_params…   s"   ÿ
þýûz%DatabaseWrapper.get_connection_paramsc                 C   s   | j jS r   )r]   Úsqlite_version_info©rd   r   r   r   Úget_database_version¢   s   z$DatabaseWrapper.get_database_versionc                 C   s0   t jdi |¤Ž}t|ƒ | d¡ | d¡ |S )NúPRAGMA foreign_keys = ONzPRAGMA legacy_alter_table = OFFr   )r]   ÚconnectÚregister_functionsÚexecute)rd   Ú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)rd   Únamer   r   r   Úcreate_cursor°   s   zDatabaseWrapper.create_cursorc                 C   s"   |   ¡  |  ¡ st | ¡ d S d S r   )Úvalidate_thread_sharingÚis_in_memory_dbr   Úcloserh   r   r   r   ry   ³   s   ÿzDatabaseWrapper.closec                 C   s   | j S r   )Úin_atomic_blockrh   r   r   r   Ú_savepoint_allowed¼   s   z"DatabaseWrapper._savepoint_allowedc                 C   sB   |rd }nd}| j � || j_W d   ƒ d S 1 sw   Y  d S )NÚ )Úwrap_database_errorsrr   Úisolation_level)rd   Ú
autocommitÚlevelr   r   r   Ú_set_autocommitÄ   s   
"ÿzDatabaseWrapper._set_autocommitc                 C   sN   |   ¡ �}| d¡ | d¡ ¡ d }W d   ƒ n1 sw   Y  t|ƒ S )NzPRAGMA foreign_keys = OFFzPRAGMA foreign_keysr   )rs   rm   Úfetchoner   )rd   rs   Úenabledr   r   r   Údisable_constraint_checkingÐ   s
   

û
z+DatabaseWrapper.disable_constraint_checkingc                 C   s8   |   ¡ �}| d¡ W d   ƒ d S 1 sw   Y  d S )Nrj   ©rs   rm   )rd   rs   r   r   r   Úenable_constraint_checkingÙ   s   
"ÿz*DatabaseWrapper.enable_constraint_checkingc                    sÒ  ˆj jrƒˆ ¡ �q‰ |du rˆ  d¡ ¡ }nt ‡ ‡fdd„|D ƒ¡}|D ]L\}}}}ˆ  dˆj |¡ ¡ ¡ | }|dd… \}}	ˆj	 
ˆ |¡}
ˆ  dˆj |
¡ˆj |¡ˆj |¡f |f¡ ¡ \}}td	|||||||	f ƒ‚W d  ƒ dS 1 s|w   Y  dS ˆ ¡ �X‰ |du r’ˆj	 ˆ ¡}|D ]B}ˆj	 
ˆ |¡}
|
s q”ˆj	 ˆ |¡}|D ],\}\}	}ˆ  d
|
|||||	||	f ¡ ˆ  ¡ D ]}td	||d |||d ||	f ƒ‚q©q”W d  ƒ dS 1 sâw   Y  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)rm   ÚopsÚ
quote_nameÚfetchall)Ú.0Ú
table_name©rs   rd   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.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   )ÚfeaturesÚ!supports_pragma_foreign_key_checkrs   rm   r‰   r   Úfrom_iterabler‡   rˆ   ÚintrospectionÚget_primary_key_columnr‚   r   Útable_namesÚget_relations)rd   r•   Ú
violationsr‹   ÚrowidÚreferenced_table_nameÚforeign_key_indexÚforeign_keyÚcolumn_nameÚreferenced_column_nameÚprimary_key_column_nameÚprimary_key_valueÚ	bad_valueÚ	relationsÚbad_rowr   rŒ   r   Úcheck_constraintsÝ   s¶   
ûûÿþÿ


ýÿùø	ùýÿê"ô
1ÿ
ýøúÿùýÿÿêù"ýz!DatabaseWrapper.check_constraintsc                 C   s   dS )NTr   rh   r   r   r   Ú	is_usableG  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.
        ÚBEGINNr…   rh   r   r   r   Ú#_start_transaction_under_autocommitJ  s   z3DatabaseWrapper._start_transaction_under_autocommitc                 C   s   | j  | jd ¡S )NrV   )Úcreationrx   r\   rh   r   r   r   rx   S  s   zDatabaseWrapper.is_in_memory_dbr   )&Ú__name__Ú
__module__Ú__qualname__ÚvendorÚdisplay_nameÚ
data_typesÚdata_type_check_constraintsÚdata_types_suffixÚ	operatorsÚpattern_escÚpattern_opsr]   r   ÚSchemaEditorClassr   Úclient_classr   Úcreation_classr   Úfeatures_classr   Úintrospection_classr   Ú	ops_classrf   ri   r   rp   rv   ry   r{   r�   r„   r†   r£   r¤   r¦   rx   r   r   r   r   r!   (   sÎ    ÿþýüûúùø	÷
öõôóòñðïåüý	òú	



	
j	r!   z(?<!%)%sc                   @   s*   e Zd ZdZd	dd„Zdd„ Zdd„ ZdS )
rt   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 u rt j | |¡S |  |¡}t j | ||¡S r   )r]   ÚCursorrm   Úconvert_query)rd   ÚqueryÚparamsr   r   r   rm   a  s   
zSQLiteCursorWrapper.executec                 C   s   |   |¡}tj | ||¡S r   )rº   r]   r¹   Úexecutemany)rd   r»   Ú
param_listr   r   r   r½   g  s   
zSQLiteCursorWrapper.executemanyc                 C   s   t  d|¡ dd¡S )Nú?z%%ú%)ÚFORMAT_QMARK_REGEXÚsubÚreplace)rd   r»   r   r   r   rº   k  s   z!SQLiteCursorWrapper.convert_queryr   )r¨   r©   rª   Ú__doc__rm   r½   rº   r   r   r   r   rt   Z  s
    
rt   ).rÄ   r/   r`   Ú	itertoolsr   Úsqlite3r   r]   Údjango.core.exceptionsr   Ú	django.dbr   Údjango.db.backends.base.baser   Údjango.utils.asyncior   Údjango.utils.dateparser   r	   Údjango.utils.regex_helperr
   Ú
_functionsr   rl   Úclientr   r§   r   r�   r   r“   r   Ú
operationsr   Úschemar   r   Úregister_converterÚ__eq__Úregister_adapterÚDecimalÚstrr!   rÁ   r¹   rt   r   r   r   r   Ú<module>   s:      1