@peerbit/indexer-sqlite3 1.0.6 → 1.0.7-a3e5123
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/dist/peerbit/sqlite3-bundler-friendly.mjs +19 -10
- package/dist/peerbit/sqlite3-node.mjs +7 -7
- package/dist/peerbit/sqlite3-opfs-async-proxy.js +14 -147
- package/dist/peerbit/sqlite3.js +19 -10
- package/dist/peerbit/sqlite3.min.js +551 -629
- package/dist/peerbit/sqlite3.mjs +19 -10
- package/dist/peerbit/sqlite3.wasm +0 -0
- package/dist/peerbit/sqlite3.worker.min.js +38 -26
- package/dist/src/engine.d.ts +10 -20
- package/dist/src/engine.d.ts.map +1 -1
- package/dist/src/engine.js +104 -87
- package/dist/src/engine.js.map +1 -1
- package/dist/src/schema.d.ts +21 -8
- package/dist/src/schema.d.ts.map +1 -1
- package/dist/src/schema.js +141 -62
- package/dist/src/schema.js.map +1 -1
- package/dist/src/sqlite3.browser.d.ts.map +1 -1
- package/dist/src/sqlite3.browser.js +11 -1
- package/dist/src/sqlite3.browser.js.map +1 -1
- package/dist/src/sqlite3.d.ts.map +1 -1
- package/dist/src/sqlite3.js +19 -2
- package/dist/src/sqlite3.js.map +1 -1
- package/dist/src/sqlite3.wasm.d.ts +5 -5
- package/dist/src/sqlite3.wasm.d.ts.map +1 -1
- package/dist/src/sqlite3.wasm.js +9 -3
- package/dist/src/sqlite3.wasm.js.map +1 -1
- package/dist/src/types.d.ts +5 -1
- package/dist/src/types.d.ts.map +1 -1
- package/package.json +78 -78
- package/src/engine.ts +165 -151
- package/src/schema.ts +206 -92
- package/src/sqlite3.browser.ts +15 -2
- package/src/sqlite3.ts +22 -2
- package/src/sqlite3.wasm.ts +19 -12
- package/src/types.ts +6 -1
package/dist/peerbit/sqlite3.mjs
CHANGED
|
@@ -26,9 +26,9 @@
|
|
|
26
26
|
/*
|
|
27
27
|
** This code was built from sqlite3 version...
|
|
28
28
|
**
|
|
29
|
-
** SQLITE_VERSION "3.46.
|
|
30
|
-
** SQLITE_VERSION_NUMBER
|
|
31
|
-
** SQLITE_SOURCE_ID "2024-
|
|
29
|
+
** SQLITE_VERSION "3.46.1"
|
|
30
|
+
** SQLITE_VERSION_NUMBER 3046001
|
|
31
|
+
** SQLITE_SOURCE_ID "2024-08-13 09:16:08 c9c2ab54ba1f5f46360f1b4f35d849cd3f080e6fc2b6c60e91b16c63f69a1e33"
|
|
32
32
|
**
|
|
33
33
|
** Using the Emscripten SDK version 3.1.30.
|
|
34
34
|
*/
|
|
@@ -10689,11 +10689,11 @@ var sqlite3InitModule = (() => {
|
|
|
10689
10689
|
|
|
10690
10690
|
globalThis.sqlite3ApiBootstrap.initializers.push(function (sqlite3) {
|
|
10691
10691
|
sqlite3.version = {
|
|
10692
|
-
libVersion: '3.46.
|
|
10693
|
-
libVersionNumber:
|
|
10692
|
+
libVersion: '3.46.1',
|
|
10693
|
+
libVersionNumber: 3046001,
|
|
10694
10694
|
sourceId:
|
|
10695
|
-
'2024-
|
|
10696
|
-
downloadVersion:
|
|
10695
|
+
'2024-08-13 09:16:08 c9c2ab54ba1f5f46360f1b4f35d849cd3f080e6fc2b6c60e91b16c63f69a1e33',
|
|
10696
|
+
downloadVersion: 3460100,
|
|
10697
10697
|
};
|
|
10698
10698
|
});
|
|
10699
10699
|
|
|
@@ -12644,6 +12644,7 @@ var sqlite3InitModule = (() => {
|
|
|
12644
12644
|
'SQLITE_ACCESS_EXISTS',
|
|
12645
12645
|
'SQLITE_ACCESS_READWRITE',
|
|
12646
12646
|
'SQLITE_BUSY',
|
|
12647
|
+
'SQLITE_CANTOPEN',
|
|
12647
12648
|
'SQLITE_ERROR',
|
|
12648
12649
|
'SQLITE_IOERR',
|
|
12649
12650
|
'SQLITE_IOERR_ACCESS',
|
|
@@ -12688,7 +12689,11 @@ var sqlite3InitModule = (() => {
|
|
|
12688
12689
|
Atomics.store(state.sabOPView, state.opIds.whichOp, opNdx);
|
|
12689
12690
|
Atomics.notify(state.sabOPView, state.opIds.whichOp);
|
|
12690
12691
|
const t = performance.now();
|
|
12691
|
-
|
|
12692
|
+
while (
|
|
12693
|
+
'not-equal' !==
|
|
12694
|
+
Atomics.wait(state.sabOPView, state.opIds.rc, -1)
|
|
12695
|
+
) {}
|
|
12696
|
+
|
|
12692
12697
|
const rc = Atomics.load(state.sabOPView, state.opIds.rc);
|
|
12693
12698
|
metrics[op].wait += performance.now() - t;
|
|
12694
12699
|
if (rc && state.asyncS11nExceptions) {
|
|
@@ -12870,8 +12875,12 @@ var sqlite3InitModule = (() => {
|
|
|
12870
12875
|
|
|
12871
12876
|
const ioSyncWrappers = {
|
|
12872
12877
|
xCheckReservedLock: function (pFile, pOut) {
|
|
12873
|
-
|
|
12874
|
-
|
|
12878
|
+
if (1) {
|
|
12879
|
+
wasm.poke(pOut, 0, 'i32');
|
|
12880
|
+
} else {
|
|
12881
|
+
const f = __openFiles[pFile];
|
|
12882
|
+
wasm.poke(pOut, f.lockType ? 1 : 0, 'i32');
|
|
12883
|
+
}
|
|
12875
12884
|
return 0;
|
|
12876
12885
|
},
|
|
12877
12886
|
xClose: function (pFile) {
|
|
Binary file
|
|
@@ -5551,9 +5551,6 @@ var PROTOTYPE_DEPENDENCY_HANDLER_OFFSET = PROTOTYPE_DESERIALIZATION_HANDLER_OFFS
|
|
|
5551
5551
|
var PROTOTYPE_SCHEMA_OFFSET = PROTOTYPE_DESERIALIZATION_HANDLER_OFFSET + PROTOTYPE_POLLUTION_CONTEXT_RANGE * 2;
|
|
5552
5552
|
var MAX_ARRAY_SIZE_ALLOCATION = 1024 * 1024;
|
|
5553
5553
|
|
|
5554
|
-
// ../../crypto/dist/src/utils.js
|
|
5555
|
-
var import_libsodium_wrappers = __toESM(require_libsodium_wrappers(), 1);
|
|
5556
|
-
|
|
5557
5554
|
// ../../../../node_modules/multiformats/dist/src/bytes.js
|
|
5558
5555
|
var empty = new Uint8Array(0);
|
|
5559
5556
|
function coerce(o) {
|
|
@@ -5729,10 +5726,11 @@ var Decoder = class {
|
|
|
5729
5726
|
constructor(name, prefix, baseDecode) {
|
|
5730
5727
|
this.name = name;
|
|
5731
5728
|
this.prefix = prefix;
|
|
5732
|
-
|
|
5729
|
+
const prefixCodePoint = prefix.codePointAt(0);
|
|
5730
|
+
if (prefixCodePoint === void 0) {
|
|
5733
5731
|
throw new Error("Invalid prefix character");
|
|
5734
5732
|
}
|
|
5735
|
-
this.prefixCodePoint =
|
|
5733
|
+
this.prefixCodePoint = prefixCodePoint;
|
|
5736
5734
|
this.baseDecode = baseDecode;
|
|
5737
5735
|
}
|
|
5738
5736
|
decode(text) {
|
|
@@ -5821,6 +5819,7 @@ var base58flickr = baseX({
|
|
|
5821
5819
|
});
|
|
5822
5820
|
|
|
5823
5821
|
// ../../crypto/dist/src/utils.js
|
|
5822
|
+
var import_libsodium_wrappers = __toESM(require_libsodium_wrappers(), 1);
|
|
5824
5823
|
var fromBase64 = (base64) => {
|
|
5825
5824
|
return import_libsodium_wrappers.default.from_base64(base64, import_libsodium_wrappers.default.base64_variants.ORIGINAL);
|
|
5826
5825
|
};
|
|
@@ -14354,10 +14353,10 @@ var sqlite3InitModule = (() => {
|
|
|
14354
14353
|
});
|
|
14355
14354
|
globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite32) {
|
|
14356
14355
|
sqlite32.version = {
|
|
14357
|
-
libVersion: "3.46.
|
|
14358
|
-
libVersionNumber:
|
|
14359
|
-
sourceId: "2024-
|
|
14360
|
-
downloadVersion:
|
|
14356
|
+
libVersion: "3.46.1",
|
|
14357
|
+
libVersionNumber: 3046001,
|
|
14358
|
+
sourceId: "2024-08-13 09:16:08 c9c2ab54ba1f5f46360f1b4f35d849cd3f080e6fc2b6c60e91b16c63f69a1e33",
|
|
14359
|
+
downloadVersion: 3460100
|
|
14361
14360
|
};
|
|
14362
14361
|
});
|
|
14363
14362
|
globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite32) {
|
|
@@ -16018,6 +16017,7 @@ var sqlite3InitModule = (() => {
|
|
|
16018
16017
|
"SQLITE_ACCESS_EXISTS",
|
|
16019
16018
|
"SQLITE_ACCESS_READWRITE",
|
|
16020
16019
|
"SQLITE_BUSY",
|
|
16020
|
+
"SQLITE_CANTOPEN",
|
|
16021
16021
|
"SQLITE_ERROR",
|
|
16022
16022
|
"SQLITE_IOERR",
|
|
16023
16023
|
"SQLITE_IOERR_ACCESS",
|
|
@@ -16059,7 +16059,8 @@ var sqlite3InitModule = (() => {
|
|
|
16059
16059
|
Atomics.store(state.sabOPView, state.opIds.whichOp, opNdx);
|
|
16060
16060
|
Atomics.notify(state.sabOPView, state.opIds.whichOp);
|
|
16061
16061
|
const t = performance.now();
|
|
16062
|
-
Atomics.wait(state.sabOPView, state.opIds.rc, -1)
|
|
16062
|
+
while ("not-equal" !== Atomics.wait(state.sabOPView, state.opIds.rc, -1)) {
|
|
16063
|
+
}
|
|
16063
16064
|
const rc = Atomics.load(state.sabOPView, state.opIds.rc);
|
|
16064
16065
|
metrics[op].wait += performance.now() - t;
|
|
16065
16066
|
if (rc && state.asyncS11nExceptions) {
|
|
@@ -16217,8 +16218,12 @@ var sqlite3InitModule = (() => {
|
|
|
16217
16218
|
const mTimeEnd = () => metrics[opTimer.op].time += performance.now() - opTimer.start;
|
|
16218
16219
|
const ioSyncWrappers = {
|
|
16219
16220
|
xCheckReservedLock: function(pFile, pOut) {
|
|
16220
|
-
|
|
16221
|
-
|
|
16221
|
+
if (1) {
|
|
16222
|
+
wasm.poke(pOut, 0, "i32");
|
|
16223
|
+
} else {
|
|
16224
|
+
const f = __openFiles[pFile];
|
|
16225
|
+
wasm.poke(pOut, f.lockType ? 1 : 0, "i32");
|
|
16226
|
+
}
|
|
16222
16227
|
return 0;
|
|
16223
16228
|
},
|
|
16224
16229
|
xClose: function(pFile) {
|
|
@@ -17804,6 +17809,16 @@ var sqlite3_worker1_promiser_default = sqlite3Worker1Promiser.v2;
|
|
|
17804
17809
|
var sqlite3Worker1Promiser2 = self.sqlite3Worker1Promiser;
|
|
17805
17810
|
var sqlite_wasm_default = sqlite3_bundler_friendly_default;
|
|
17806
17811
|
|
|
17812
|
+
// ../../../../node_modules/uuid/dist/esm-browser/stringify.js
|
|
17813
|
+
var byteToHex = [];
|
|
17814
|
+
for (i = 0; i < 256; ++i) {
|
|
17815
|
+
byteToHex.push((i + 256).toString(16).slice(1));
|
|
17816
|
+
}
|
|
17817
|
+
var i;
|
|
17818
|
+
function unsafeStringify(arr, offset = 0) {
|
|
17819
|
+
return (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase();
|
|
17820
|
+
}
|
|
17821
|
+
|
|
17807
17822
|
// ../../../../node_modules/uuid/dist/esm-browser/rng.js
|
|
17808
17823
|
var getRandomValues;
|
|
17809
17824
|
var rnds8 = new Uint8Array(16);
|
|
@@ -17817,15 +17832,6 @@ function rng() {
|
|
|
17817
17832
|
return getRandomValues(rnds8);
|
|
17818
17833
|
}
|
|
17819
17834
|
|
|
17820
|
-
// ../../../../node_modules/uuid/dist/esm-browser/stringify.js
|
|
17821
|
-
var byteToHex = [];
|
|
17822
|
-
for (let i = 0; i < 256; ++i) {
|
|
17823
|
-
byteToHex.push((i + 256).toString(16).slice(1));
|
|
17824
|
-
}
|
|
17825
|
-
function unsafeStringify(arr, offset = 0) {
|
|
17826
|
-
return byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + "-" + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + "-" + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + "-" + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + "-" + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]];
|
|
17827
|
-
}
|
|
17828
|
-
|
|
17829
17835
|
// ../../../../node_modules/uuid/dist/esm-browser/native.js
|
|
17830
17836
|
var randomUUID = typeof crypto !== "undefined" && crypto.randomUUID && crypto.randomUUID.bind(crypto);
|
|
17831
17837
|
var native_default = {
|
|
@@ -17838,12 +17844,12 @@ function v4(options, buf, offset) {
|
|
|
17838
17844
|
return native_default.randomUUID();
|
|
17839
17845
|
}
|
|
17840
17846
|
options = options || {};
|
|
17841
|
-
|
|
17847
|
+
var rnds = options.random || (options.rng || rng)();
|
|
17842
17848
|
rnds[6] = rnds[6] & 15 | 64;
|
|
17843
17849
|
rnds[8] = rnds[8] & 63 | 128;
|
|
17844
17850
|
if (buf) {
|
|
17845
17851
|
offset = offset || 0;
|
|
17846
|
-
for (
|
|
17852
|
+
for (var i = 0; i < 16; ++i) {
|
|
17847
17853
|
buf[offset + i] = rnds[i];
|
|
17848
17854
|
}
|
|
17849
17855
|
return buf;
|
|
@@ -17863,12 +17869,13 @@ var Statement = class {
|
|
|
17863
17869
|
return this;
|
|
17864
17870
|
}
|
|
17865
17871
|
async finalize() {
|
|
17866
|
-
|
|
17872
|
+
const out = await this.statement.finalize();
|
|
17873
|
+
if (out != null && out > 0) {
|
|
17867
17874
|
throw new Error("Error finalizing statement");
|
|
17868
17875
|
}
|
|
17869
17876
|
}
|
|
17870
17877
|
get(values) {
|
|
17871
|
-
if (values) {
|
|
17878
|
+
if (values && values?.length > 0) {
|
|
17872
17879
|
this.statement.bind(values);
|
|
17873
17880
|
}
|
|
17874
17881
|
let step = this.statement.step();
|
|
@@ -17942,10 +17949,15 @@ var create = async (directory) => {
|
|
|
17942
17949
|
return sqliteDb.exec(sql);
|
|
17943
17950
|
},
|
|
17944
17951
|
open,
|
|
17945
|
-
prepare: (sql, id) => {
|
|
17952
|
+
prepare: async (sql, id) => {
|
|
17946
17953
|
if (id == null) {
|
|
17947
17954
|
id = v4_default();
|
|
17948
17955
|
}
|
|
17956
|
+
let prev = statements.get(id);
|
|
17957
|
+
if (prev) {
|
|
17958
|
+
await prev.reset();
|
|
17959
|
+
return prev;
|
|
17960
|
+
}
|
|
17949
17961
|
const statement = sqliteDb.prepare(sql);
|
|
17950
17962
|
const wrappedStatement = new Statement(statement, id);
|
|
17951
17963
|
statements.set(id, wrappedStatement);
|
package/dist/src/engine.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { type AbstractType } from "@dao-xyz/borsh";
|
|
2
|
-
import type {
|
|
2
|
+
import type { Index, IndexEngineInitProperties, IndexedResult, Shape } from "@peerbit/indexer-interface";
|
|
3
3
|
import * as types from "@peerbit/indexer-interface";
|
|
4
4
|
import { type Table } from "./schema.js";
|
|
5
|
-
import type { Database
|
|
5
|
+
import type { Database } from "./types.js";
|
|
6
6
|
export declare class SQLLiteIndex<T extends Record<string, any>> implements Index<T, any> {
|
|
7
7
|
readonly properties: {
|
|
8
8
|
scope: string[];
|
|
@@ -13,9 +13,6 @@ export declare class SQLLiteIndex<T extends Record<string, any>> implements Inde
|
|
|
13
13
|
};
|
|
14
14
|
primaryKeyArr: string[];
|
|
15
15
|
primaryKeyString: string;
|
|
16
|
-
putStatement: Map<string, Statement>;
|
|
17
|
-
replaceStatement: Map<string, Statement>;
|
|
18
|
-
resolveChildrenStatement: Map<string, Statement>;
|
|
19
16
|
private scopeString?;
|
|
20
17
|
private _rootTables;
|
|
21
18
|
private _tables;
|
|
@@ -35,12 +32,7 @@ export declare class SQLLiteIndex<T extends Record<string, any>> implements Inde
|
|
|
35
32
|
get tables(): Map<string, Table>;
|
|
36
33
|
get rootTables(): Table[];
|
|
37
34
|
get cursor(): Map<string, {
|
|
38
|
-
|
|
39
|
-
fetch: (amount: number) => Promise<{
|
|
40
|
-
results: IndexedResult[];
|
|
41
|
-
kept: number;
|
|
42
|
-
}>;
|
|
43
|
-
fetchStatement: Statement;
|
|
35
|
+
fetch: (amount: number) => Promise<IndexedResult[]>;
|
|
44
36
|
timeout: ReturnType<typeof setTimeout>;
|
|
45
37
|
}>;
|
|
46
38
|
init(properties: IndexEngineInitProperties<T, any>): this;
|
|
@@ -53,17 +45,15 @@ export declare class SQLLiteIndex<T extends Record<string, any>> implements Inde
|
|
|
53
45
|
shape: Shape;
|
|
54
46
|
}): Promise<IndexedResult<T> | undefined>;
|
|
55
47
|
put(value: T, _id?: any): Promise<void>;
|
|
56
|
-
|
|
57
|
-
shape
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
close(query: CloseIteratorRequest): void | Promise<void>;
|
|
48
|
+
iterate<S extends Shape | undefined>(request?: types.IterateOptions, options?: {
|
|
49
|
+
shape?: S;
|
|
50
|
+
reference?: boolean;
|
|
51
|
+
}): types.IndexIterator<T, S>;
|
|
61
52
|
private clearupIterator;
|
|
62
53
|
getSize(): Promise<number>;
|
|
63
|
-
del(query: types.
|
|
64
|
-
sum(query: types.
|
|
65
|
-
count(request
|
|
66
|
-
getPending(cursorId: string): number | undefined;
|
|
54
|
+
del(query: types.DeleteOptions): Promise<types.IdKey[]>;
|
|
55
|
+
sum(query: types.SumOptions): Promise<number | bigint>;
|
|
56
|
+
count(request?: types.CountOptions): Promise<number>;
|
|
67
57
|
get cursorCount(): number;
|
|
68
58
|
}
|
|
69
59
|
export declare class SQLiteIndices implements types.Indices {
|
package/dist/src/engine.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAA+B,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EACX,
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,YAAY,EAA+B,MAAM,gBAAgB,CAAC;AAChF,OAAO,KAAK,EACX,KAAK,EACL,yBAAyB,EACzB,aAAa,EACb,KAAK,EACL,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,KAAK,MAAM,4BAA4B,CAAC;AAEpD,OAAO,EAEN,KAAK,KAAK,EAiBV,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,QAAQ,EAAa,MAAM,YAAY,CAAC;AAWtD,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CACtD,YAAW,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;IAqBvB,QAAQ,CAAC,UAAU,EAAE;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,EAAE,EAAE,QAAQ,CAAC;QACb,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAClC;IAzBF,aAAa,EAAG,MAAM,EAAE,CAAC;IACzB,gBAAgB,EAAG,MAAM,CAAC;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAW;IAC9B,OAAO,CAAC,OAAO,CAAsB;IACrC,OAAO,CAAC,OAAO,CAOb;IAEF,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,OAAO,CAAQ;IAEvB,EAAE,EAAE,MAAM,CAAC;gBAED,UAAU,EAAE;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;QAChB,EAAE,EAAE,QAAQ,CAAC;QACb,MAAM,EAAE,YAAY,CAAC,GAAG,CAAC,CAAC;QAC1B,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QACnC,IAAI,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;KAClC,EACD,OAAO,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE;IAWvC,IAAI,MAAM,uBAKT;IAED,IAAI,UAAU,YAKb;IAED,IAAI,MAAM;eA3CD,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,EAAE,CAAC;iBAE1C,UAAU,CAAC,OAAO,UAAU,CAAC;OA8CvC;IAED,IAAI,CAAC,UAAU,EAAE,yBAAyB,CAAC,CAAC,EAAE,GAAG,CAAC;IA0B5C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAkEd,eAAe;IAOvB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAerB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAkBb,mBAAmB;IAW3B,GAAG,CACR,EAAE,EAAE,KAAK,CAAC,KAAK,EACf,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,KAAK,CAAA;KAAE,GACxB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IA2BlC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;IA8C7C,OAAO,CAAC,CAAC,SAAS,KAAK,GAAG,SAAS,EAClC,OAAO,CAAC,EAAE,KAAK,CAAC,cAAc,EAC9B,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,CAAC,CAAC;QAAC,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE,GAC1C,KAAK,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC;YAgJd,eAAe;IAWvB,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAY1B,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IAoCvD,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IA+CtD,KAAK,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAiC1D,IAAI,WAAW,IAAI,MAAM,CAExB;CACD;AAED,qBAAa,aAAc,YAAW,KAAK,CAAC,OAAO;IAOjD,QAAQ,CAAC,UAAU,EAAE;QACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,EAAE,EAAE,QAAQ,CAAC;QACb,MAAM,CAAC,EAAE,aAAa,CAAC;KACvB;IAVF,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,MAAM,CAA6B;IAC3C,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,MAAM,CAAQ;gBAGZ,UAAU,EAAE;QACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;QACjB,EAAE,EAAE,QAAQ,CAAC;QACb,MAAM,CAAC,EAAE,aAAa,CAAC;KACvB;IAOI,IAAI,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,UAAU,EACnD,UAAU,EAAE,yBAAyB,CAAC,CAAC,EAAE,UAAU,CAAC,GAClD,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;IAoB1B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC;IAgB3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IActB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAerB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;CAW3B"}
|
package/dist/src/engine.js
CHANGED
|
@@ -7,13 +7,13 @@ convertSumRequestToQuery, escapeColumnName, generateSelectQuery, getInlineTableF
|
|
|
7
7
|
const escapePathToSQLName = (path) => {
|
|
8
8
|
return path.map((x) => x.replace(/[^a-zA-Z0-9]/g, "_"));
|
|
9
9
|
};
|
|
10
|
+
const putStatementKey = (table) => table.name + "_put";
|
|
11
|
+
const replaceStatementKey = (table) => table.name + "_replicate";
|
|
12
|
+
const resolveChildrenStatement = (table) => table.name + "_resolve_children";
|
|
10
13
|
export class SQLLiteIndex {
|
|
11
14
|
properties;
|
|
12
15
|
primaryKeyArr;
|
|
13
16
|
primaryKeyString;
|
|
14
|
-
putStatement;
|
|
15
|
-
replaceStatement;
|
|
16
|
-
resolveChildrenStatement;
|
|
17
17
|
scopeString;
|
|
18
18
|
_rootTables;
|
|
19
19
|
_tables;
|
|
@@ -76,9 +76,6 @@ export class SQLLiteIndex {
|
|
|
76
76
|
throw new Error("Not initialized");
|
|
77
77
|
}
|
|
78
78
|
await this.properties.start?.();
|
|
79
|
-
this.putStatement = new Map();
|
|
80
|
-
this.replaceStatement = new Map();
|
|
81
|
-
this.resolveChildrenStatement = new Map();
|
|
82
79
|
this._tables = new Map();
|
|
83
80
|
this._cursor = new Map();
|
|
84
81
|
const tables = getSQLTable(this.properties.schema, this.scopeString ? [this.scopeString] : [], getInlineTableFieldName(this.primaryKeyArr), // TODO fix this, should be array
|
|
@@ -103,10 +100,10 @@ export class SQLLiteIndex {
|
|
|
103
100
|
let sqlPut = `insert into ${table.name} (${table.fields.map((field) => escapeColumnName(field.name)).join(", ")}) VALUES (${table.fields.map((_x) => "?").join(", ")}) RETURNING ${table.primary};`;
|
|
104
101
|
// insert or replace with id already defined
|
|
105
102
|
let sqlReplace = `insert or replace into ${table.name} (${table.fields.map((field) => escapeColumnName(field.name)).join(", ")}) VALUES (${table.fields.map((_x) => "?").join(", ")});`;
|
|
106
|
-
|
|
107
|
-
|
|
103
|
+
await this.properties.db.prepare(sqlPut, putStatementKey(table));
|
|
104
|
+
await this.properties.db.prepare(sqlReplace, replaceStatementKey(table));
|
|
108
105
|
if (table.parent) {
|
|
109
|
-
|
|
106
|
+
await this.properties.db.prepare(selectChildren(table), resolveChildrenStatement(table));
|
|
110
107
|
}
|
|
111
108
|
}
|
|
112
109
|
this.closed = false;
|
|
@@ -116,18 +113,6 @@ export class SQLLiteIndex {
|
|
|
116
113
|
// TODO this should never be true, but if we remove this statement the tests faiL for browser tests?
|
|
117
114
|
return;
|
|
118
115
|
}
|
|
119
|
-
for (const [_k, v] of this.putStatement) {
|
|
120
|
-
await v.finalize?.();
|
|
121
|
-
}
|
|
122
|
-
for (const [_k, v] of this.replaceStatement) {
|
|
123
|
-
await v.finalize?.();
|
|
124
|
-
}
|
|
125
|
-
for (const [_k, v] of this.resolveChildrenStatement) {
|
|
126
|
-
await v.finalize?.();
|
|
127
|
-
}
|
|
128
|
-
this.putStatement.clear();
|
|
129
|
-
this.replaceStatement.clear();
|
|
130
|
-
this.resolveChildrenStatement.clear();
|
|
131
116
|
}
|
|
132
117
|
async stop() {
|
|
133
118
|
if (this.closed) {
|
|
@@ -154,7 +139,7 @@ export class SQLLiteIndex {
|
|
|
154
139
|
}
|
|
155
140
|
}
|
|
156
141
|
async resolveDependencies(parentId, table) {
|
|
157
|
-
const stmt = this.
|
|
142
|
+
const stmt = this.properties.db.statements.get(resolveChildrenStatement(table));
|
|
158
143
|
const results = await stmt.all([parentId]);
|
|
159
144
|
await stmt.reset?.();
|
|
160
145
|
return results;
|
|
@@ -163,9 +148,8 @@ export class SQLLiteIndex {
|
|
|
163
148
|
for (const table of this._rootTables) {
|
|
164
149
|
const { join: joinMap, selects } = selectAllFieldsFromTable(table, options?.shape);
|
|
165
150
|
const sql = `${generateSelectQuery(table, selects)} ${buildJoin(joinMap, true)} where ${this.primaryKeyString} = ? `;
|
|
166
|
-
const stmt = await this.properties.db.prepare(sql);
|
|
151
|
+
const stmt = await this.properties.db.prepare(sql, sql);
|
|
167
152
|
const rows = await stmt.get([id.key]);
|
|
168
|
-
await stmt.finalize?.();
|
|
169
153
|
if (!rows) {
|
|
170
154
|
continue;
|
|
171
155
|
}
|
|
@@ -181,88 +165,123 @@ export class SQLLiteIndex {
|
|
|
181
165
|
return insert(async (values, table) => {
|
|
182
166
|
const preId = values[table.primaryIndex];
|
|
183
167
|
if (preId != null) {
|
|
184
|
-
const statement = this.
|
|
168
|
+
const statement = this.properties.db.statements.get(replaceStatementKey(table));
|
|
185
169
|
await statement.run(values.map((x) => (typeof x === "boolean" ? (x ? 1 : 0) : x)));
|
|
186
170
|
await statement.reset?.();
|
|
187
171
|
return preId;
|
|
188
172
|
}
|
|
189
173
|
else {
|
|
190
|
-
const statement = this.
|
|
174
|
+
const statement = this.properties.db.statements.get(putStatementKey(table));
|
|
191
175
|
const out = await statement.get(values.map((x) => (typeof x === "boolean" ? (x ? 1 : 0) : x)));
|
|
192
176
|
await statement.reset?.();
|
|
193
177
|
// TODO types
|
|
178
|
+
if (out == null) {
|
|
179
|
+
return undefined;
|
|
180
|
+
}
|
|
194
181
|
return out[table.primary];
|
|
195
182
|
}
|
|
196
183
|
}, value, this.tables, resolveTable(this.scopeString ? [this.scopeString] : [], this.tables, classOfValue, true), getSchema(classOfValue).fields, (_fn) => {
|
|
197
184
|
throw new Error("Unexpected");
|
|
198
185
|
});
|
|
199
186
|
}
|
|
200
|
-
|
|
187
|
+
iterate(request, options) {
|
|
201
188
|
// create a sql statement where the offset and the limit id dynamic and can be updated
|
|
202
189
|
// TODO don't use offset but sort and limit 'next' calls by the last value of the sort
|
|
203
|
-
let sqlFetch = convertSearchRequestToQuery(request, this.tables, this._rootTables, options?.shape);
|
|
204
|
-
const stmt = await this.properties.db.prepare(sqlFetch);
|
|
190
|
+
let { sql: sqlFetch, bindable } = convertSearchRequestToQuery(request, this.tables, this._rootTables, options?.shape);
|
|
205
191
|
/* const totalCountKey = "count"; */
|
|
206
192
|
/* const sqlTotalCount = convertCountRequestToQuery(new types.CountRequest({ query: request.query }), this.tables, this.tables.get(this.rootTableName)!)
|
|
207
193
|
const countStmt = await this.properties.db.prepare(sqlTotalCount); */
|
|
208
194
|
let offset = 0;
|
|
209
|
-
let
|
|
195
|
+
let once = false;
|
|
196
|
+
let requestId = uuid();
|
|
197
|
+
let hasMore = true;
|
|
198
|
+
let stmt;
|
|
199
|
+
let kept = undefined;
|
|
200
|
+
/* let totalCount: undefined | number = undefined; */
|
|
210
201
|
const fetch = async (amount) => {
|
|
211
|
-
|
|
212
|
-
|
|
202
|
+
kept = undefined;
|
|
203
|
+
if (!once) {
|
|
204
|
+
stmt = await this.properties.db.prepare(sqlFetch, sqlFetch);
|
|
205
|
+
// stmt.reset?.(); // TODO dont invoke reset if not needed
|
|
213
206
|
/* countStmt.reset?.(); */
|
|
214
207
|
// Bump timeout timer
|
|
215
208
|
clearTimeout(iterator.timeout);
|
|
216
|
-
iterator.timeout = setTimeout(() => this.clearupIterator(
|
|
209
|
+
iterator.timeout = setTimeout(() => this.clearupIterator(requestId), this.iteratorTimeout);
|
|
217
210
|
}
|
|
218
|
-
|
|
211
|
+
once = true;
|
|
219
212
|
const offsetStart = offset;
|
|
220
213
|
const allResults = await stmt.all([
|
|
214
|
+
...bindable,
|
|
221
215
|
amount,
|
|
222
216
|
offsetStart,
|
|
223
217
|
]);
|
|
224
218
|
let results = await Promise.all(allResults.map(async (row) => {
|
|
225
|
-
let selectedTable = this._rootTables.find((table /* row["table_name"] === table.name, */) => row[getTablePrefixedField(table, this.primaryKeyString)] !=
|
|
219
|
+
let selectedTable = this._rootTables.find((table /* row["table_name"] === table.name, */) => row[getTablePrefixedField(table, this.primaryKeyString)] !=
|
|
220
|
+
null);
|
|
226
221
|
const value = await resolveInstanceFromValue(row, this.tables, selectedTable, this.resolveDependencies.bind(this), true, options?.shape);
|
|
227
222
|
return {
|
|
228
223
|
value,
|
|
229
224
|
id: types.toId(row[getTablePrefixedField(selectedTable, this.primaryKeyString)]),
|
|
230
225
|
};
|
|
231
226
|
}));
|
|
232
|
-
offset +=
|
|
233
|
-
if (results.length > 0) {
|
|
234
|
-
|
|
227
|
+
offset += results.length;
|
|
228
|
+
/* if (results.length > 0) {
|
|
229
|
+
totalCount =
|
|
230
|
+
totalCount ??
|
|
231
|
+
(await this.count(
|
|
232
|
+
request,
|
|
233
|
+
));
|
|
235
234
|
iterator.kept = totalCount - results.length - offsetStart;
|
|
236
|
-
}
|
|
237
|
-
else {
|
|
235
|
+
} else {
|
|
238
236
|
iterator.kept = 0;
|
|
239
|
-
}
|
|
240
|
-
if (
|
|
241
|
-
|
|
237
|
+
} */
|
|
238
|
+
if (results.length < amount) {
|
|
239
|
+
hasMore = false;
|
|
240
|
+
await this.clearupIterator(requestId);
|
|
242
241
|
clearTimeout(iterator.timeout);
|
|
243
242
|
}
|
|
244
|
-
return
|
|
243
|
+
return results;
|
|
245
244
|
};
|
|
246
245
|
const iterator = {
|
|
247
|
-
kept: 0,
|
|
248
246
|
fetch,
|
|
249
|
-
fetchStatement: stmt,
|
|
250
247
|
/* countStatement: countStmt, */
|
|
251
|
-
timeout: setTimeout(() => this.clearupIterator(
|
|
248
|
+
timeout: setTimeout(() => this.clearupIterator(requestId), this.iteratorTimeout),
|
|
249
|
+
};
|
|
250
|
+
this.cursor.set(requestId, iterator);
|
|
251
|
+
let totalCount = undefined;
|
|
252
|
+
/* return fetch(request.fetch); */
|
|
253
|
+
return {
|
|
254
|
+
all: async () => {
|
|
255
|
+
const results = [];
|
|
256
|
+
while (true) {
|
|
257
|
+
const res = await fetch(100);
|
|
258
|
+
results.push(...res);
|
|
259
|
+
if (res.length === 0) {
|
|
260
|
+
break;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
return results;
|
|
264
|
+
},
|
|
265
|
+
close: () => {
|
|
266
|
+
hasMore = false;
|
|
267
|
+
kept = 0;
|
|
268
|
+
this.clearupIterator(requestId);
|
|
269
|
+
},
|
|
270
|
+
next: (amount) => fetch(amount),
|
|
271
|
+
pending: async () => {
|
|
272
|
+
if (!hasMore) {
|
|
273
|
+
return 0;
|
|
274
|
+
}
|
|
275
|
+
if (kept != null) {
|
|
276
|
+
return kept;
|
|
277
|
+
}
|
|
278
|
+
totalCount = totalCount ?? (await this.count(request));
|
|
279
|
+
kept = totalCount - offset;
|
|
280
|
+
hasMore = kept > 0;
|
|
281
|
+
return kept;
|
|
282
|
+
},
|
|
283
|
+
done: () => (once ? !hasMore : undefined),
|
|
252
284
|
};
|
|
253
|
-
this.cursor.set(request.idString, iterator);
|
|
254
|
-
return fetch(request.fetch);
|
|
255
|
-
}
|
|
256
|
-
next(query) {
|
|
257
|
-
const cache = this.cursor.get(query.idString);
|
|
258
|
-
if (!cache) {
|
|
259
|
-
throw new Error("No cursor found with id: " + query.idString);
|
|
260
|
-
}
|
|
261
|
-
// reuse statement
|
|
262
|
-
return cache.fetch(query.amount);
|
|
263
|
-
}
|
|
264
|
-
close(query) {
|
|
265
|
-
return this.clearupIterator(query.idString);
|
|
266
285
|
}
|
|
267
286
|
async clearupIterator(id) {
|
|
268
287
|
const cache = this._cursor.get(id);
|
|
@@ -271,7 +290,7 @@ export class SQLLiteIndex {
|
|
|
271
290
|
}
|
|
272
291
|
clearTimeout(cache.timeout);
|
|
273
292
|
/* cache.countStatement.finalize?.(); */
|
|
274
|
-
await cache.fetchStatement.finalize?.();
|
|
293
|
+
// await cache.fetchStatement.finalize?.();
|
|
275
294
|
this._cursor.delete(id);
|
|
276
295
|
}
|
|
277
296
|
async getSize() {
|
|
@@ -282,7 +301,7 @@ export class SQLLiteIndex {
|
|
|
282
301
|
const result = await stmt.get()
|
|
283
302
|
stmt.finalize?.();
|
|
284
303
|
return result.total as number */
|
|
285
|
-
return this.count(
|
|
304
|
+
return this.count();
|
|
286
305
|
}
|
|
287
306
|
async del(query) {
|
|
288
307
|
let ret = [];
|
|
@@ -290,9 +309,9 @@ export class SQLLiteIndex {
|
|
|
290
309
|
let lastError = undefined;
|
|
291
310
|
for (const table of this._rootTables) {
|
|
292
311
|
try {
|
|
293
|
-
const
|
|
294
|
-
const
|
|
295
|
-
await stmt.
|
|
312
|
+
const { sql, bindable } = convertDeleteRequestToQuery(query, this.tables, table);
|
|
313
|
+
const stmt = await this.properties.db.prepare(sql, sql);
|
|
314
|
+
const results = await stmt.all(bindable);
|
|
296
315
|
// TODO types
|
|
297
316
|
for (const result of results) {
|
|
298
317
|
ret.push(types.toId(result[table.primary]));
|
|
@@ -320,19 +339,22 @@ export class SQLLiteIndex {
|
|
|
320
339
|
for (const table of this._rootTables) {
|
|
321
340
|
try {
|
|
322
341
|
if (table.fields.find((x) => x.name === inlinedName) == null) {
|
|
323
|
-
lastError = new MissingFieldError("Missing field: " +
|
|
342
|
+
lastError = new MissingFieldError("Missing field: " +
|
|
343
|
+
(Array.isArray(query.key) ? query.key : [query.key]).join("."));
|
|
324
344
|
continue;
|
|
325
345
|
}
|
|
326
|
-
const
|
|
327
|
-
const
|
|
328
|
-
await stmt.
|
|
329
|
-
if (
|
|
330
|
-
ret
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
346
|
+
const { sql, bindable } = convertSumRequestToQuery(query, this.tables, table);
|
|
347
|
+
const stmt = await this.properties.db.prepare(sql, sql);
|
|
348
|
+
const result = await stmt.get(bindable);
|
|
349
|
+
if (result != null) {
|
|
350
|
+
if (ret == null) {
|
|
351
|
+
ret = result.sum;
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
ret += result.sum;
|
|
355
|
+
}
|
|
356
|
+
once = true;
|
|
334
357
|
}
|
|
335
|
-
once = true;
|
|
336
358
|
}
|
|
337
359
|
catch (error) {
|
|
338
360
|
if (error instanceof MissingFieldError) {
|
|
@@ -353,11 +375,13 @@ export class SQLLiteIndex {
|
|
|
353
375
|
let lastError = undefined;
|
|
354
376
|
for (const table of this._rootTables) {
|
|
355
377
|
try {
|
|
356
|
-
const
|
|
357
|
-
const
|
|
358
|
-
await stmt.
|
|
359
|
-
|
|
360
|
-
|
|
378
|
+
const { sql, bindable } = convertCountRequestToQuery(request, this.tables, table);
|
|
379
|
+
const stmt = await this.properties.db.prepare(sql, sql);
|
|
380
|
+
const result = await stmt.get(bindable);
|
|
381
|
+
if (result != null) {
|
|
382
|
+
ret += Number(result.count);
|
|
383
|
+
once = true;
|
|
384
|
+
}
|
|
361
385
|
}
|
|
362
386
|
catch (error) {
|
|
363
387
|
if (error instanceof MissingFieldError) {
|
|
@@ -372,13 +396,6 @@ export class SQLLiteIndex {
|
|
|
372
396
|
}
|
|
373
397
|
return ret;
|
|
374
398
|
}
|
|
375
|
-
getPending(cursorId) {
|
|
376
|
-
const cursor = this.cursor.get(cursorId);
|
|
377
|
-
if (!cursor) {
|
|
378
|
-
return;
|
|
379
|
-
}
|
|
380
|
-
return cursor.kept;
|
|
381
|
-
}
|
|
382
399
|
get cursorCount() {
|
|
383
400
|
return this.cursor.size;
|
|
384
401
|
}
|