a
    ‘ÐOcÉ;  ã                   @   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©Z	conv_func© úV/var/www/html/gsl.tools/lib/python3.9/site-packages/django/db/backends/sqlite3/base.pyÚ<lambda>   ó    zdecoder.<locals>.<lambda>r   r   r   r   r   Údecoder   s    r   Úbooló   1Ú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)Údater   Ú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))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 '\')r/   r0   r4   r6   r5   r7   c                 C   sd   | j }|d stdƒ‚|d tjtjB dœ|d ¥}d|v 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)r:   Úuri)	Úsettings_dictr   ÚDatabaseZPARSE_DECLTYPESZ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=   Zsqlite_version_info©rB   r   r   r   Úget_database_version¢   s    z$DatabaseWrapper.get_database_versionc                 C   s0   t jf i |¤Ž}t|ƒ | d¡ | d¡ |S )NúPRAGMA foreign_keys = ONzPRAGMA legacy_alter_table = OFF)r=   ÚconnectÚregister_functionsÚexecute)rB   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)rB   Ú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   ÚcloserE   r   r   r   rT   ³   s    zDatabaseWrapper.closec                 C   s   | j S r   )Zin_atomic_blockrE   r   r   r   Ú_savepoint_allowed¼   s    z"DatabaseWrapper._savepoint_allowedc                 C   s@   |r
d }nd}| j � || j_W d   ƒ n1 s20    Y  d S )NÚ )Zwrap_database_errorsrN   Zisolation_level)rB   Z
autocommitÚlevelr   r   r   Ú_set_autocommitÄ   s
    zDatabaseWrapper._set_autocommitc                 C   sN   |   ¡ �,}| d¡ | d¡ ¡ d }W d   ƒ n1 s:0    Y  t|ƒ S )NzPRAGMA foreign_keys = OFFzPRAGMA foreign_keysr   )rO   rJ   Úfetchoner   )rB   rO   Zenabledr   r   r   Údisable_constraint_checkingÐ   s    

0z+DatabaseWrapper.disable_constraint_checkingc                 C   s6   |   ¡ �}| d¡ W d   ƒ n1 s(0    Y  d S )NrG   ©rO   rJ   )rB   rO   r   r   r   Úenable_constraint_checkingÙ   s    
z*DatabaseWrapper.enable_constraint_checkingc                    sä  ˆj j�rˆ ¡ �â‰ |du r,ˆ  d¡ ¡ }nt ‡ ‡fdd„|D ƒ¡}|D ]š\}}}}ˆ  dˆj |¡ ¡ ¡ | }|dd… \}}	ˆj	 
ˆ |¡}
ˆ  dˆj |
¡ˆj |¡ˆj |¡f |f¡ ¡ \}}td	|||||||	f ƒ‚qJW d  ƒ n1 sú0    Y  nÚˆ ¡ �À‰ |du �r&ˆj	 ˆ ¡}|D ]”}ˆj	 
ˆ |¡}
|
�sF�q*ˆj	 ˆ |¡}| ¡ D ]^\}\}	}ˆ  d
|
|||||	||	f ¡ ˆ  ¡ D ](}td	||d |||d ||	f ƒ‚�qŽ�q\�q*W d  ƒ n1 �sÖ0    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)rJ   ÚopsÚ
quote_nameÚfetchall)Ú.0Ú
table_name©rO   rB   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   )ÚfeaturesZ!supports_pragma_foreign_key_checkrO   rJ   r_   r   Úfrom_iterabler]   r^   ÚintrospectionZget_primary_key_columnrY   r   Útable_namesZget_relationsÚitems)rB   ri   Z
violationsra   ZrowidZreferenced_table_nameZforeign_key_indexZforeign_keyZcolumn_nameZreferenced_column_nameZprimary_key_column_nameZprimary_key_valueZ	bad_valueZ	relationsZbad_rowr   rb   r   Úcheck_constraintsÝ   s¦    

ûûÿþÿ


ýÿù	ùýÿ&

ÿý
øúÿùýÿz!DatabaseWrapper.check_constraintsc                 C   s   dS )NTr   rE   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.
        ZBEGINNr[   rE   r   r   r   Ú#_start_transaction_under_autocommitJ  s    z3DatabaseWrapper._start_transaction_under_autocommitc                 C   s   | j  | jd ¡S )Nr8   )ÚcreationrS   r<   rE   r   r   r   rS   S  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_opsr=   r   ZSchemaEditorClassr   Zclient_classr   Zcreation_classr   Zfeatures_classr   Zintrospection_classr   Z	ops_classrD   rF   r   rL   rR   rT   rU   rX   rZ   r\   rk   rl   rm   rS   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 )
rP   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=   ÚCursorrJ   Úconvert_query)rB   ÚqueryÚparamsr   r   r   rJ   a  s    
zSQLiteCursorWrapper.executec                 C   s   |   |¡}tj | ||¡S r   )rv   r=   ru   Úexecutemany)rB   rw   Z
param_listr   r   r   ry   g  s    
zSQLiteCursorWrapper.executemanyc                 C   s   t  d|¡ dd¡S )Nú?z%%ú%)ÚFORMAT_QMARK_REGEXÚsubÚreplace)rB   rw   r   r   r   rv   k  s    z!SQLiteCursorWrapper.convert_query)N)ro   rp   rq   Ú__doc__rJ   ry   rv   r   r   r   r   rP   Z  s   
rP   ).r   r$   r>   Ú	itertoolsr   Zsqlite3r   r=   Zdjango.core.exceptionsr   Z	django.dbr   Zdjango.db.backends.base.baser   Zdjango.utils.asyncior   Zdjango.utils.dateparser   r	   Zdjango.utils.regex_helperr
   Z
_functionsr   rI   Úclientr   rn   r   rf   r   rh   r   Ú
operationsr   Zschemar   r   Zregister_converterÚ__eq__Zregister_adapterÚDecimalÚstrr!   r|   ru   rP   r   r   r   r   Ú<module>   s8     1