From 65d89668df3e322ff38581d0b6bf443c7d57e0fb Mon Sep 17 00:00:00 2001 From: Ferris <3579192+code-ape@users.noreply.github.com> Date: Sun, 31 Dec 2023 15:13:14 -0500 Subject: [PATCH 1/2] Issue #1021: Expose sqlite3 metadata --- lib/database.js | 5 +++ package.json | 2 +- src/better_sqlite3.cpp | 56 ++++++++++++++++++++++++++++++++ src/better_sqlite3.lzz | 56 ++++++++++++++++++++++++++++++++ test/12.database.pragma.js | 6 ++++ test/51.metadata.js | 65 ++++++++++++++++++++++++++++++++++++++ 6 files changed, 189 insertions(+), 1 deletion(-) create mode 100644 test/51.metadata.js diff --git a/lib/database.js b/lib/database.js index 14e057392..5fc717b27 100644 --- a/lib/database.js +++ b/lib/database.js @@ -67,6 +67,11 @@ function Database(filenameGiven, options) { Object.defineProperties(this, { [util.cppdb]: { value: new addon.Database(filename, filenameGiven, anonymous, readonly, fileMustExist, timeout, verbose || null, buffer || null) }, + metadata: { + value: addon.metadata, + writable: false, + enumerable: true, + }, ...wrappers.getters, }); } diff --git a/package.json b/package.json index a2b773f6d..7e7a173fa 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "sqlite3": "^5.1.6" }, "scripts": { - "install": "prebuild-install || node-gyp rebuild --release", + "install": "prebuild-install || npm run build-release", "build-release": "node-gyp rebuild --release", "build-debug": "node-gyp rebuild --debug", "rebuild-release": "npm run lzz && npm run build-release", diff --git a/src/better_sqlite3.cpp b/src/better_sqlite3.cpp index 0fe8ee223..299d7c979 100644 --- a/src/better_sqlite3.cpp +++ b/src/better_sqlite3.cpp @@ -45,6 +45,62 @@ NODE_MODULE_INIT(/* exports, context */) { exports->Set(context, InternalizedFromLatin1(isolate, "Backup"), Backup::Init(isolate, data)).FromJust(); exports->Set(context, InternalizedFromLatin1(isolate, "setErrorConstructor"), v8::FunctionTemplate::New(isolate, Addon::JS_setErrorConstructor, data)->GetFunction(context).ToLocalChecked()).FromJust(); + // Export sqlite3 metadata + v8::Local metadata = v8::Object::New(isolate); + exports->Set(context, InternalizedFromLatin1(isolate, "metadata"), metadata).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_READONLY"), v8::Integer::New(isolate, SQLITE_OPEN_READONLY)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_READWRITE"), v8::Integer::New(isolate, SQLITE_OPEN_READWRITE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_CREATE"), v8::Integer::New(isolate, SQLITE_OPEN_CREATE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_FULLMUTEX"), v8::Integer::New(isolate, SQLITE_OPEN_FULLMUTEX)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_URI"), v8::Integer::New(isolate, SQLITE_OPEN_URI)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_SHAREDCACHE"), v8::Integer::New(isolate, SQLITE_OPEN_SHAREDCACHE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_PRIVATECACHE"), v8::Integer::New(isolate, SQLITE_OPEN_PRIVATECACHE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_VERSION"), v8::String::NewFromUtf8(isolate, SQLITE_VERSION).ToLocalChecked()).FromJust(); + #ifdef SQLITE_SOURCE_ID + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SOURCE_ID"), v8::String::NewFromUtf8(isolate, SQLITE_SOURCE_ID).ToLocalChecked()).FromJust(); + #endif + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_VERSION_NUMBER"), v8::Integer::New(isolate, SQLITE_VERSION_NUMBER)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_READWRITE"), v8::Integer::New(isolate, SQLITE_OPEN_READWRITE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OK"), v8::Integer::New(isolate, SQLITE_OK)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_ERROR"), v8::Integer::New(isolate, SQLITE_ERROR)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_INTERNAL"), v8::Integer::New(isolate, SQLITE_INTERNAL)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_PERM"), v8::Integer::New(isolate, SQLITE_PERM)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_ABORT"), v8::Integer::New(isolate, SQLITE_ABORT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_BUSY"), v8::Integer::New(isolate, SQLITE_BUSY)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LOCKED"), v8::Integer::New(isolate, SQLITE_LOCKED)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_NOMEM"), v8::Integer::New(isolate, SQLITE_NOMEM)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_READONLY"), v8::Integer::New(isolate, SQLITE_READONLY)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_INTERRUPT"), v8::Integer::New(isolate, SQLITE_INTERRUPT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_IOERR"), v8::Integer::New(isolate, SQLITE_IOERR)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_CORRUPT"), v8::Integer::New(isolate, SQLITE_CORRUPT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_NOTFOUND"), v8::Integer::New(isolate, SQLITE_NOTFOUND)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_FULL"), v8::Integer::New(isolate, SQLITE_FULL)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_CANTOPEN"), v8::Integer::New(isolate, SQLITE_CANTOPEN)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_PROTOCOL"), v8::Integer::New(isolate, SQLITE_PROTOCOL)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_EMPTY"), v8::Integer::New(isolate, SQLITE_EMPTY)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCHEMA"), v8::Integer::New(isolate, SQLITE_SCHEMA)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_TOOBIG"), v8::Integer::New(isolate, SQLITE_TOOBIG)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_CONSTRAINT"), v8::Integer::New(isolate, SQLITE_CONSTRAINT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_MISMATCH"), v8::Integer::New(isolate, SQLITE_MISMATCH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_MISUSE"), v8::Integer::New(isolate, SQLITE_MISUSE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_NOLFS"), v8::Integer::New(isolate, SQLITE_NOLFS)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_AUTH"), v8::Integer::New(isolate, SQLITE_AUTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_FORMAT"), v8::Integer::New(isolate, SQLITE_FORMAT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_RANGE"), v8::Integer::New(isolate, SQLITE_RANGE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_NOTADB"), v8::Integer::New(isolate, SQLITE_NOTADB)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_LENGTH"), v8::Integer::New(isolate, SQLITE_LIMIT_LENGTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_SQL_LENGTH"), v8::Integer::New(isolate, SQLITE_LIMIT_SQL_LENGTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_COLUMN"), v8::Integer::New(isolate, SQLITE_LIMIT_COLUMN)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_EXPR_DEPTH"), v8::Integer::New(isolate, SQLITE_LIMIT_EXPR_DEPTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_COMPOUND_SELECT"), v8::Integer::New(isolate, SQLITE_LIMIT_COMPOUND_SELECT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_VDBE_OP"), v8::Integer::New(isolate, SQLITE_LIMIT_VDBE_OP)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_FUNCTION_ARG"), v8::Integer::New(isolate, SQLITE_LIMIT_FUNCTION_ARG)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_ATTACHED"), v8::Integer::New(isolate, SQLITE_LIMIT_ATTACHED)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_LIKE_PATTERN_LENGTH"), v8::Integer::New(isolate, SQLITE_LIMIT_LIKE_PATTERN_LENGTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_VARIABLE_NUMBER"), v8::Integer::New(isolate, SQLITE_LIMIT_VARIABLE_NUMBER)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_TRIGGER_DEPTH"), v8::Integer::New(isolate, SQLITE_LIMIT_TRIGGER_DEPTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_WORKER_THREADS"), v8::Integer::New(isolate, SQLITE_LIMIT_WORKER_THREADS)).FromJust(); + // Store addon instance data. addon->Statement.Reset(isolate, exports->Get(context, InternalizedFromLatin1(isolate, "Statement")).ToLocalChecked().As()); addon->StatementIterator.Reset(isolate, exports->Get(context, InternalizedFromLatin1(isolate, "StatementIterator")).ToLocalChecked().As()); diff --git a/src/better_sqlite3.lzz b/src/better_sqlite3.lzz index aae5d10ab..0ff241b6b 100644 --- a/src/better_sqlite3.lzz +++ b/src/better_sqlite3.lzz @@ -80,6 +80,62 @@ NODE_MODULE_INIT(/* exports, context */) { exports->Set(context, InternalizedFromLatin1(isolate, "Backup"), Backup::Init(isolate, data)).FromJust(); exports->Set(context, InternalizedFromLatin1(isolate, "setErrorConstructor"), v8::FunctionTemplate::New(isolate, Addon::JS_setErrorConstructor, data)->GetFunction(context).ToLocalChecked()).FromJust(); + // Export sqlite3 metadata + v8::Local metadata = v8::Object::New(isolate); + exports->Set(context, InternalizedFromLatin1(isolate, "metadata"), metadata).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_READONLY"), v8::Integer::New(isolate, SQLITE_OPEN_READONLY)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_READWRITE"), v8::Integer::New(isolate, SQLITE_OPEN_READWRITE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_CREATE"), v8::Integer::New(isolate, SQLITE_OPEN_CREATE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_FULLMUTEX"), v8::Integer::New(isolate, SQLITE_OPEN_FULLMUTEX)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_URI"), v8::Integer::New(isolate, SQLITE_OPEN_URI)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_SHAREDCACHE"), v8::Integer::New(isolate, SQLITE_OPEN_SHAREDCACHE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_PRIVATECACHE"), v8::Integer::New(isolate, SQLITE_OPEN_PRIVATECACHE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_VERSION"), v8::String::NewFromUtf8(isolate, SQLITE_VERSION).ToLocalChecked()).FromJust(); + #ifdef SQLITE_SOURCE_ID + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SOURCE_ID"), v8::String::NewFromUtf8(isolate, SQLITE_SOURCE_ID).ToLocalChecked()).FromJust(); + #endif + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_VERSION_NUMBER"), v8::Integer::New(isolate, SQLITE_VERSION_NUMBER)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OPEN_READWRITE"), v8::Integer::New(isolate, SQLITE_OPEN_READWRITE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_OK"), v8::Integer::New(isolate, SQLITE_OK)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_ERROR"), v8::Integer::New(isolate, SQLITE_ERROR)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_INTERNAL"), v8::Integer::New(isolate, SQLITE_INTERNAL)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_PERM"), v8::Integer::New(isolate, SQLITE_PERM)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_ABORT"), v8::Integer::New(isolate, SQLITE_ABORT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_BUSY"), v8::Integer::New(isolate, SQLITE_BUSY)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LOCKED"), v8::Integer::New(isolate, SQLITE_LOCKED)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_NOMEM"), v8::Integer::New(isolate, SQLITE_NOMEM)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_READONLY"), v8::Integer::New(isolate, SQLITE_READONLY)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_INTERRUPT"), v8::Integer::New(isolate, SQLITE_INTERRUPT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_IOERR"), v8::Integer::New(isolate, SQLITE_IOERR)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_CORRUPT"), v8::Integer::New(isolate, SQLITE_CORRUPT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_NOTFOUND"), v8::Integer::New(isolate, SQLITE_NOTFOUND)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_FULL"), v8::Integer::New(isolate, SQLITE_FULL)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_CANTOPEN"), v8::Integer::New(isolate, SQLITE_CANTOPEN)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_PROTOCOL"), v8::Integer::New(isolate, SQLITE_PROTOCOL)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_EMPTY"), v8::Integer::New(isolate, SQLITE_EMPTY)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCHEMA"), v8::Integer::New(isolate, SQLITE_SCHEMA)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_TOOBIG"), v8::Integer::New(isolate, SQLITE_TOOBIG)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_CONSTRAINT"), v8::Integer::New(isolate, SQLITE_CONSTRAINT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_MISMATCH"), v8::Integer::New(isolate, SQLITE_MISMATCH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_MISUSE"), v8::Integer::New(isolate, SQLITE_MISUSE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_NOLFS"), v8::Integer::New(isolate, SQLITE_NOLFS)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_AUTH"), v8::Integer::New(isolate, SQLITE_AUTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_FORMAT"), v8::Integer::New(isolate, SQLITE_FORMAT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_RANGE"), v8::Integer::New(isolate, SQLITE_RANGE)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_NOTADB"), v8::Integer::New(isolate, SQLITE_NOTADB)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_LENGTH"), v8::Integer::New(isolate, SQLITE_LIMIT_LENGTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_SQL_LENGTH"), v8::Integer::New(isolate, SQLITE_LIMIT_SQL_LENGTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_COLUMN"), v8::Integer::New(isolate, SQLITE_LIMIT_COLUMN)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_EXPR_DEPTH"), v8::Integer::New(isolate, SQLITE_LIMIT_EXPR_DEPTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_COMPOUND_SELECT"), v8::Integer::New(isolate, SQLITE_LIMIT_COMPOUND_SELECT)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_VDBE_OP"), v8::Integer::New(isolate, SQLITE_LIMIT_VDBE_OP)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_FUNCTION_ARG"), v8::Integer::New(isolate, SQLITE_LIMIT_FUNCTION_ARG)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_ATTACHED"), v8::Integer::New(isolate, SQLITE_LIMIT_ATTACHED)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_LIKE_PATTERN_LENGTH"), v8::Integer::New(isolate, SQLITE_LIMIT_LIKE_PATTERN_LENGTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_VARIABLE_NUMBER"), v8::Integer::New(isolate, SQLITE_LIMIT_VARIABLE_NUMBER)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_TRIGGER_DEPTH"), v8::Integer::New(isolate, SQLITE_LIMIT_TRIGGER_DEPTH)).FromJust(); + metadata->Set(context, InternalizedFromLatin1(isolate, "SQLITE_LIMIT_WORKER_THREADS"), v8::Integer::New(isolate, SQLITE_LIMIT_WORKER_THREADS)).FromJust(); + // Store addon instance data. addon->Statement.Reset(isolate, exports->Get(context, InternalizedFromLatin1(isolate, "Statement")).ToLocalChecked().As()); addon->StatementIterator.Reset(isolate, exports->Get(context, InternalizedFromLatin1(isolate, "StatementIterator")).ToLocalChecked().As()); diff --git a/test/12.database.pragma.js b/test/12.database.pragma.js index a7e437b3f..a736211b9 100644 --- a/test/12.database.pragma.js +++ b/test/12.database.pragma.js @@ -62,4 +62,10 @@ describe('Database#pragma()', function () { it('should return undefined if no rows exist and simpler results are desired', function () { expect(this.db.pragma('table_info', { simple: true })).to.be.undefined; }); + // Added for issue: https://github.com/WiseLibs/better-sqlite3/issues/1021 + it('should return sqlite3 compile_options', function () { + const compileOptionRows = this.db.pragma('compile_options') + const compileOption = compileOptionRows.map((x) => x.compile_options) + expect(compileOption).to.have.length(57) + }); }); diff --git a/test/51.metadata.js b/test/51.metadata.js new file mode 100644 index 000000000..f84252dee --- /dev/null +++ b/test/51.metadata.js @@ -0,0 +1,65 @@ +'use strict'; +const Database = require('../lib'); + +describe('version', function () { + beforeEach(function () { + this.db = new Database(util.next()); + }); + afterEach(function () { + this.db.close(); + }); + // Added for issue: https://github.com/WiseLibs/better-sqlite3/issues/1021 + it('can get metadata', function () { + expect(this.db.metadata).to.deep.equal({ + SQLITE_ABORT: 4, + SQLITE_AUTH: 23, + SQLITE_BUSY: 5, + SQLITE_CANTOPEN: 14, + SQLITE_CONSTRAINT: 19, + SQLITE_CORRUPT: 11, + SQLITE_EMPTY: 16, + SQLITE_ERROR: 1, + SQLITE_FORMAT: 24, + SQLITE_FULL: 13, + SQLITE_INTERNAL: 2, + SQLITE_INTERRUPT: 9, + SQLITE_IOERR: 10, + SQLITE_LIMIT_ATTACHED: 7, + SQLITE_LIMIT_COLUMN: 2, + SQLITE_LIMIT_COMPOUND_SELECT: 4, + SQLITE_LIMIT_EXPR_DEPTH: 3, + SQLITE_LIMIT_FUNCTION_ARG: 6, + SQLITE_LIMIT_LENGTH: 0, + SQLITE_LIMIT_LIKE_PATTERN_LENGTH: 8, + SQLITE_LIMIT_SQL_LENGTH: 1, + SQLITE_LIMIT_TRIGGER_DEPTH: 10, + SQLITE_LIMIT_VARIABLE_NUMBER: 9, + SQLITE_LIMIT_VDBE_OP: 5, + SQLITE_LIMIT_WORKER_THREADS: 11, + SQLITE_LOCKED: 6, + SQLITE_MISMATCH: 20, + SQLITE_MISUSE: 21, + SQLITE_NOLFS: 22, + SQLITE_NOMEM: 7, + SQLITE_NOTADB: 26, + SQLITE_NOTFOUND: 12, + SQLITE_OK: 0, + SQLITE_OPEN_CREATE: 4, + SQLITE_OPEN_FULLMUTEX: 65536, + SQLITE_OPEN_PRIVATECACHE: 262144, + SQLITE_OPEN_READONLY: 1, + SQLITE_OPEN_READWRITE: 2, + SQLITE_OPEN_SHAREDCACHE: 131072, + SQLITE_OPEN_URI: 64, + SQLITE_PERM: 3, + SQLITE_PROTOCOL: 15, + SQLITE_RANGE: 25, + SQLITE_READONLY: 8, + SQLITE_SCHEMA: 17, + SQLITE_SOURCE_ID: "2023-11-24 11:41:44 ebead0e7230cd33bcec9f95d2183069565b9e709bf745c9b5db65cc0cbf92c0f", + SQLITE_TOOBIG: 18, + SQLITE_VERSION: "3.44.2", + SQLITE_VERSION_NUMBER: 3044002, + }) + }); +}); From 97902f791a285e581de16f194b0683f11ac38ade Mon Sep 17 00:00:00 2001 From: Ferris <3579192+code-ape@users.noreply.github.com> Date: Mon, 1 Jan 2024 11:18:32 -0500 Subject: [PATCH 2/2] Address feedback from @mceachen to update tests as part of deps/download.sh --- deps/download.sh | 3 ++ deps/download_update_tests.sh | 54 +++++++++++++++++++++++++++++++++++ test/51.metadata.js | 53 ++-------------------------------- test/51.metadata.json | 53 ++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 51 deletions(-) create mode 100755 deps/download_update_tests.sh create mode 100644 test/51.metadata.json diff --git a/deps/download.sh b/deps/download.sh index 5c080290a..c39617bff 100755 --- a/deps/download.sh +++ b/deps/download.sh @@ -106,6 +106,9 @@ rm "$DOCS".bak printf "$DEFINES" | sed -e "/^\s*$/d" >> "$DOCS" printf "\`\`\`\n" >> "$DOCS" +# Run the script to update test files +$DEPS/download_update_tests.sh + echo "cleaning up..." cd - > /dev/null || exit 1 rm -rf "$TEMP" diff --git a/deps/download_update_tests.sh b/deps/download_update_tests.sh new file mode 100755 index 000000000..6e7cd8ef7 --- /dev/null +++ b/deps/download_update_tests.sh @@ -0,0 +1,54 @@ +#!/usr/bin/env bash + +set -e + +# This file is meant to be called by deps/download.sh but has been broken out for easy testing. + +# Script scoped variables +TESTS="$(CDPATH= cd -- "$(dirname -- "$0")/../test" && pwd)" +DEPS="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)" + +echo "updating tests ..." + +# Getting variables from sqlite3 source code +echo " getting values from sqlite3 code ..." +SQLITE_VARS="SQLITE_VERSION SQLITE_VERSION_NUMBER SQLITE_SOURCE_ID" +for SQLITE_VAR in $SQLITE_VARS; do + echo " getting $SQLITE_VAR from deps/sqlite3/sqlite3.c ..." + # Matches lines like: + # #define SQLITE_VERSION "3.44.2" + MATCH_STRING="^#define[ \t]+${SQLITE_VAR}[ \t]+\"?([^\"]*)\"?" + # Just print capture group of the value matched + REPLACE_STRING="\1" + # Dynamically initialize variable with given name to be the value + # matched in the sqlite3.c file. + declare $SQLITE_VAR="$(sed -n -E "s|$MATCH_STRING|$REPLACE_STRING|p" \ + "$DEPS/sqlite3/sqlite3.c")" +done + +# Validate all need variables are populated +REQUIRED_VARS="$SQLITE_VARS" +MISSING_VARS="" +for REQUIRED_VAR in $REQUIRED_VARS; do + if [ "${!REQUIRED_VAR}" = "" ]; then + MISSING_VARS="$MISSING_VARS $REQUIRED_VAR" + fi +done +if [ "$MISSING_VARS" != "" ]; then + echo "ERROR! The following required env. vars. are not defined: $MISSING_VARS" + exit 1 +fi + +# Do the file mutation +echo " editing test files ..." +echo " test/51.metadata.json ..." +for SQLITE_VAR in $SQLITE_VARS; do + echo " replacing $SQLITE_VAR with ${!SQLITE_VAR}" + # Matches JSON lines like: + # "SQLITE_VERSION": "3.44.2", + MATCH_STRING="\"$SQLITE_VAR\": (\"?)[^\",]*(\"?)(,?)$" + REPLACE_STRING="\"$SQLITE_VAR\": \1${!SQLITE_VAR}\2\3" + sed -E -i.bak \ + -e "s|$MATCH_STRING|$REPLACE_STRING|g" \ + "$TESTS/51.metadata.json" +done diff --git a/test/51.metadata.js b/test/51.metadata.js index f84252dee..9de7ced2d 100644 --- a/test/51.metadata.js +++ b/test/51.metadata.js @@ -1,5 +1,6 @@ 'use strict'; const Database = require('../lib'); +const snapshotData = require('./51.metadata.json'); describe('version', function () { beforeEach(function () { @@ -10,56 +11,6 @@ describe('version', function () { }); // Added for issue: https://github.com/WiseLibs/better-sqlite3/issues/1021 it('can get metadata', function () { - expect(this.db.metadata).to.deep.equal({ - SQLITE_ABORT: 4, - SQLITE_AUTH: 23, - SQLITE_BUSY: 5, - SQLITE_CANTOPEN: 14, - SQLITE_CONSTRAINT: 19, - SQLITE_CORRUPT: 11, - SQLITE_EMPTY: 16, - SQLITE_ERROR: 1, - SQLITE_FORMAT: 24, - SQLITE_FULL: 13, - SQLITE_INTERNAL: 2, - SQLITE_INTERRUPT: 9, - SQLITE_IOERR: 10, - SQLITE_LIMIT_ATTACHED: 7, - SQLITE_LIMIT_COLUMN: 2, - SQLITE_LIMIT_COMPOUND_SELECT: 4, - SQLITE_LIMIT_EXPR_DEPTH: 3, - SQLITE_LIMIT_FUNCTION_ARG: 6, - SQLITE_LIMIT_LENGTH: 0, - SQLITE_LIMIT_LIKE_PATTERN_LENGTH: 8, - SQLITE_LIMIT_SQL_LENGTH: 1, - SQLITE_LIMIT_TRIGGER_DEPTH: 10, - SQLITE_LIMIT_VARIABLE_NUMBER: 9, - SQLITE_LIMIT_VDBE_OP: 5, - SQLITE_LIMIT_WORKER_THREADS: 11, - SQLITE_LOCKED: 6, - SQLITE_MISMATCH: 20, - SQLITE_MISUSE: 21, - SQLITE_NOLFS: 22, - SQLITE_NOMEM: 7, - SQLITE_NOTADB: 26, - SQLITE_NOTFOUND: 12, - SQLITE_OK: 0, - SQLITE_OPEN_CREATE: 4, - SQLITE_OPEN_FULLMUTEX: 65536, - SQLITE_OPEN_PRIVATECACHE: 262144, - SQLITE_OPEN_READONLY: 1, - SQLITE_OPEN_READWRITE: 2, - SQLITE_OPEN_SHAREDCACHE: 131072, - SQLITE_OPEN_URI: 64, - SQLITE_PERM: 3, - SQLITE_PROTOCOL: 15, - SQLITE_RANGE: 25, - SQLITE_READONLY: 8, - SQLITE_SCHEMA: 17, - SQLITE_SOURCE_ID: "2023-11-24 11:41:44 ebead0e7230cd33bcec9f95d2183069565b9e709bf745c9b5db65cc0cbf92c0f", - SQLITE_TOOBIG: 18, - SQLITE_VERSION: "3.44.2", - SQLITE_VERSION_NUMBER: 3044002, - }) + expect(this.db.metadata).to.deep.equal(snapshotData['it can get metadata']); }); }); diff --git a/test/51.metadata.json b/test/51.metadata.json new file mode 100644 index 000000000..cc643f50f --- /dev/null +++ b/test/51.metadata.json @@ -0,0 +1,53 @@ +{ + "it can get metadata": { + "SQLITE_ABORT": 4, + "SQLITE_AUTH": 23, + "SQLITE_BUSY": 5, + "SQLITE_CANTOPEN": 14, + "SQLITE_CONSTRAINT": 19, + "SQLITE_CORRUPT": 11, + "SQLITE_EMPTY": 16, + "SQLITE_ERROR": 1, + "SQLITE_FORMAT": 24, + "SQLITE_FULL": 13, + "SQLITE_INTERNAL": 2, + "SQLITE_INTERRUPT": 9, + "SQLITE_IOERR": 10, + "SQLITE_LIMIT_ATTACHED": 7, + "SQLITE_LIMIT_COLUMN": 2, + "SQLITE_LIMIT_COMPOUND_SELECT": 4, + "SQLITE_LIMIT_EXPR_DEPTH": 3, + "SQLITE_LIMIT_FUNCTION_ARG": 6, + "SQLITE_LIMIT_LENGTH": 0, + "SQLITE_LIMIT_LIKE_PATTERN_LENGTH": 8, + "SQLITE_LIMIT_SQL_LENGTH": 1, + "SQLITE_LIMIT_TRIGGER_DEPTH": 10, + "SQLITE_LIMIT_VARIABLE_NUMBER": 9, + "SQLITE_LIMIT_VDBE_OP": 5, + "SQLITE_LIMIT_WORKER_THREADS": 11, + "SQLITE_LOCKED": 6, + "SQLITE_MISMATCH": 20, + "SQLITE_MISUSE": 21, + "SQLITE_NOLFS": 22, + "SQLITE_NOMEM": 7, + "SQLITE_NOTADB": 26, + "SQLITE_NOTFOUND": 12, + "SQLITE_OK": 0, + "SQLITE_OPEN_CREATE": 4, + "SQLITE_OPEN_FULLMUTEX": 65536, + "SQLITE_OPEN_PRIVATECACHE": 262144, + "SQLITE_OPEN_READONLY": 1, + "SQLITE_OPEN_READWRITE": 2, + "SQLITE_OPEN_SHAREDCACHE": 131072, + "SQLITE_OPEN_URI": 64, + "SQLITE_PERM": 3, + "SQLITE_PROTOCOL": 15, + "SQLITE_RANGE": 25, + "SQLITE_READONLY": 8, + "SQLITE_SCHEMA": 17, + "SQLITE_SOURCE_ID": "2023-11-24 11:41:44 ebead0e7230cd33bcec9f95d2183069565b9e709bf745c9b5db65cc0cbf92c0f", + "SQLITE_TOOBIG": 18, + "SQLITE_VERSION": "3.44.2", + "SQLITE_VERSION_NUMBER": 3044002 + } +} \ No newline at end of file