Dev Build / cleanup (push) Canceled after 0s
Dev Build / typecheck (push) Canceled after 0s
Dev Build / build (linux-arm64, ubuntu-24.04-arm, linux-arm64) (push) Canceled after 0s
Dev Build / build (linux-x64, ubuntu-latest, linux-x64) (push) Canceled after 0s
Dev Build / build (win-x64, windows-latest, win32-x64) (push) Canceled after 0s
Dev Build / dispatch-dev-docker (push) Canceled after 0s
485 lines
30 KiB
Plaintext
485 lines
30 KiB
Plaintext
#include <stdint.h>
|
|
#include <sstream>
|
|
#include <cstring>
|
|
#include <string>
|
|
#include <sqlite3.h>
|
|
|
|
#include "macros.h"
|
|
#include "database.h"
|
|
#include "statement.h"
|
|
#include "backup.h"
|
|
#include "session.h"
|
|
#include "blob.h"
|
|
|
|
using namespace node_sqlite3;
|
|
|
|
// The native-interface revision. lib/sqlite3-binding.js requires this
|
|
// exact number (NATIVE_INTERFACE_EXPECTED there) and throws when the
|
|
// binary it loaded reports another one, or none at all.
|
|
//
|
|
// Bump both, in the same commit, whenever lib/ starts depending on
|
|
// something this addon did not export before. That turns "a stale .node
|
|
// was resolved ahead of the current build" — which otherwise presents as
|
|
// unexplained missing APIs on the namespace, e.g. a 9.0 binary shadowing
|
|
// a 9.1 checkout and reporting `rebaseChangeset === undefined` — into a
|
|
// load-time error naming the file.
|
|
#define NODE_SQLITE3_NATIVE_INTERFACE 1
|
|
|
|
namespace {
|
|
|
|
// setRowFactoryGenerator(fn): installs the JS half of the row builder.
|
|
//
|
|
// The generator takes (columnNames, arrayShape) and returns a function that
|
|
// builds one row from its arguments — see makeRowFactory in lib/sqlite3.js.
|
|
// It lives in JS so the generated source is escaped by JSON.stringify rather
|
|
// than by a hand-rolled C++ escaper, and so a realm that forbids code
|
|
// generation from strings fails in one catchable place.
|
|
Napi::Value SetRowFactoryGenerator(const Napi::CallbackInfo& info) {
|
|
auto env = info.Env();
|
|
if (info.Length() < 1 || !info[0].IsFunction()) {
|
|
Napi::TypeError::New(env, "setRowFactoryGenerator requires a function")
|
|
.ThrowAsJavaScriptException();
|
|
return env.Undefined();
|
|
}
|
|
auto* addon = env.GetInstanceData<Database::AddonData>();
|
|
if (addon == NULL) return env.Undefined();
|
|
if (addon->row_factory_generator != NULL) {
|
|
napi_delete_reference(env, addon->row_factory_generator);
|
|
addon->row_factory_generator = NULL;
|
|
}
|
|
napi_create_reference(env, info[0], 1, &addon->row_factory_generator);
|
|
return env.Undefined();
|
|
}
|
|
|
|
// complete(sql): sqlite3_complete — true when a SQL string is a complete
|
|
// statement (balanced quotes/semicolons). The REPL/CLI helper; a pure
|
|
// string function with no connection.
|
|
Napi::Value Complete(const Napi::CallbackInfo& info) {
|
|
auto env = info.Env();
|
|
if (info.Length() < 1 || !info[0].IsString()) {
|
|
Napi::TypeError::New(env, "complete() requires a SQL string")
|
|
.ThrowAsJavaScriptException();
|
|
return env.Null();
|
|
}
|
|
std::string sql = info[0].As<Napi::String>().Utf8Value();
|
|
return Napi::Boolean::New(env,
|
|
sqlite3_complete(sql.c_str()) != 0);
|
|
}
|
|
|
|
// compileOptions(): the SQLITE_COMPILE_OPTIONS this build was configured
|
|
// with (sqlite3_compileoption_get) — what "is FTS5 compiled in" can be
|
|
// answered from, at runtime.
|
|
Napi::Value CompileOptions(const Napi::CallbackInfo& info) {
|
|
auto env = info.Env();
|
|
Napi::Array result = Napi::Array::New(env);
|
|
uint32_t i = 0;
|
|
for (const char* opt = sqlite3_compileoption_get(0); opt != NULL;
|
|
opt = sqlite3_compileoption_get(++i)) {
|
|
result.Set(i, Napi::String::New(env, opt));
|
|
}
|
|
return result;
|
|
}
|
|
|
|
Napi::Object RegisterModule(Napi::Env env, Napi::Object exports) {
|
|
Napi::HandleScope scope(env);
|
|
|
|
Database::Init(env, exports);
|
|
Statement::Init(env, exports);
|
|
Backup::Init(env, exports);
|
|
Session::Init(env, exports);
|
|
ChangesetIter::Init(env, exports);
|
|
Blob::Init(env, exports);
|
|
|
|
exports.Set("setRowFactoryGenerator",
|
|
Napi::Function::New(env, SetRowFactoryGenerator));
|
|
exports.Set("invertChangeset",
|
|
Napi::Function::New(env, InvertChangeset));
|
|
exports.Set("concatChangeset",
|
|
Napi::Function::New(env, ConcatChangeset));
|
|
exports.Set("iterateChangeset",
|
|
Napi::Function::New(env, IterateChangeset));
|
|
exports.Set("rebaseChangeset",
|
|
Napi::Function::New(env, RebaseChangeset));
|
|
exports.Set("complete",
|
|
Napi::Function::New(env, Complete));
|
|
exports.Set("compileOptions",
|
|
Napi::Function::New(env, CompileOptions));
|
|
exports.Set("NATIVE_INTERFACE_VERSION",
|
|
Napi::Number::New(env, NODE_SQLITE3_NATIVE_INTERFACE));
|
|
|
|
exports.DefineProperties({
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_READONLY, OPEN_READONLY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_READWRITE, OPEN_READWRITE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_CREATE, OPEN_CREATE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_FULLMUTEX, OPEN_FULLMUTEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_URI, OPEN_URI)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_SHAREDCACHE, OPEN_SHAREDCACHE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_PRIVATECACHE, OPEN_PRIVATECACHE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_NOMUTEX, OPEN_NOMUTEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_MEMORY, OPEN_MEMORY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OPEN_EXRESCODE, OPEN_EXRESCODE)
|
|
DEFINE_CONSTANT_STRING(exports, SQLITE_VERSION, VERSION)
|
|
#ifdef SQLITE_SOURCE_ID
|
|
DEFINE_CONSTANT_STRING(exports, SQLITE_SOURCE_ID, SOURCE_ID)
|
|
#endif
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_VERSION_NUMBER, VERSION_NUMBER)
|
|
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_OK, OK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ERROR, ERROR)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_INTERNAL, INTERNAL)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_PERM, PERM)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ABORT, ABORT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_BUSY, BUSY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LOCKED, LOCKED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_NOMEM, NOMEM)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_READONLY, READONLY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_INTERRUPT, INTERRUPT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR, IOERR)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CORRUPT, CORRUPT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_NOTFOUND, NOTFOUND)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_FULL, FULL)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CANTOPEN, CANTOPEN)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_PROTOCOL, PROTOCOL)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_EMPTY, EMPTY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_SCHEMA, SCHEMA)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_TOOBIG, TOOBIG)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT, CONSTRAINT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_MISMATCH, MISMATCH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_MISUSE, MISUSE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_NOLFS, NOLFS)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_AUTH, AUTH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_FORMAT, FORMAT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_RANGE, RANGE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_NOTADB, NOTADB)
|
|
|
|
// Extended result codes (Deliverable 02). Enabled per connection by
|
|
// sqlite3_extended_result_codes() in Work_Open; err.code carries the
|
|
// extended name and err.primaryCode the primary one.
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ERROR_MISSING_COLLSEQ, ERROR_MISSING_COLLSEQ)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ERROR_RETRY, ERROR_RETRY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ERROR_SNAPSHOT, ERROR_SNAPSHOT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ERROR_RESERVESIZE, ERROR_RESERVESIZE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ERROR_KEY, ERROR_KEY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ERROR_UNABLE, ERROR_UNABLE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_READ, IOERR_READ)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_SHORT_READ, IOERR_SHORT_READ)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_WRITE, IOERR_WRITE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_FSYNC, IOERR_FSYNC)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_DIR_FSYNC, IOERR_DIR_FSYNC)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_TRUNCATE, IOERR_TRUNCATE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_FSTAT, IOERR_FSTAT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_UNLOCK, IOERR_UNLOCK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_RDLOCK, IOERR_RDLOCK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_DELETE, IOERR_DELETE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_BLOCKED, IOERR_BLOCKED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_NOMEM, IOERR_NOMEM)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_ACCESS, IOERR_ACCESS)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_CHECKRESERVEDLOCK, IOERR_CHECKRESERVEDLOCK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_LOCK, IOERR_LOCK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_CLOSE, IOERR_CLOSE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_DIR_CLOSE, IOERR_DIR_CLOSE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_SHMOPEN, IOERR_SHMOPEN)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_SHMSIZE, IOERR_SHMSIZE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_SHMLOCK, IOERR_SHMLOCK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_SHMMAP, IOERR_SHMMAP)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_SEEK, IOERR_SEEK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_DELETE_NOENT, IOERR_DELETE_NOENT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_MMAP, IOERR_MMAP)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_GETTEMPPATH, IOERR_GETTEMPPATH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_CONVPATH, IOERR_CONVPATH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_VNODE, IOERR_VNODE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_AUTH, IOERR_AUTH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_BEGIN_ATOMIC, IOERR_BEGIN_ATOMIC)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_COMMIT_ATOMIC, IOERR_COMMIT_ATOMIC)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_ROLLBACK_ATOMIC, IOERR_ROLLBACK_ATOMIC)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_DATA, IOERR_DATA)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_CORRUPTFS, IOERR_CORRUPTFS)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_IN_PAGE, IOERR_IN_PAGE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_BADKEY, IOERR_BADKEY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IOERR_CODEC, IOERR_CODEC)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LOCKED_SHAREDCACHE, LOCKED_SHAREDCACHE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LOCKED_VTAB, LOCKED_VTAB)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_BUSY_RECOVERY, BUSY_RECOVERY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_BUSY_SNAPSHOT, BUSY_SNAPSHOT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_BUSY_TIMEOUT, BUSY_TIMEOUT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CANTOPEN_NOTEMPDIR, CANTOPEN_NOTEMPDIR)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CANTOPEN_ISDIR, CANTOPEN_ISDIR)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CANTOPEN_FULLPATH, CANTOPEN_FULLPATH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CANTOPEN_CONVPATH, CANTOPEN_CONVPATH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CANTOPEN_DIRTYWAL, CANTOPEN_DIRTYWAL)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CANTOPEN_SYMLINK, CANTOPEN_SYMLINK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CORRUPT_VTAB, CORRUPT_VTAB)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CORRUPT_SEQUENCE, CORRUPT_SEQUENCE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CORRUPT_INDEX, CORRUPT_INDEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_READONLY_RECOVERY, READONLY_RECOVERY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_READONLY_CANTLOCK, READONLY_CANTLOCK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_READONLY_ROLLBACK, READONLY_ROLLBACK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_READONLY_DBMOVED, READONLY_DBMOVED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_READONLY_CANTINIT, READONLY_CANTINIT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_READONLY_DIRECTORY, READONLY_DIRECTORY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ABORT_ROLLBACK, ABORT_ROLLBACK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_CHECK, CONSTRAINT_CHECK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_COMMITHOOK, CONSTRAINT_COMMITHOOK)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_FOREIGNKEY, CONSTRAINT_FOREIGNKEY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_FUNCTION, CONSTRAINT_FUNCTION)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_NOTNULL, CONSTRAINT_NOTNULL)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_PRIMARYKEY, CONSTRAINT_PRIMARYKEY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_TRIGGER, CONSTRAINT_TRIGGER)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_UNIQUE, CONSTRAINT_UNIQUE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_VTAB, CONSTRAINT_VTAB)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_ROWID, CONSTRAINT_ROWID)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_PINNED, CONSTRAINT_PINNED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CONSTRAINT_DATATYPE, CONSTRAINT_DATATYPE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_AUTH_USER, AUTH_USER)
|
|
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_LENGTH, LIMIT_LENGTH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_SQL_LENGTH, LIMIT_SQL_LENGTH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_COLUMN, LIMIT_COLUMN)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_EXPR_DEPTH, LIMIT_EXPR_DEPTH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_COMPOUND_SELECT, LIMIT_COMPOUND_SELECT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_VDBE_OP, LIMIT_VDBE_OP)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_FUNCTION_ARG, LIMIT_FUNCTION_ARG)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_ATTACHED, LIMIT_ATTACHED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_LIKE_PATTERN_LENGTH, LIMIT_LIKE_PATTERN_LENGTH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_VARIABLE_NUMBER, LIMIT_VARIABLE_NUMBER)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_TRIGGER_DEPTH, LIMIT_TRIGGER_DEPTH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_LIMIT_WORKER_THREADS, LIMIT_WORKER_THREADS)
|
|
|
|
// Authorizer action codes and decisions (Deliverable 07). The
|
|
// codes collide numerically with result codes (SQLITE_INSERT is
|
|
// 18) but never under these names; OK is the result-code OK.
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_INDEX, CREATE_INDEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_TABLE, CREATE_TABLE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_TEMP_INDEX, CREATE_TEMP_INDEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_TEMP_TABLE, CREATE_TEMP_TABLE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_TEMP_TRIGGER, CREATE_TEMP_TRIGGER)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_TEMP_VIEW, CREATE_TEMP_VIEW)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_TRIGGER, CREATE_TRIGGER)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_VIEW, CREATE_VIEW)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DELETE, DELETE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_INDEX, DROP_INDEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_TABLE, DROP_TABLE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_TEMP_INDEX, DROP_TEMP_INDEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_TEMP_TABLE, DROP_TEMP_TABLE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_TEMP_TRIGGER, DROP_TEMP_TRIGGER)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_TEMP_VIEW, DROP_TEMP_VIEW)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_TRIGGER, DROP_TRIGGER)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_VIEW, DROP_VIEW)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_INSERT, INSERT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_PRAGMA, PRAGMA)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_READ, READ)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_SELECT, SELECT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_TRANSACTION, TRANSACTION)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_UPDATE, UPDATE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ATTACH, ATTACH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DETACH, DETACH)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ALTER_TABLE, ALTER_TABLE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_REINDEX, REINDEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_ANALYZE, ANALYZE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CREATE_VTABLE, CREATE_VTABLE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DROP_VTABLE, DROP_VTABLE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_FUNCTION, FUNCTION)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_SAVEPOINT, SAVEPOINT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_RECURSIVE, RECURSIVE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DENY, DENY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_IGNORE, IGNORE)
|
|
|
|
// sqlite3_stmt_status counters (Statement#status).
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_STMTSTATUS_FULLSCAN_STEP, STMTSTATUS_FULLSCAN_STEP)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_STMTSTATUS_SORT, STMTSTATUS_SORT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_STMTSTATUS_AUTOINDEX, STMTSTATUS_AUTOINDEX)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_STMTSTATUS_VM_STEP, STMTSTATUS_VM_STEP)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_STMTSTATUS_REPREPARE, STMTSTATUS_REPREPARE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_STMTSTATUS_RUN, STMTSTATUS_RUN)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_STMTSTATUS_FILTER_MISS, STMTSTATUS_FILTER_MISS)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_STMTSTATUS_FILTER_HIT, STMTSTATUS_FILTER_HIT)
|
|
|
|
// sqlite3_db_status counters (db.status). The process-wide memory
|
|
// counters read zero in this build (SQLITE_DEFAULT_MEMSTATUS=0);
|
|
// the cache and schema counters are the useful ones.
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_LOOKASIDE_USED, DBSTATUS_LOOKASIDE_USED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_CACHE_USED, DBSTATUS_CACHE_USED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_SCHEMA_USED, DBSTATUS_SCHEMA_USED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_STMT_USED, DBSTATUS_STMT_USED)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_LOOKASIDE_HIT, DBSTATUS_LOOKASIDE_HIT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE, DBSTATUS_LOOKASIDE_MISS_SIZE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL, DBSTATUS_LOOKASIDE_MISS_FULL)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_CACHE_HIT, DBSTATUS_CACHE_HIT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_CACHE_MISS, DBSTATUS_CACHE_MISS)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_CACHE_WRITE, DBSTATUS_CACHE_WRITE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_CACHE_SPILL, DBSTATUS_CACHE_SPILL)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBSTATUS_DEFERRED_FKS, DBSTATUS_DEFERRED_FKS)
|
|
|
|
// The sqlite3_db_config subset Database#dbConfig exposes.
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBCONFIG_ENABLE_FKEY, DBCONFIG_ENABLE_FKEY)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBCONFIG_ENABLE_TRIGGER, DBCONFIG_ENABLE_TRIGGER)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBCONFIG_ENABLE_VIEW, DBCONFIG_ENABLE_VIEW)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION, DBCONFIG_ENABLE_LOAD_EXTENSION)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBCONFIG_DEFENSIVE, DBCONFIG_DEFENSIVE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBCONFIG_WRITABLE_SCHEMA, DBCONFIG_WRITABLE_SCHEMA)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_DBCONFIG_TRUSTED_SCHEMA, DBCONFIG_TRUSTED_SCHEMA)
|
|
|
|
// sqlite3_wal_checkpoint_v2 modes (Database#checkpoint; the JS
|
|
// layer also accepts the mode as a string).
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHECKPOINT_PASSIVE, CHECKPOINT_PASSIVE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHECKPOINT_FULL, CHECKPOINT_FULL)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHECKPOINT_RESTART, CHECKPOINT_RESTART)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHECKPOINT_TRUNCATE, CHECKPOINT_TRUNCATE)
|
|
|
|
// Changeset conflict-handler decisions (Deliverable 08): what
|
|
// db.applyChangeset does when a change cannot be applied. The
|
|
// conflict codes below describe why the handler fired.
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHANGESET_OMIT, CHANGESET_OMIT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHANGESET_REPLACE, CHANGESET_REPLACE)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHANGESET_ABORT, CHANGESET_ABORT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHANGESET_DATA, CHANGESET_DATA)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHANGESET_NOTFOUND, CHANGESET_NOTFOUND)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHANGESET_CONFLICT, CHANGESET_CONFLICT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHANGESET_CONSTRAINT, CHANGESET_CONSTRAINT)
|
|
DEFINE_CONSTANT_INTEGER(exports, SQLITE_CHANGESET_FOREIGN_KEY, CHANGESET_FOREIGN_KEY)
|
|
});
|
|
|
|
return exports;
|
|
}
|
|
|
|
}
|
|
|
|
// Names of the 26 primary result codes. Used directly and as the
|
|
// code & 0xff fallback for unrecognised extended codes.
|
|
static const char* sqlite_primary_code_string(int code) {
|
|
switch (code) {
|
|
case SQLITE_OK: return "SQLITE_OK";
|
|
case SQLITE_ERROR: return "SQLITE_ERROR";
|
|
case SQLITE_INTERNAL: return "SQLITE_INTERNAL";
|
|
case SQLITE_PERM: return "SQLITE_PERM";
|
|
case SQLITE_ABORT: return "SQLITE_ABORT";
|
|
case SQLITE_BUSY: return "SQLITE_BUSY";
|
|
case SQLITE_LOCKED: return "SQLITE_LOCKED";
|
|
case SQLITE_NOMEM: return "SQLITE_NOMEM";
|
|
case SQLITE_READONLY: return "SQLITE_READONLY";
|
|
case SQLITE_INTERRUPT: return "SQLITE_INTERRUPT";
|
|
case SQLITE_IOERR: return "SQLITE_IOERR";
|
|
case SQLITE_CORRUPT: return "SQLITE_CORRUPT";
|
|
case SQLITE_NOTFOUND: return "SQLITE_NOTFOUND";
|
|
case SQLITE_FULL: return "SQLITE_FULL";
|
|
case SQLITE_CANTOPEN: return "SQLITE_CANTOPEN";
|
|
case SQLITE_PROTOCOL: return "SQLITE_PROTOCOL";
|
|
case SQLITE_EMPTY: return "SQLITE_EMPTY";
|
|
case SQLITE_SCHEMA: return "SQLITE_SCHEMA";
|
|
case SQLITE_TOOBIG: return "SQLITE_TOOBIG";
|
|
case SQLITE_CONSTRAINT: return "SQLITE_CONSTRAINT";
|
|
case SQLITE_MISMATCH: return "SQLITE_MISMATCH";
|
|
case SQLITE_MISUSE: return "SQLITE_MISUSE";
|
|
case SQLITE_NOLFS: return "SQLITE_NOLFS";
|
|
case SQLITE_AUTH: return "SQLITE_AUTH";
|
|
case SQLITE_FORMAT: return "SQLITE_FORMAT";
|
|
case SQLITE_RANGE: return "SQLITE_RANGE";
|
|
case SQLITE_NOTADB: return "SQLITE_NOTADB";
|
|
case SQLITE_ROW: return "SQLITE_ROW";
|
|
case SQLITE_DONE: return "SQLITE_DONE";
|
|
default: return NULL;
|
|
}
|
|
}
|
|
|
|
// Maps a result code — primary or extended — to its SQLite name.
|
|
// Extended result codes are enabled per connection (Work_Open), so step
|
|
// failures report e.g. SQLITE_CONSTRAINT_UNIQUE rather than bare
|
|
// SQLITE_CONSTRAINT. Unknown codes degrade to the primary name of
|
|
// code & 0xff, then to SQLITE_UNKNOWN(<code>).
|
|
std::string sqlite_code_string(int code) {
|
|
switch (code) {
|
|
case SQLITE_ERROR_MISSING_COLLSEQ: return "SQLITE_ERROR_MISSING_COLLSEQ";
|
|
case SQLITE_ERROR_RETRY: return "SQLITE_ERROR_RETRY";
|
|
case SQLITE_ERROR_SNAPSHOT: return "SQLITE_ERROR_SNAPSHOT";
|
|
case SQLITE_ERROR_RESERVESIZE: return "SQLITE_ERROR_RESERVESIZE";
|
|
case SQLITE_ERROR_KEY: return "SQLITE_ERROR_KEY";
|
|
case SQLITE_ERROR_UNABLE: return "SQLITE_ERROR_UNABLE";
|
|
case SQLITE_IOERR_READ: return "SQLITE_IOERR_READ";
|
|
case SQLITE_IOERR_SHORT_READ: return "SQLITE_IOERR_SHORT_READ";
|
|
case SQLITE_IOERR_WRITE: return "SQLITE_IOERR_WRITE";
|
|
case SQLITE_IOERR_FSYNC: return "SQLITE_IOERR_FSYNC";
|
|
case SQLITE_IOERR_DIR_FSYNC: return "SQLITE_IOERR_DIR_FSYNC";
|
|
case SQLITE_IOERR_TRUNCATE: return "SQLITE_IOERR_TRUNCATE";
|
|
case SQLITE_IOERR_FSTAT: return "SQLITE_IOERR_FSTAT";
|
|
case SQLITE_IOERR_UNLOCK: return "SQLITE_IOERR_UNLOCK";
|
|
case SQLITE_IOERR_RDLOCK: return "SQLITE_IOERR_RDLOCK";
|
|
case SQLITE_IOERR_DELETE: return "SQLITE_IOERR_DELETE";
|
|
case SQLITE_IOERR_BLOCKED: return "SQLITE_IOERR_BLOCKED";
|
|
case SQLITE_IOERR_NOMEM: return "SQLITE_IOERR_NOMEM";
|
|
case SQLITE_IOERR_ACCESS: return "SQLITE_IOERR_ACCESS";
|
|
case SQLITE_IOERR_CHECKRESERVEDLOCK: return "SQLITE_IOERR_CHECKRESERVEDLOCK";
|
|
case SQLITE_IOERR_LOCK: return "SQLITE_IOERR_LOCK";
|
|
case SQLITE_IOERR_CLOSE: return "SQLITE_IOERR_CLOSE";
|
|
case SQLITE_IOERR_DIR_CLOSE: return "SQLITE_IOERR_DIR_CLOSE";
|
|
case SQLITE_IOERR_SHMOPEN: return "SQLITE_IOERR_SHMOPEN";
|
|
case SQLITE_IOERR_SHMSIZE: return "SQLITE_IOERR_SHMSIZE";
|
|
case SQLITE_IOERR_SHMLOCK: return "SQLITE_IOERR_SHMLOCK";
|
|
case SQLITE_IOERR_SHMMAP: return "SQLITE_IOERR_SHMMAP";
|
|
case SQLITE_IOERR_SEEK: return "SQLITE_IOERR_SEEK";
|
|
case SQLITE_IOERR_DELETE_NOENT: return "SQLITE_IOERR_DELETE_NOENT";
|
|
case SQLITE_IOERR_MMAP: return "SQLITE_IOERR_MMAP";
|
|
case SQLITE_IOERR_GETTEMPPATH: return "SQLITE_IOERR_GETTEMPPATH";
|
|
case SQLITE_IOERR_CONVPATH: return "SQLITE_IOERR_CONVPATH";
|
|
case SQLITE_IOERR_VNODE: return "SQLITE_IOERR_VNODE";
|
|
case SQLITE_IOERR_AUTH: return "SQLITE_IOERR_AUTH";
|
|
case SQLITE_IOERR_BEGIN_ATOMIC: return "SQLITE_IOERR_BEGIN_ATOMIC";
|
|
case SQLITE_IOERR_COMMIT_ATOMIC: return "SQLITE_IOERR_COMMIT_ATOMIC";
|
|
case SQLITE_IOERR_ROLLBACK_ATOMIC: return "SQLITE_IOERR_ROLLBACK_ATOMIC";
|
|
case SQLITE_IOERR_DATA: return "SQLITE_IOERR_DATA";
|
|
case SQLITE_IOERR_CORRUPTFS: return "SQLITE_IOERR_CORRUPTFS";
|
|
case SQLITE_IOERR_IN_PAGE: return "SQLITE_IOERR_IN_PAGE";
|
|
case SQLITE_IOERR_BADKEY: return "SQLITE_IOERR_BADKEY";
|
|
case SQLITE_IOERR_CODEC: return "SQLITE_IOERR_CODEC";
|
|
case SQLITE_LOCKED_SHAREDCACHE: return "SQLITE_LOCKED_SHAREDCACHE";
|
|
case SQLITE_LOCKED_VTAB: return "SQLITE_LOCKED_VTAB";
|
|
case SQLITE_BUSY_RECOVERY: return "SQLITE_BUSY_RECOVERY";
|
|
case SQLITE_BUSY_SNAPSHOT: return "SQLITE_BUSY_SNAPSHOT";
|
|
case SQLITE_BUSY_TIMEOUT: return "SQLITE_BUSY_TIMEOUT";
|
|
case SQLITE_CANTOPEN_NOTEMPDIR: return "SQLITE_CANTOPEN_NOTEMPDIR";
|
|
case SQLITE_CANTOPEN_ISDIR: return "SQLITE_CANTOPEN_ISDIR";
|
|
case SQLITE_CANTOPEN_FULLPATH: return "SQLITE_CANTOPEN_FULLPATH";
|
|
case SQLITE_CANTOPEN_CONVPATH: return "SQLITE_CANTOPEN_CONVPATH";
|
|
case SQLITE_CANTOPEN_DIRTYWAL: return "SQLITE_CANTOPEN_DIRTYWAL";
|
|
case SQLITE_CANTOPEN_SYMLINK: return "SQLITE_CANTOPEN_SYMLINK";
|
|
case SQLITE_CORRUPT_VTAB: return "SQLITE_CORRUPT_VTAB";
|
|
case SQLITE_CORRUPT_SEQUENCE: return "SQLITE_CORRUPT_SEQUENCE";
|
|
case SQLITE_CORRUPT_INDEX: return "SQLITE_CORRUPT_INDEX";
|
|
case SQLITE_READONLY_RECOVERY: return "SQLITE_READONLY_RECOVERY";
|
|
case SQLITE_READONLY_CANTLOCK: return "SQLITE_READONLY_CANTLOCK";
|
|
case SQLITE_READONLY_ROLLBACK: return "SQLITE_READONLY_ROLLBACK";
|
|
case SQLITE_READONLY_DBMOVED: return "SQLITE_READONLY_DBMOVED";
|
|
case SQLITE_READONLY_CANTINIT: return "SQLITE_READONLY_CANTINIT";
|
|
case SQLITE_READONLY_DIRECTORY: return "SQLITE_READONLY_DIRECTORY";
|
|
case SQLITE_ABORT_ROLLBACK: return "SQLITE_ABORT_ROLLBACK";
|
|
case SQLITE_CONSTRAINT_CHECK: return "SQLITE_CONSTRAINT_CHECK";
|
|
case SQLITE_CONSTRAINT_COMMITHOOK: return "SQLITE_CONSTRAINT_COMMITHOOK";
|
|
case SQLITE_CONSTRAINT_FOREIGNKEY: return "SQLITE_CONSTRAINT_FOREIGNKEY";
|
|
case SQLITE_CONSTRAINT_FUNCTION: return "SQLITE_CONSTRAINT_FUNCTION";
|
|
case SQLITE_CONSTRAINT_NOTNULL: return "SQLITE_CONSTRAINT_NOTNULL";
|
|
case SQLITE_CONSTRAINT_PRIMARYKEY: return "SQLITE_CONSTRAINT_PRIMARYKEY";
|
|
case SQLITE_CONSTRAINT_TRIGGER: return "SQLITE_CONSTRAINT_TRIGGER";
|
|
case SQLITE_CONSTRAINT_UNIQUE: return "SQLITE_CONSTRAINT_UNIQUE";
|
|
case SQLITE_CONSTRAINT_VTAB: return "SQLITE_CONSTRAINT_VTAB";
|
|
case SQLITE_CONSTRAINT_ROWID: return "SQLITE_CONSTRAINT_ROWID";
|
|
case SQLITE_CONSTRAINT_PINNED: return "SQLITE_CONSTRAINT_PINNED";
|
|
case SQLITE_CONSTRAINT_DATATYPE: return "SQLITE_CONSTRAINT_DATATYPE";
|
|
case SQLITE_AUTH_USER: return "SQLITE_AUTH_USER";
|
|
default: break;
|
|
}
|
|
|
|
const char* primary = sqlite_primary_code_string(code & 0xff);
|
|
if (primary != NULL) return std::string(primary);
|
|
return "SQLITE_UNKNOWN(" + std::to_string(code) + ")";
|
|
}
|
|
|
|
const char* sqlite_authorizer_string(int type) {
|
|
switch (type) {
|
|
case SQLITE_INSERT: return "insert";
|
|
case SQLITE_UPDATE: return "update";
|
|
case SQLITE_DELETE: return "delete";
|
|
default: return "";
|
|
}
|
|
}
|
|
|
|
NODE_API_MODULE(node_sqlite3, RegisterModule)
|