o 3af@sddZddlZddlZddlZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z ddl mZddlZddlmZddlmZddlmZddlmZdd lmZdd lmZdd lmZm Z dd l!m"Z"dd l#m$Z$ddl%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2ddZ3ddZ4ddZ5ddZ6e6e7ddj8e7d e3e e7d!e3ee7d"e3ee9ej:e;Gd#d$d$eZZ?dDd(d)Z@d*d+ZAd,d-ZBd.d/ZCd0d1ZDdDd2d3ZEd4d5ZFd6d7ZGe4d8d9ZHe4d:d;ZIe4dd?ZKe4d@dAZLe4dBdCZMdS)Ez@ SQLite backend for the sqlite3 module in the standard library. N)chain)dbapi2)ImproperlyConfigured)IntegrityError)utils)BaseDatabaseWrapper)timezone) async_unsafe)parse_datetime parse_time)duration_microseconds)_lazy_re_compile)PY38)DatabaseClient)DatabaseCreation)DatabaseFeatures)DatabaseIntrospection)DatabaseOperations)DatabaseSchemaEditorcs fddS)zR Convert bytestrings from Python's sqlite3 interface to a regular string. cs |SN)decode)s conv_funcA/usr/lib/python3/dist-packages/django/db/backends/sqlite3/base.py* zdecoder..rrrrrdecoder&s rcstfdd}|S)a Decorator that returns None if any of the arguments to the decorated function are None. Many SQL functions return NULL if any of their arguments are NULL. This decorator simplifies the implementation of this for the custom functions registered below. csd|vrdS|i|Srr)argskwargsfuncrrwrapper4sznone_guard..wrapper) functoolswraps)r#r$rr"r none_guard-sr'cCstdtf|tjdS)zx Return an aggregate class that accumulates values in a list and applies the provided function to the data. ListAggregate)finalizestep)typelistappend)functionrrrlist_aggregate:sr/cCstjdkr tdtjdS)N) rz-SQLite 3.9.0 or later is required (found %s).)Databasesqlite_version_inforsqlite_versionrrrrcheck_sqlite_versionBs r5bool1timedatetime timestampc@s|eZdZdZdZidddddddd d d d d dddddddd dd ddddddddddddd dd d!d"d dd#dd$d%d& Zd'd(d'd'd)Zd*d*d*d+Zd,d-d-d-d.d/d0d1d2d3d-d-d-d-d4Zd5Z d6d7d8d9d:d;d<Z e Z e Z eZeZeZeZeZd=d>Zed?d@ZdAdBZdXdDdEZedFdGZdHdIZdJdKZdLdMZ dNdOZ!dXdPdQZ"dRdSZ#dTdUZ$dVdWZ%dCS)YDatabaseWrappersqliteSQLite AutoFieldinteger BigAutoField BinaryFieldBLOB BooleanFieldr6 CharFieldzvarchar(%(max_length)s) DateFielddate DateTimeFieldr9 DecimalFielddecimal DurationFieldbigint FileField FilePathField FloatFieldreal IntegerFieldBigIntegerFieldIPAddressFieldzchar(15)GenericIPAddressFieldzchar(39) JSONFieldtextzbigint unsignedzinteger unsignedzsmallint unsignedsmallintr8zchar(32)) NullBooleanField OneToOneFieldPositiveBigIntegerFieldPositiveIntegerFieldPositiveSmallIntegerField SlugFieldSmallAutoFieldSmallIntegerField TextField TimeField UUIDFieldz"%(column)s" >= 0z2(JSON_VALID("%(column)s") OR "%(column)s" IS NULL))rYrTrZr[ AUTOINCREMENT)r>r@r]z= %szLIKE %s ESCAPE '\'z REGEXP %szREGEXP '(?i)' || %sz> %sz>= %sz< %sz<= %s)exactiexactcontains icontainsregexiregexgtgteltlte startswithendswith istartswith iendswithz@REPLACE(REPLACE(REPLACE({}, '\', '\\'), '%%', '\%%'), '_', '\_')z"LIKE '%%' || {} || '%%' ESCAPE '\'z)LIKE '%%' || UPPER({}) || '%%' ESCAPE '\'zLIKE {} || '%%' ESCAPE '\'z!LIKE UPPER({}) || '%%' ESCAPE '\'zLIKE '%%' || {} ESCAPE '\'z!LIKE '%%' || UPPER({}) ESCAPE '\')rerfrmrornrpcCsh|j}|ds tdt|dtjtjBd|d}d|vr*|dr*tdt| ddd |S) NNAMEzJsettings.DATABASES is improperly configured. Please supply the NAME value.)database detect_typesOPTIONScheck_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)ruuri) settings_dictrstrr2PARSE_DECLTYPESPARSE_COLNAMESwarningswarnRuntimeWarningupdate)selfrwr!rrrget_connection_paramss"   z%DatabaseWrapper.get_connection_paramscCs^tjdEi|}trtj|jdd}n|j}|ddt|ddt|ddt|d dt |d dt|d dt |d dt |d dt |ddt |ddt|ddt|ddt|ddttj|ddttj|ddttj|ddttj|ddttj|ddttj|ddttj|ddtdd|ddttj|ddttj|ddttj|d dttj|d!dtd"d|d#dt|d$dtd%d|d&dttj |d'd(d)d|d*dttj!|d+dttj"|d,dttj#|d-dtd.d|d/dt$|d0dtd1d|d2dtd3d|d4dtd5d|d6dtd7d|d8dtd9d|d:dtd;d|ddttj'|d?d(t(j(|)d@dt*t+j,|)dAdt*t+j-|)dBdt*t+j.|)dCdt*t+j/|0dD|S)FNT) deterministicdjango_date_extractdjango_date_truncdjango_datetime_cast_dater0django_datetime_cast_timedjango_datetime_extractdjango_datetime_truncdjango_time_extractdjango_time_truncdjango_time_diffdjango_timestamp_diffdjango_format_dtdeltaregexpACOSrASINATANATAN2BITXORCEILINGCOSCOTcSsdt|S)Nr)mathtanxrrrrz4DatabaseWrapper.get_new_connection..DEGREESEXPFLOORLNLOGcSs t||Sr)rlog)ryrrrrrLPADMD5cSt|Sr)hashlibmd5encode hexdigestrrrrrMODPIrcSstjSr)rpirrrrrsPOWERRADIANSREPEATREVERSEcSs|dddS)NrrrrrrrRPADSHA1cSrr)rsha1rrrrrrrrSHA224cSrr)rsha224rrrrrrrrSHA256cSrr)rsha256rrrrrrrrSHA384cSrr)rsha384rrrrrrrrSHA512cSrr)rsha512rrrrrrrrSIGNcSs|dk|dkS)NrrrrrrrsSINSQRTTANRAND STDDEV_POP STDDEV_SAMPVAR_POPVAR_SAMPPRAGMA foreign_keys = ONr)1r2connectrr%partialcreate_function_sqlite_datetime_extract_sqlite_date_trunc_sqlite_datetime_cast_date_sqlite_datetime_cast_time_sqlite_datetime_trunc_sqlite_time_extract_sqlite_time_trunc_sqlite_time_diff_sqlite_timestamp_diff_sqlite_format_dtdelta_sqlite_regexpr'racosasinatanatan2operatorxorceilcosdegreesexpfloorr _sqlite_lpadfmodpowradiansmul _sqlite_rpadsinsqrtrrandomcreate_aggregater/ statisticspstdevstdev pvariancevarianceexecute)r conn_paramsconncreate_deterministic_functionrrrget_new_connectionsr               z"DatabaseWrapper.get_new_connectioncCsdSrrrrrrinit_connection_statez%DatabaseWrapper.init_connection_stateNcCs|jjtdS)N)factory) connectioncursorSQLiteCursorWrapper)rnamerrr create_cursorszDatabaseWrapper.create_cursorcCs"||st|dSdSr)validate_thread_sharingis_in_memory_dbrcloserrrrrszDatabaseWrapper.closecCs|jSr)in_atomic_blockrrrr_savepoint_allowedsz"DatabaseWrapper._savepoint_allowedcCsB|rd}nd}|j ||j_WddS1swYdS)N)wrap_database_errorsrisolation_level)r autocommitlevelrrr_set_autocommit%s  "zDatabaseWrapper._set_autocommitcCsN|}|d|dd}Wdn1swYt| S)NzPRAGMA foreign_keys = OFFzPRAGMA foreign_keysr)rrfetchoner6)rrenabledrrrdisable_constraint_checking1s   z+DatabaseWrapper.disable_constraint_checkingcCs8|}|dWddS1swYdS)Nrrr)rrrrrenable_constraint_checking:s  "z*DatabaseWrapper.enable_constraint_checkingcsjjrq|durd}n tfdd|D}|D]L\}}}}dj||}|dd\}} j |} dj| j|j|f|f \} } t d || ||| || fWddS1s|wYdSW|durj }|D]A}j |} | sqj |} | D]+\}}} d | ||||| || fD]}t d ||d |||d || fqqWddS1swYdS) 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. NzPRAGMA foreign_key_checkc3s*|]}dj|VqdS)zPRAGMA foreign_key_check(%s)N)rops quote_namefetchall).0 table_namerrrr Ks  z4DatabaseWrapper.check_constraints..zPRAGMA foreign_key_list(%s)r0z'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 rr)features!supports_pragma_foreign_key_checkrrrr from_iterablerr introspectionget_primary_key_columnr r table_namesget_key_columns)rr violationsrrowidreferenced_table_nameforeign_key_index foreign_key column_namereferenced_column_nameprimary_key_column_nameprimary_key_value bad_value key_columnsbad_rowrrrcheck_constraints>s~    " #    "z!DatabaseWrapper.check_constraintscCsdS)NTrrrrr is_usablerzDatabaseWrapper.is_usablecCs|ddS)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 rrrr#_start_transaction_under_autocommitsz3DatabaseWrapper._start_transaction_under_autocommitcCs|j|jdS)Nrq)creationrrwrrrrrszDatabaseWrapper.is_in_memory_dbr)&__name__ __module__ __qualname__vendor display_name data_typesdata_type_check_constraintsdata_types_suffix operators pattern_esc pattern_opsr2rSchemaEditorClassr client_classrcreation_classrfeatures_classrintrospection_classr ops_classrr rrrrrr r rr*r+r-rrrrrr;Ss        >    L r;z(?|durdSzt|}Wn ttfyYdSwt||Sr)rRrrrUrTr~)rmr\rrrr$s rc Csz;t|tr tdd|nt|}t|trtdd|nt|}|dkr.||}n ||}Wt |SWt |SttfyGYdSw)zs LHS and RHS can be either: - An integer number of microseconds - A string representing a datetime rrMN) isinstancerZr9rYrRrSstriprUrTrx)rlhsrhsreal_lhsreal_rhsoutrrrr.s""   rcCstt|}t|}|jddd|jdd|jd|j|jddd|jdd|jd|jS)N<i@B)rRrrrorprq microsecondrrleftrightrrrrCs$    rcCs t|}t|}t||Sr)rRrSr rrrrrSs   rcCstt|t|Sr)r6researchrx) re_pattern re_stringrrrrZrcCs4t||kr |d|S||d|t||Sr)lenrUlength fill_textrrrr_s  rcCs|||d|Srrrrrrrfrr)NN)NrKr9rIr%rrrrrrr{ itertoolsrsqlite3rr2rVdjango.core.exceptionsr django.dbrdjango.db.backendsrrRdjango.db.backends.base.baser django.utilsrdjango.utils.asyncior django.utils.dateparser r django.utils.durationr django.utils.regex_helperr django.utils.versionrclientrr.rrrrr operationsrschemarrr'r/r5register_converter__eq__register_adapterDecimalrxr;rHr@rrcrrrrrrrrrrrrrrrrrs                  I