@rocicorp/zero-sqlite3 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deps/defines.gypi +1 -0
- package/deps/download.sh +2 -1
- package/deps/sqlite3/shell.c +1171 -512
- package/deps/sqlite3/sqlite3.c +6515 -4034
- package/deps/sqlite3/sqlite3.h +272 -73
- package/deps/sqlite3/sqlite3ext.h +4 -0
- package/lib/database.js +12 -0
- package/lib/index.d.ts +30 -0
- package/package.json +6 -1
- package/src/better_sqlite3.cpp +64 -2
- package/src/better_sqlite3.hpp +3 -1
package/lib/index.d.ts
CHANGED
|
@@ -5,6 +5,17 @@ type VariableArgFunction = (...params: any[]) => unknown;
|
|
|
5
5
|
type ArgumentTypes<F extends VariableArgFunction> = F extends (...args: infer A) => unknown ? A : never;
|
|
6
6
|
type ElementOf<T> = T extends Array<infer E> ? E : T;
|
|
7
7
|
|
|
8
|
+
declare const enum ScanStatOpcode {
|
|
9
|
+
SQLITE_SCANSTAT_NLOOP = 0,
|
|
10
|
+
SQLITE_SCANSTAT_NVISIT = 1,
|
|
11
|
+
SQLITE_SCANSTAT_EST = 2,
|
|
12
|
+
SQLITE_SCANSTAT_NAME = 3,
|
|
13
|
+
SQLITE_SCANSTAT_EXPLAIN = 4,
|
|
14
|
+
SQLITE_SCANSTAT_SELECTID = 5,
|
|
15
|
+
SQLITE_SCANSTAT_PARENTID = 6,
|
|
16
|
+
SQLITE_SCANSTAT_NCYCLE = 7,
|
|
17
|
+
}
|
|
18
|
+
|
|
8
19
|
declare namespace BetterSqlite3 {
|
|
9
20
|
interface Statement<BindParameters extends unknown[], Result = unknown> {
|
|
10
21
|
database: Database;
|
|
@@ -23,6 +34,15 @@ declare namespace BetterSqlite3 {
|
|
|
23
34
|
bind(...params: BindParameters): this;
|
|
24
35
|
columns(): ColumnDefinition[];
|
|
25
36
|
safeIntegers(toggleState?: boolean): this;
|
|
37
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_NAME, resetFlag: number): string | undefined;
|
|
38
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_EXPLAIN, resetFlag: number): string | undefined;
|
|
39
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_NLOOP, resetFlag: number): number | undefined;
|
|
40
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_NVISIT, resetFlag: number): number | undefined;
|
|
41
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_EST, resetFlag: number): number | undefined;
|
|
42
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_SELECTID, resetFlag: number): number | undefined;
|
|
43
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_PARENTID, resetFlag: number): number | undefined;
|
|
44
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode.SQLITE_SCANSTAT_NCYCLE, resetFlag: number): number | undefined;
|
|
45
|
+
scanStatusV2(idx: number, opcode: ScanStatOpcode, resetFlag: number): number | string | undefined;
|
|
26
46
|
}
|
|
27
47
|
|
|
28
48
|
interface ColumnDefinition {
|
|
@@ -89,6 +109,16 @@ declare namespace BetterSqlite3 {
|
|
|
89
109
|
prototype: Database;
|
|
90
110
|
|
|
91
111
|
SqliteError: typeof SqliteError;
|
|
112
|
+
|
|
113
|
+
// scanstatus constants
|
|
114
|
+
SQLITE_SCANSTAT_NLOOP: ScanStatOpcode.SQLITE_SCANSTAT_NLOOP;
|
|
115
|
+
SQLITE_SCANSTAT_NVISIT: ScanStatOpcode.SQLITE_SCANSTAT_NVISIT;
|
|
116
|
+
SQLITE_SCANSTAT_EST: ScanStatOpcode.SQLITE_SCANSTAT_EST;
|
|
117
|
+
SQLITE_SCANSTAT_NAME: ScanStatOpcode.SQLITE_SCANSTAT_NAME;
|
|
118
|
+
SQLITE_SCANSTAT_EXPLAIN: ScanStatOpcode.SQLITE_SCANSTAT_EXPLAIN;
|
|
119
|
+
SQLITE_SCANSTAT_SELECTID: ScanStatOpcode.SQLITE_SCANSTAT_SELECTID;
|
|
120
|
+
SQLITE_SCANSTAT_PARENTID: ScanStatOpcode.SQLITE_SCANSTAT_PARENTID;
|
|
121
|
+
SQLITE_SCANSTAT_NCYCLE: ScanStatOpcode.SQLITE_SCANSTAT_NCYCLE;
|
|
92
122
|
}
|
|
93
123
|
}
|
|
94
124
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rocicorp/zero-sqlite3",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.9",
|
|
4
4
|
"description": "better-sqlite3 on bedrock",
|
|
5
5
|
"homepage": "https://github.com/rocicorp/zero-sqlite3",
|
|
6
6
|
"author": "Rocicorp",
|
|
@@ -24,6 +24,11 @@
|
|
|
24
24
|
"bindings": "^1.5.0",
|
|
25
25
|
"prebuild-install": "^7.1.1"
|
|
26
26
|
},
|
|
27
|
+
"overrides": {
|
|
28
|
+
"prebuild": {
|
|
29
|
+
"node-abi": "4.11.0"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
27
32
|
"devDependencies": {
|
|
28
33
|
"chai": "^4.3.8",
|
|
29
34
|
"cli-color": "^2.0.3",
|
package/src/better_sqlite3.cpp
CHANGED
|
@@ -73,6 +73,17 @@ NODE_MODULE_INIT(/* exports, context */) {
|
|
|
73
73
|
exports->Set(context, InternalizedFromLatin1(isolate, "Backup"), Backup::Init(isolate, data)).FromJust();
|
|
74
74
|
exports->Set(context, InternalizedFromLatin1(isolate, "setErrorConstructor"), v8::FunctionTemplate::New(isolate, Addon::JS_setErrorConstructor, data)->GetFunction(context).ToLocalChecked()).FromJust();
|
|
75
75
|
|
|
76
|
+
// Export SQLITE_SCANSTAT_* constants
|
|
77
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_NLOOP"), v8::Int32::New(isolate, SQLITE_SCANSTAT_NLOOP)).FromJust();
|
|
78
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_NVISIT"), v8::Int32::New(isolate, SQLITE_SCANSTAT_NVISIT)).FromJust();
|
|
79
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_EST"), v8::Int32::New(isolate, SQLITE_SCANSTAT_EST)).FromJust();
|
|
80
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_NAME"), v8::Int32::New(isolate, SQLITE_SCANSTAT_NAME)).FromJust();
|
|
81
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_EXPLAIN"), v8::Int32::New(isolate, SQLITE_SCANSTAT_EXPLAIN)).FromJust();
|
|
82
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_SELECTID"), v8::Int32::New(isolate, SQLITE_SCANSTAT_SELECTID)).FromJust();
|
|
83
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_PARENTID"), v8::Int32::New(isolate, SQLITE_SCANSTAT_PARENTID)).FromJust();
|
|
84
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_NCYCLE"), v8::Int32::New(isolate, SQLITE_SCANSTAT_NCYCLE)).FromJust();
|
|
85
|
+
exports->Set(context, InternalizedFromLatin1(isolate, "SQLITE_SCANSTAT_COMPLEX"), v8::Int32::New(isolate, SQLITE_SCANSTAT_COMPLEX)).FromJust();
|
|
86
|
+
|
|
76
87
|
// Store addon instance data.
|
|
77
88
|
addon->Statement.Reset(isolate, exports->Get(context, InternalizedFromLatin1(isolate, "Statement")).ToLocalChecked().As<v8::Function>());
|
|
78
89
|
addon->StatementIterator.Reset(isolate, exports->Get(context, InternalizedFromLatin1(isolate, "StatementIterator")).ToLocalChecked().As<v8::Function>());
|
|
@@ -773,6 +784,7 @@ v8::Local <v8 :: Function> Statement::Init (v8::Isolate * isolate, v8::Local <v8
|
|
|
773
784
|
SetPrototypeMethod(isolate, data, t, "raw", JS_raw);
|
|
774
785
|
SetPrototypeMethod(isolate, data, t, "safeIntegers", JS_safeIntegers);
|
|
775
786
|
SetPrototypeMethod(isolate, data, t, "columns", JS_columns);
|
|
787
|
+
SetPrototypeMethod(isolate, data, t, "scanStatusV2", JS_scanStatusV2);
|
|
776
788
|
SetPrototypeGetter(isolate, data, t, "busy", JS_busy);
|
|
777
789
|
return t->GetFunction( isolate -> GetCurrentContext ( ) ).ToLocalChecked();
|
|
778
790
|
}
|
|
@@ -1083,9 +1095,59 @@ void Statement::JS_columns (v8::FunctionCallbackInfo <v8 :: Value> const & info)
|
|
|
1083
1095
|
|
|
1084
1096
|
info.GetReturnValue().Set(columns);
|
|
1085
1097
|
}
|
|
1086
|
-
#line
|
|
1098
|
+
#line 322 "./src/objects/statement.lzz"
|
|
1099
|
+
void Statement::JS_scanStatusV2 (v8::FunctionCallbackInfo <v8 :: Value> const & info)
|
|
1100
|
+
#line 322 "./src/objects/statement.lzz"
|
|
1101
|
+
{
|
|
1102
|
+
Statement* stmt = node :: ObjectWrap :: Unwrap <Statement>(info.This());
|
|
1103
|
+
if (!stmt->db->GetState()->open) return ThrowTypeError("The database connection is not open");
|
|
1104
|
+
if (!stmt->alive) return ThrowTypeError("The statement has been finalized and can no longer be used");
|
|
1105
|
+
|
|
1106
|
+
int idx; if (info.Length() < (0 + 1) || !info[0]->IsInt32()) return ThrowTypeError("Expected " "first" " argument to be " "a 32-bit signed integer"); idx = (info[0].As<v8::Int32>()->Value());;
|
|
1107
|
+
int iScanStatusOp; if (info.Length() < (1 + 1) || !info[1]->IsInt32()) return ThrowTypeError("Expected " "second" " argument to be " "a 32-bit signed integer"); iScanStatusOp = (info[1].As<v8::Int32>()->Value());;
|
|
1108
|
+
int flags; if (info.Length() < (2 + 1) || !info[2]->IsInt32()) return ThrowTypeError("Expected " "third" " argument to be " "a 32-bit signed integer"); flags = (info[2].As<v8::Int32>()->Value());;
|
|
1109
|
+
|
|
1110
|
+
v8::Isolate* isolate = info.GetIsolate();;
|
|
1111
|
+
|
|
1112
|
+
// Based on iScanStatusOp, we know what type of output to expect
|
|
1113
|
+
int rc;
|
|
1114
|
+
if (iScanStatusOp == 0 || iScanStatusOp == 1 || iScanStatusOp == 5 || iScanStatusOp == 6 || iScanStatusOp == 7) {
|
|
1115
|
+
// NLOOP, NVISIT, SELECTID, PARENTID, NCYCLE - return sqlite3_int64
|
|
1116
|
+
sqlite3_int64 iOut;
|
|
1117
|
+
rc = sqlite3_stmt_scanstatus_v2(stmt->handle, idx, iScanStatusOp, flags, (void*)&iOut);
|
|
1118
|
+
if (rc == 0) {
|
|
1119
|
+
info.GetReturnValue().Set(stmt->safe_ints
|
|
1120
|
+
? v8::BigInt::New(isolate, iOut).As<v8::Value>()
|
|
1121
|
+
: v8::Number::New(isolate, (double)iOut).As<v8::Value>());
|
|
1122
|
+
return;
|
|
1123
|
+
}
|
|
1124
|
+
} else if (iScanStatusOp == 2) {
|
|
1125
|
+
// EST - return double
|
|
1126
|
+
double dOut;
|
|
1127
|
+
rc = sqlite3_stmt_scanstatus_v2(stmt->handle, idx, iScanStatusOp, flags, (void*)&dOut);
|
|
1128
|
+
if (rc == 0) {
|
|
1129
|
+
info.GetReturnValue().Set(v8::Number::New(isolate, dOut));
|
|
1130
|
+
return;
|
|
1131
|
+
}
|
|
1132
|
+
} else if (iScanStatusOp == 3 || iScanStatusOp == 4) {
|
|
1133
|
+
// NAME, EXPLAIN - return const char*
|
|
1134
|
+
const char* zOut;
|
|
1135
|
+
rc = sqlite3_stmt_scanstatus_v2(stmt->handle, idx, iScanStatusOp, flags, (void*)&zOut);
|
|
1136
|
+
if (rc == 0 && zOut != NULL) {
|
|
1137
|
+
info.GetReturnValue().Set(StringFromUtf8(isolate, zOut, -1));
|
|
1138
|
+
return;
|
|
1139
|
+
} else if (rc == 0) {
|
|
1140
|
+
info.GetReturnValue().Set(v8::Null(isolate));
|
|
1141
|
+
return;
|
|
1142
|
+
}
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
// Error or invalid operation - return undefined
|
|
1146
|
+
info.GetReturnValue().Set(v8::Undefined(isolate));
|
|
1147
|
+
}
|
|
1148
|
+
#line 370 "./src/objects/statement.lzz"
|
|
1087
1149
|
void Statement::JS_busy (v8::Local <v8 :: Name> _, v8::PropertyCallbackInfo <v8 :: Value> const & info)
|
|
1088
|
-
#line
|
|
1150
|
+
#line 370 "./src/objects/statement.lzz"
|
|
1089
1151
|
{
|
|
1090
1152
|
Statement* stmt = node :: ObjectWrap :: Unwrap <Statement>(info.This());
|
|
1091
1153
|
info.GetReturnValue().Set(stmt->alive && stmt->locked);
|
package/src/better_sqlite3.hpp
CHANGED
|
@@ -362,7 +362,9 @@ private:
|
|
|
362
362
|
static void JS_safeIntegers (v8::FunctionCallbackInfo <v8 :: Value> const & info);
|
|
363
363
|
#line 278 "./src/objects/statement.lzz"
|
|
364
364
|
static void JS_columns (v8::FunctionCallbackInfo <v8 :: Value> const & info);
|
|
365
|
-
#line
|
|
365
|
+
#line 322 "./src/objects/statement.lzz"
|
|
366
|
+
static void JS_scanStatusV2 (v8::FunctionCallbackInfo <v8 :: Value> const & info);
|
|
367
|
+
#line 370 "./src/objects/statement.lzz"
|
|
366
368
|
static void JS_busy (v8::Local <v8 :: Name> _, v8::PropertyCallbackInfo <v8 :: Value> const & info);
|
|
367
369
|
#line 326 "./src/objects/statement.lzz"
|
|
368
370
|
Database * const db;
|