o
    ˷e;                     @   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 V/var/www/ideatree/venv/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_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)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	
 |}
|
sqj	 |}|D ],\}\}	} d
|
|||||	||	f    D ]}td	||d |||d ||	f qqW d   dS 1 sw   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 = %%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   )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