@sixb/ducklake 0.1.5 → 0.1.7
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/README.md +24 -26
- package/dist/ducklake-storage.d.ts +3 -1
- package/dist/ducklake-storage.d.ts.map +1 -1
- package/dist/index.js +1100 -661
- package/dist/index.js.map +22 -19
- package/dist/internal/duckdb-reader.d.ts +28 -0
- package/dist/internal/duckdb-reader.d.ts.map +1 -0
- package/dist/internal/duckdb-runtime.d.ts +5 -3
- package/dist/internal/duckdb-runtime.d.ts.map +1 -1
- package/dist/internal/ducklake-change-reader.d.ts +13 -0
- package/dist/internal/ducklake-change-reader.d.ts.map +1 -0
- package/dist/internal/ducklake-connection-manager.d.ts +19 -3
- package/dist/internal/ducklake-connection-manager.d.ts.map +1 -1
- package/dist/internal/ducklake-read-gate.d.ts +11 -0
- package/dist/internal/ducklake-read-gate.d.ts.map +1 -0
- package/dist/internal/ducklake-row-reader.d.ts.map +1 -1
- package/dist/internal/ducklake-snapshot-reader.d.ts.map +1 -1
- package/dist/internal/ducklake-write-coordinator.d.ts +2 -1
- package/dist/internal/ducklake-write-coordinator.d.ts.map +1 -1
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -4
- package/src/ducklake-storage.ts +13 -0
- package/src/internal/duckdb-reader.ts +129 -0
- package/src/internal/duckdb-runtime.ts +75 -51
- package/src/internal/ducklake-change-reader.ts +157 -0
- package/src/internal/ducklake-connection-manager.ts +117 -33
- package/src/internal/ducklake-maintenance.ts +1 -1
- package/src/internal/ducklake-read-gate.ts +58 -0
- package/src/internal/ducklake-row-reader.ts +84 -63
- package/src/internal/ducklake-snapshot-reader.ts +7 -2
- package/src/internal/ducklake-write-coordinator.ts +56 -15
- package/src/internal/ducklake-write-session.ts +1 -0
- package/src/types.ts +2 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DuckDBConnection } from "@duckdb/node-api";
|
|
2
|
+
/** One native query, on a connection belonging to the runtime's shared instance. */
|
|
3
|
+
export interface DuckDbReader {
|
|
4
|
+
rows(): AsyncIterable<Record<string, unknown>>;
|
|
5
|
+
close(): Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface DuckDbReaderOptions {
|
|
8
|
+
readonly signal?: AbortSignal;
|
|
9
|
+
readonly onClose?: () => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
export declare class NodeDuckDbReader implements DuckDbReader {
|
|
12
|
+
private readonly connection;
|
|
13
|
+
private readonly options;
|
|
14
|
+
private resultPromise;
|
|
15
|
+
private pending;
|
|
16
|
+
private closePromise;
|
|
17
|
+
private finished;
|
|
18
|
+
private consumed;
|
|
19
|
+
private readonly onAbort;
|
|
20
|
+
constructor(connection: DuckDBConnection, options: DuckDbReaderOptions);
|
|
21
|
+
start(sql: string): Promise<void>;
|
|
22
|
+
rows(): AsyncIterable<Record<string, unknown>>;
|
|
23
|
+
close(): Promise<void>;
|
|
24
|
+
private finish;
|
|
25
|
+
private track;
|
|
26
|
+
private assertOpen;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=duckdb-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duckdb-reader.d.ts","sourceRoot":"","sources":["../../src/internal/duckdb-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAgB,MAAM,kBAAkB,CAAA;AAItE,oFAAoF;AACpF,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CACvC;AAED,qBAAa,gBAAiB,YAAW,YAAY;IAajD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAb1B,OAAO,CAAC,aAAa,CAAmC;IACxD,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,YAAY,CAA2B;IAC/C,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAIvB;gBAGkB,UAAU,EAAE,gBAAgB,EAC5B,OAAO,EAAE,mBAAmB;IAGzC,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAwBhC,IAAI,IAAI,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IA6BrD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YASR,MAAM;YAkBN,KAAK;IAYnB,OAAO,CAAC,UAAU;CAInB"}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
import { type DuckDBValue } from "@duckdb/node-api";
|
|
2
2
|
import type { DuckDbRuntimeOptions, DuckLakeStorageOptions } from "../types";
|
|
3
|
+
import { type DuckDbReader, type DuckDbReaderOptions } from "./duckdb-reader";
|
|
3
4
|
/**
|
|
4
5
|
* Narrow adapter around `@duckdb/node-api`.
|
|
5
6
|
*
|
|
6
7
|
* Keeping the public provider behind this interface confines the driver types to
|
|
7
|
-
* this module instead of leaking them into `DuckLakeStorage`.
|
|
8
|
-
*
|
|
8
|
+
* this module instead of leaking them into `DuckLakeStorage`. Main-connection calls
|
|
9
|
+
* share one queue; readers use separate connections to the same DuckDB instance.
|
|
9
10
|
*/
|
|
10
11
|
export interface DuckDbQueryRuntime {
|
|
11
12
|
run(sql: string, values?: readonly DuckDBValue[]): Promise<void>;
|
|
@@ -14,7 +15,8 @@ export interface DuckDbQueryRuntime {
|
|
|
14
15
|
withAppender<T>(tableName: string, useAppender: (appender: DuckDbAppender) => T | Promise<T>): Promise<T>;
|
|
15
16
|
}
|
|
16
17
|
export interface DuckDbRuntime extends DuckDbQueryRuntime {
|
|
17
|
-
|
|
18
|
+
openReader(sql: string, options?: DuckDbReaderOptions): Promise<DuckDbReader>;
|
|
19
|
+
stopReaders(): Promise<void>;
|
|
18
20
|
/**
|
|
19
21
|
* Reserve the runtime queue for a multi-statement critical section.
|
|
20
22
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"duckdb-runtime.d.ts","sourceRoot":"","sources":["../../src/internal/duckdb-runtime.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"duckdb-runtime.d.ts","sourceRoot":"","sources":["../../src/internal/duckdb-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,WAAW,EAEjB,MAAM,kBAAkB,CAAA;AAEzB,OAAO,KAAK,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAC5E,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,mBAAmB,EAAoB,MAAM,iBAAiB,CAAA;AAW/F;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAChE,aAAa,CAAC,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3D,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,WAAW,EAAE,GAAG,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,CAAA;IAChG,YAAY,CAAC,CAAC,EACZ,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GACxD,OAAO,CAAC,CAAC,CAAC,CAAA;CACd;AAED,MAAM,WAAW,aAAc,SAAQ,kBAAkB;IACvD,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAA;IAC7E,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IAC5B;;;;;OAKG;IACH,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,sBAAsB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACzF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,kBAAkB,CAAA;AAEvD,MAAM,WAAW,cAAc;IAC7B,UAAU,IAAI,IAAI,CAAA;IAClB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI,CAAA;IACnC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IAClC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,IAAI,CAAA;IAChE,MAAM,IAAI,IAAI,CAAA;CACf;AAED,UAAU,oBAAoB;IAC5B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;IACpC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAC1B;AAsND;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,aAAa,CAAC,CAuBxB;AAED;;;;GAIG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,sBAAsB,EAC/B,YAAY,GAAE,oBAAyB,GACtC,OAAO,CAAC,IAAI,CAAC,CA8Bf"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type DatasetChanges, type ReadDatasetChangesInput } from "@sixb/core/lake-storage";
|
|
2
|
+
import type { DuckLakeStorageOptions } from "../types";
|
|
3
|
+
import type { DuckLakeConnectionManager } from "./ducklake-connection-manager";
|
|
4
|
+
import type { DuckLakeSnapshotReader } from "./ducklake-snapshot-reader";
|
|
5
|
+
/** Compare once in DuckDB, then page only the delta without holding the connection between yields. */
|
|
6
|
+
export declare class DuckLakeChangeReader {
|
|
7
|
+
private readonly options;
|
|
8
|
+
private readonly connections;
|
|
9
|
+
private readonly snapshots;
|
|
10
|
+
constructor(options: DuckLakeStorageOptions, connections: DuckLakeConnectionManager, snapshots: DuckLakeSnapshotReader);
|
|
11
|
+
readChanges(input: ReadDatasetChangesInput): Promise<DatasetChanges | null>;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=ducklake-change-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ducklake-change-reader.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-change-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,cAAc,EAGnB,KAAK,uBAAuB,EAE7B,MAAM,yBAAyB,CAAA;AAChC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAGtD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAE9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAOxE,sGAAsG;AACtG,qBAAa,oBAAoB;IAE7B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,yBAAyB,EACtC,SAAS,EAAE,sBAAsB;IAG9C,WAAW,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;CA2FlF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { DuckLakeStorageOptions } from "../types";
|
|
2
|
+
import type { DuckDbReader } from "./duckdb-reader";
|
|
2
3
|
import { type DuckDbExclusiveRuntime, type DuckDbQueryRuntime, type DuckDbRuntime } from "./duckdb-runtime";
|
|
3
4
|
export interface DuckLakeAttachedRuntimeLease {
|
|
4
5
|
readonly runtime: DuckDbRuntime;
|
|
@@ -18,12 +19,26 @@ export declare class DuckLakeConnectionManager {
|
|
|
18
19
|
private installExtensionsPromise;
|
|
19
20
|
private attachPromise;
|
|
20
21
|
private refreshPromise;
|
|
21
|
-
private
|
|
22
|
+
private attachmentLock;
|
|
22
23
|
private observedLocalCatalogGeneration;
|
|
23
24
|
private attached;
|
|
24
25
|
private closed;
|
|
26
|
+
private closePromise;
|
|
25
27
|
private runtimePoisoned;
|
|
28
|
+
private pinnedReaders;
|
|
29
|
+
private refreshRequested;
|
|
30
|
+
private readonly shutdown;
|
|
31
|
+
private readonly reads;
|
|
32
|
+
private readonly maxStreamingReads;
|
|
26
33
|
constructor(options: DuckLakeStorageOptions);
|
|
34
|
+
acquireRead(signal?: AbortSignal): Promise<{
|
|
35
|
+
readonly signal: AbortSignal;
|
|
36
|
+
readonly release: () => void;
|
|
37
|
+
}>;
|
|
38
|
+
private nativeReaderLimit;
|
|
39
|
+
/** Caller holds an attachment lease until this query has started. */
|
|
40
|
+
openReader(runtime: DuckDbRuntime, sql: string, signal: AbortSignal, releaseRead: () => void): Promise<DuckDbReader | null>;
|
|
41
|
+
withMaintenanceRuntime<T>(run: (runtime: DuckDbExclusiveRuntime) => Promise<T>): Promise<T>;
|
|
27
42
|
assertOpen(): void;
|
|
28
43
|
runtime(): Promise<DuckDbRuntime>;
|
|
29
44
|
attachedRuntime(): Promise<DuckDbRuntime>;
|
|
@@ -45,6 +60,7 @@ export declare class DuckLakeConnectionManager {
|
|
|
45
60
|
private refreshForExternalChangesUnlocked;
|
|
46
61
|
private needsLocalCatalogRefresh;
|
|
47
62
|
close(): Promise<void>;
|
|
63
|
+
private finishClose;
|
|
48
64
|
private ensureAttached;
|
|
49
65
|
private ensureExtensionsInstalled;
|
|
50
66
|
private attachRuntime;
|
|
@@ -59,8 +75,8 @@ export declare class DuckLakeConnectionManager {
|
|
|
59
75
|
private detachDuckDbCatalogAfterLease;
|
|
60
76
|
private discardRuntimeUnlocked;
|
|
61
77
|
private detachRuntimeUnlocked;
|
|
62
|
-
private
|
|
63
|
-
private
|
|
78
|
+
private withAttachmentLock;
|
|
79
|
+
private acquireAttachmentLock;
|
|
64
80
|
private closeRuntimePromise;
|
|
65
81
|
private closeRuntime;
|
|
66
82
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-connection-manager.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-connection-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAEtD,OAAO,EAEL,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAGnB,MAAM,kBAAkB,CAAA;
|
|
1
|
+
{"version":3,"file":"ducklake-connection-manager.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-connection-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Keeps destructive maintenance outside reads, including paged overflow readers. */
|
|
2
|
+
export declare class DuckLakeReadGate {
|
|
3
|
+
private active;
|
|
4
|
+
private maintenance;
|
|
5
|
+
private readonly waiters;
|
|
6
|
+
acquire(signal: AbortSignal): Promise<() => void>;
|
|
7
|
+
withMaintenance<T>(signal: AbortSignal, run: () => Promise<T>): Promise<T>;
|
|
8
|
+
private wait;
|
|
9
|
+
private wake;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=ducklake-read-gate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ducklake-read-gate.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-read-gate.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAI;IAClB,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwB;IAE1C,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC;IAiBjD,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAchF,OAAO,CAAC,IAAI;IAiBZ,OAAO,CAAC,IAAI;CAGb"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-row-reader.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-row-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,UAAU,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,KAAK,EAAkB,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAEnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;
|
|
1
|
+
{"version":3,"file":"ducklake-row-reader.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-row-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA2B,UAAU,EAAE,MAAM,YAAY,CAAA;AACrE,OAAO,KAAK,EAAkB,oBAAoB,EAAE,MAAM,yBAAyB,CAAA;AAEnF,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAItD,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAE9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AASxE;;;;;;GAMG;AACH,qBAAa,iBAAiB;IAE1B,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAFT,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,yBAAyB,EACtC,SAAS,EAAE,sBAAsB;IAG7C,QAAQ,CAAC,KAAK,EAAE,oBAAoB,GAAG,aAAa,CAAC,UAAU,CAAC;YA4ExD,aAAa;YAed,cAAc;IAuB5B,OAAO,CAAC,kBAAkB;IAuB1B,OAAO,CAAC,uBAAuB;CAKhC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-snapshot-reader.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-snapshot-reader.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ducklake-snapshot-reader.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-snapshot-reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,7 +49,8 @@ export declare class DuckLakeWriteCoordinator {
|
|
|
49
49
|
private ensureNoOpHasSnapshot;
|
|
50
50
|
private versionForNoOpCommit;
|
|
51
51
|
private rollbackTransaction;
|
|
52
|
-
private
|
|
52
|
+
private beginVersionTransaction;
|
|
53
|
+
private currentSnapshotId;
|
|
53
54
|
private lastCommittedSnapshotId;
|
|
54
55
|
private findSnapshotIdByCommitId;
|
|
55
56
|
private findOwnSnapshotId;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ducklake-write-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-write-coordinator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EAGtB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AAShC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"ducklake-write-coordinator.d.ts","sourceRoot":"","sources":["../../src/internal/ducklake-write-coordinator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAA;AACnD,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EAGtB,wBAAwB,EACxB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,yBAAyB,CAAA;AAShC,OAAO,KAAK,EAA0B,sBAAsB,EAAE,MAAM,UAAU,CAAA;AAE9E,OAAO,EACL,KAAK,sBAAsB,EAI5B,MAAM,sBAAsB,CAAA;AAG7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAA;AAC1D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAA;AAC9E,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAA;AAExE,OAAO,KAAK,EAAE,sBAAsB,EAA0B,MAAM,4BAA4B,CAAA;AAYhG,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAA;IACnC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAA;IAC/B,QAAQ,CAAC,uBAAuB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAChD,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,QAAQ,CAAC,EAAE,sBAAsB,CAAC,UAAU,CAAC,CAAA;IACtD,QAAQ,CAAC,MAAM,CAAC,EAAE,sBAAsB,CAAC,QAAQ,CAAC,CAAA;IAClD,YAAY,CACV,OAAO,EAAE,kBAAkB,EAC3B,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,sBAAsB,CAAC,CAAA;CACnC;AAgBD,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;IAClC,QAAQ,CAAC,0BAA0B,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CACxD;AAED;;;;;;;GAOG;AACH,qBAAa,wBAAwB;IAEjC,OAAO,CAAC,QAAQ,CAAC,OAAO;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAHT,OAAO,EAAE,sBAAsB,EAC/B,WAAW,EAAE,yBAAyB,EACtC,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,sBAAsB;IAG9C,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA6BpE,UAAU,CAAC,KAAK,EAAE,sBAAsB,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAkC5D,WAAW;YAyBX,WAAW;IAoDnB,oBAAoB,CACxB,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,wBAAwB,CAAC;IAM9B,iBAAiB,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAQlF,sCAAsC,CAC1C,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,wBAAwB,CAAC;YAkBtB,sCAAsC;YAUtC,uBAAuB;YA2CvB,4BAA4B;YA6E5B,wBAAwB;YAiExB,eAAe;YAyBf,iBAAiB;YAkCjB,qBAAqB;YA+BrB,oBAAoB;YAmBpB,mBAAmB;YASnB,uBAAuB;YAmCvB,iBAAiB;YAUjB,uBAAuB;YAYvB,wBAAwB;YAiCxB,iBAAiB;IA0B/B,OAAO,CAAC,2BAA2B;CAgBpC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -137,6 +137,8 @@ export interface DuckLakeStorageOptions {
|
|
|
137
137
|
readonly alias?: string;
|
|
138
138
|
readonly duckdb?: DuckDbRuntimeOptions;
|
|
139
139
|
readonly postgresPool?: DuckLakePostgresPoolOptions;
|
|
140
|
+
/** Maximum native streaming readers per provider; extra reads use pages. Default: 4. */
|
|
141
|
+
readonly maxStreamingReads?: number;
|
|
140
142
|
readonly secrets?: readonly DuckDbSecretOptions[];
|
|
141
143
|
/** Runs after DuckLake/catalog extensions load and before ATTACH. */
|
|
142
144
|
readonly setupSql?: readonly string[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sixb/ducklake",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "DuckDB/DuckLake lake storage provider for Sixb",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"sixb",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"typecheck": "tsc --noEmit",
|
|
37
37
|
"test": "bun test",
|
|
38
38
|
"test:e2e": "bun run test:e2e:local && bun run test:e2e:remote",
|
|
39
|
-
"test:e2e:local": "bun test ./tests/ducklake-contract.e2e.ts ./tests/ducklake-file-refs.e2e.ts ./tests/ducklake-catalog-state.e2e.ts ./tests/ducklake-catalogs.e2e.ts ./tests/ducklake-concurrency.e2e.ts ./tests/ducklake-datasets.e2e.ts ./tests/ducklake-driver.e2e.ts ./tests/ducklake-maintenance.e2e.ts ./tests/ducklake-merges.e2e.ts ./tests/ducklake-sql-transforms.e2e.ts ./tests/ducklake-versions.e2e.ts ./tests/ducklake-writes.e2e.ts",
|
|
39
|
+
"test:e2e:local": "bun test ./tests/ducklake-reader.e2e.ts ./tests/ducklake-changes.e2e.ts ./tests/ducklake-contract.e2e.ts ./tests/ducklake-file-refs.e2e.ts ./tests/ducklake-catalog-state.e2e.ts ./tests/ducklake-catalogs.e2e.ts ./tests/ducklake-concurrency.e2e.ts ./tests/ducklake-datasets.e2e.ts ./tests/ducklake-driver.e2e.ts ./tests/ducklake-maintenance.e2e.ts ./tests/ducklake-merges.e2e.ts ./tests/ducklake-sql-transforms.e2e.ts ./tests/ducklake-versions.e2e.ts ./tests/ducklake-writes.e2e.ts ./tests/ducklake-sqlite-writes.e2e.ts",
|
|
40
40
|
"test:e2e:remote": "bun test --preload ./tests/setup.ts ./tests/ducklake-remote.e2e.ts",
|
|
41
41
|
"prepack": "bun run build"
|
|
42
42
|
},
|
|
@@ -44,10 +44,10 @@
|
|
|
44
44
|
"@duckdb/node-api": "^1.5.2-r.1"
|
|
45
45
|
},
|
|
46
46
|
"peerDependencies": {
|
|
47
|
-
"@sixb/core": "^0.1.
|
|
47
|
+
"@sixb/core": "^0.1.11"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@sixb/core": "0.1.
|
|
50
|
+
"@sixb/core": "0.1.11",
|
|
51
51
|
"@types/bun": "latest",
|
|
52
52
|
"typescript": "^5.7.0"
|
|
53
53
|
},
|
package/src/ducklake-storage.ts
CHANGED
|
@@ -3,11 +3,14 @@ import type {
|
|
|
3
3
|
BeginDatasetMergeInput,
|
|
4
4
|
BeginDatasetWriteInput,
|
|
5
5
|
DatasetCatalogState,
|
|
6
|
+
DatasetChanges,
|
|
6
7
|
DatasetVersion,
|
|
7
8
|
LakeMergeSession,
|
|
8
9
|
LakeWriteSession,
|
|
10
|
+
ReadDatasetChangesInput,
|
|
9
11
|
ReadDatasetRowsInput,
|
|
10
12
|
} from "@sixb/core/lake-storage"
|
|
13
|
+
import { DuckLakeChangeReader } from "./internal/ducklake-change-reader"
|
|
11
14
|
import { DuckLakeConnectionManager } from "./internal/ducklake-connection-manager"
|
|
12
15
|
import { DuckLakeDatasetCatalog } from "./internal/ducklake-dataset-catalog"
|
|
13
16
|
import { DuckLakeMaintenance } from "./internal/ducklake-maintenance"
|
|
@@ -36,6 +39,7 @@ export class DuckLakeStorage implements LakeStorageWithSql<"duckdb"> {
|
|
|
36
39
|
private readonly datasets: DuckLakeDatasetCatalog
|
|
37
40
|
private readonly maintenance: DuckLakeMaintenance
|
|
38
41
|
private readonly rows: DuckLakeRowReader
|
|
42
|
+
private readonly changes: DuckLakeChangeReader
|
|
39
43
|
private readonly snapshotReader: DuckLakeSnapshotReader
|
|
40
44
|
private readonly writes: DuckLakeWriteCoordinator
|
|
41
45
|
|
|
@@ -59,6 +63,11 @@ export class DuckLakeStorage implements LakeStorageWithSql<"duckdb"> {
|
|
|
59
63
|
this.datasets
|
|
60
64
|
)
|
|
61
65
|
this.rows = new DuckLakeRowReader(normalizedOptions, this.connections, this.snapshotReader)
|
|
66
|
+
this.changes = new DuckLakeChangeReader(
|
|
67
|
+
normalizedOptions,
|
|
68
|
+
this.connections,
|
|
69
|
+
this.snapshotReader
|
|
70
|
+
)
|
|
62
71
|
this.writes = new DuckLakeWriteCoordinator(
|
|
63
72
|
normalizedOptions,
|
|
64
73
|
this.connections,
|
|
@@ -122,6 +131,10 @@ export class DuckLakeStorage implements LakeStorageWithSql<"duckdb"> {
|
|
|
122
131
|
return this.rows.readRows(input)
|
|
123
132
|
}
|
|
124
133
|
|
|
134
|
+
readChanges(input: ReadDatasetChangesInput): Promise<DatasetChanges | null> {
|
|
135
|
+
return this.changes.readChanges(input)
|
|
136
|
+
}
|
|
137
|
+
|
|
125
138
|
async runMaintenance(options?: DuckLakeMaintenanceOptions): Promise<DuckLakeMaintenanceReport> {
|
|
126
139
|
return this.maintenance.runMaintenance(options)
|
|
127
140
|
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import type { DuckDBConnection, DuckDBResult } from "@duckdb/node-api"
|
|
2
|
+
import { LakeStorageError } from "@sixb/core/lake-storage"
|
|
3
|
+
import { sixbDuckDbValueConverter } from "./duckdb-value-converter"
|
|
4
|
+
|
|
5
|
+
/** One native query, on a connection belonging to the runtime's shared instance. */
|
|
6
|
+
export interface DuckDbReader {
|
|
7
|
+
rows(): AsyncIterable<Record<string, unknown>>
|
|
8
|
+
close(): Promise<void>
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface DuckDbReaderOptions {
|
|
12
|
+
readonly signal?: AbortSignal
|
|
13
|
+
readonly onClose?: () => Promise<void>
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class NodeDuckDbReader implements DuckDbReader {
|
|
17
|
+
private resultPromise: Promise<DuckDBResult> | undefined
|
|
18
|
+
private pending: Promise<unknown> | undefined
|
|
19
|
+
private closePromise: Promise<void> | undefined
|
|
20
|
+
private finished = false
|
|
21
|
+
private consumed = false
|
|
22
|
+
private readonly onAbort = () => {
|
|
23
|
+
// Keep the rejected cleanup observable through close()/rows(), including when the consumer
|
|
24
|
+
// is paused. The event listener itself cannot return an awaited promise.
|
|
25
|
+
void this.close().catch(() => {})
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
constructor(
|
|
29
|
+
private readonly connection: DuckDBConnection,
|
|
30
|
+
private readonly options: DuckDbReaderOptions
|
|
31
|
+
) {}
|
|
32
|
+
|
|
33
|
+
async start(sql: string): Promise<void> {
|
|
34
|
+
this.options.signal?.throwIfAborted()
|
|
35
|
+
this.options.signal?.addEventListener("abort", this.onAbort, { once: true })
|
|
36
|
+
// Connection-local settings are not inherited by a new connection. Physical offsets must
|
|
37
|
+
// remain stable even when a dataset shadows DuckDB's virtual rowid column.
|
|
38
|
+
await this.track(this.connection.run("SET preserve_insertion_order = true"))
|
|
39
|
+
this.assertOpen()
|
|
40
|
+
const prepared = await this.track(this.connection.prepare(sql))
|
|
41
|
+
try {
|
|
42
|
+
this.assertOpen()
|
|
43
|
+
// Starting the pending query establishes its interruptible context synchronously. Avoid
|
|
44
|
+
// connection.stream() starting execution after an abort that happened during preparation.
|
|
45
|
+
this.resultPromise = this.track(prepared.startStream().getResult()).finally(() => {
|
|
46
|
+
prepared.destroySync()
|
|
47
|
+
})
|
|
48
|
+
// Execute independently after preparation, so a large sort does not occupy the main queue
|
|
49
|
+
// or attachment lease. rows() observes failures even if execution ends before consumption.
|
|
50
|
+
void this.resultPromise.catch(() => {})
|
|
51
|
+
} catch (error) {
|
|
52
|
+
prepared.destroySync()
|
|
53
|
+
throw error
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
async *rows(): AsyncIterable<Record<string, unknown>> {
|
|
58
|
+
if (this.consumed)
|
|
59
|
+
throw new LakeStorageError("[SixbDuckLake] Reader can only be consumed once.")
|
|
60
|
+
this.consumed = true
|
|
61
|
+
try {
|
|
62
|
+
this.assertOpen()
|
|
63
|
+
const result = await this.resultPromise!
|
|
64
|
+
this.assertOpen()
|
|
65
|
+
const batches = result
|
|
66
|
+
.yieldConvertedRowObjects(sixbDuckDbValueConverter)
|
|
67
|
+
[Symbol.asyncIterator]()
|
|
68
|
+
while (true) {
|
|
69
|
+
this.assertOpen()
|
|
70
|
+
const batch = await this.track(batches.next())
|
|
71
|
+
this.assertOpen()
|
|
72
|
+
if (batch.done) {
|
|
73
|
+
this.finished = true
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
for (const row of batch.value) {
|
|
77
|
+
this.assertOpen()
|
|
78
|
+
yield row as Record<string, unknown>
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
} finally {
|
|
82
|
+
await this.close()
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
close(): Promise<void> {
|
|
87
|
+
if (!this.closePromise) {
|
|
88
|
+
this.options.signal?.removeEventListener("abort", this.onAbort)
|
|
89
|
+
if (this.pending) this.connection.interrupt()
|
|
90
|
+
this.closePromise = this.finish()
|
|
91
|
+
}
|
|
92
|
+
return this.closePromise
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
private async finish(): Promise<void> {
|
|
96
|
+
try {
|
|
97
|
+
await this.pending?.catch(() => {})
|
|
98
|
+
if (!this.finished) {
|
|
99
|
+
// node-api 1.5.2 exposes no result.close(). Disconnect alone leaves a paused query's
|
|
100
|
+
// transaction alive until GC. A new statement ends it without draining the whole result.
|
|
101
|
+
await this.connection.run("SELECT 1")
|
|
102
|
+
}
|
|
103
|
+
} finally {
|
|
104
|
+
this.resultPromise = undefined
|
|
105
|
+
try {
|
|
106
|
+
this.connection.closeSync()
|
|
107
|
+
} finally {
|
|
108
|
+
await this.options.onClose?.()
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
private async track<T>(operation: Promise<T>): Promise<T> {
|
|
114
|
+
this.pending = operation
|
|
115
|
+
try {
|
|
116
|
+
return await operation
|
|
117
|
+
} catch (error) {
|
|
118
|
+
this.assertOpen()
|
|
119
|
+
throw error
|
|
120
|
+
} finally {
|
|
121
|
+
if (this.pending === operation) this.pending = undefined
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
private assertOpen(): void {
|
|
126
|
+
this.options.signal?.throwIfAborted()
|
|
127
|
+
if (this.closePromise) throw new LakeStorageError("[SixbDuckLake] Reader is closed.")
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { mkdir, mkdtemp, rm } from "node:fs/promises"
|
|
2
|
+
import { join, resolve } from "node:path"
|
|
1
3
|
import {
|
|
2
4
|
type DuckDBConnection,
|
|
3
5
|
DuckDBInstance,
|
|
@@ -6,6 +8,7 @@ import {
|
|
|
6
8
|
} from "@duckdb/node-api"
|
|
7
9
|
import { LakeStorageError } from "@sixb/core/lake-storage"
|
|
8
10
|
import type { DuckDbRuntimeOptions, DuckLakeStorageOptions } from "../types"
|
|
11
|
+
import { type DuckDbReader, type DuckDbReaderOptions, NodeDuckDbReader } from "./duckdb-reader"
|
|
9
12
|
import { sixbDuckDbValueConverter } from "./duckdb-value-converter"
|
|
10
13
|
import {
|
|
11
14
|
buildAttachSql,
|
|
@@ -20,8 +23,8 @@ import {
|
|
|
20
23
|
* Narrow adapter around `@duckdb/node-api`.
|
|
21
24
|
*
|
|
22
25
|
* Keeping the public provider behind this interface confines the driver types to
|
|
23
|
-
* this module instead of leaking them into `DuckLakeStorage`.
|
|
24
|
-
*
|
|
26
|
+
* this module instead of leaking them into `DuckLakeStorage`. Main-connection calls
|
|
27
|
+
* share one queue; readers use separate connections to the same DuckDB instance.
|
|
25
28
|
*/
|
|
26
29
|
export interface DuckDbQueryRuntime {
|
|
27
30
|
run(sql: string, values?: readonly DuckDBValue[]): Promise<void>
|
|
@@ -34,7 +37,8 @@ export interface DuckDbQueryRuntime {
|
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
export interface DuckDbRuntime extends DuckDbQueryRuntime {
|
|
37
|
-
|
|
40
|
+
openReader(sql: string, options?: DuckDbReaderOptions): Promise<DuckDbReader>
|
|
41
|
+
stopReaders(): Promise<void>
|
|
38
42
|
/**
|
|
39
43
|
* Reserve the runtime queue for a multi-statement critical section.
|
|
40
44
|
*
|
|
@@ -71,15 +75,43 @@ interface SetupDuckLakeOptions {
|
|
|
71
75
|
class NodeDuckDbRuntime implements DuckDbRuntime {
|
|
72
76
|
private closing = false
|
|
73
77
|
private closed = false
|
|
74
|
-
//
|
|
75
|
-
// handlers cannot interleave statements or close/reset an active query.
|
|
78
|
+
// Serialize main-connection calls so transactions and staged writes cannot interleave.
|
|
76
79
|
private operations: Promise<void> = Promise.resolve()
|
|
80
|
+
private readonly readers = new Set<DuckDbReader>()
|
|
81
|
+
private closePromise: Promise<void> | undefined
|
|
77
82
|
|
|
78
83
|
constructor(
|
|
79
84
|
private readonly instance: DuckDBInstance,
|
|
80
|
-
private readonly connection: DuckDBConnection
|
|
85
|
+
private readonly connection: DuckDBConnection,
|
|
86
|
+
private readonly temporaryDirectory?: string
|
|
81
87
|
) {}
|
|
82
88
|
|
|
89
|
+
async openReader(sql: string, options: DuckDbReaderOptions = {}): Promise<DuckDbReader> {
|
|
90
|
+
return this.enqueue(async () => {
|
|
91
|
+
this.assertAcceptingOperations()
|
|
92
|
+
const connection = await this.instance.connect()
|
|
93
|
+
if (this.closing) {
|
|
94
|
+
connection.closeSync()
|
|
95
|
+
this.assertAcceptingOperations()
|
|
96
|
+
}
|
|
97
|
+
const reader = new NodeDuckDbReader(connection, {
|
|
98
|
+
...options,
|
|
99
|
+
onClose: async () => {
|
|
100
|
+
this.readers.delete(reader)
|
|
101
|
+
await options.onClose?.()
|
|
102
|
+
},
|
|
103
|
+
})
|
|
104
|
+
this.readers.add(reader)
|
|
105
|
+
try {
|
|
106
|
+
await reader.start(sql)
|
|
107
|
+
return reader
|
|
108
|
+
} catch (error) {
|
|
109
|
+
await reader.close()
|
|
110
|
+
throw error
|
|
111
|
+
}
|
|
112
|
+
})
|
|
113
|
+
}
|
|
114
|
+
|
|
83
115
|
async run(sql: string, values?: readonly DuckDBValue[]): Promise<void> {
|
|
84
116
|
await this.enqueue(async () => {
|
|
85
117
|
await this.connection.run(sql, values === undefined ? undefined : [...values])
|
|
@@ -107,45 +139,6 @@ class NodeDuckDbRuntime implements DuckDbRuntime {
|
|
|
107
139
|
})
|
|
108
140
|
}
|
|
109
141
|
|
|
110
|
-
async *streamRows(
|
|
111
|
-
sql: string,
|
|
112
|
-
values?: readonly DuckDBValue[]
|
|
113
|
-
): AsyncIterable<Record<string, unknown>> {
|
|
114
|
-
this.assertAcceptingOperations()
|
|
115
|
-
|
|
116
|
-
// A stream holds its queue slot until the consumer finishes or abandons the
|
|
117
|
-
// iterator. This keeps later writes from running while rows are still being
|
|
118
|
-
// read from the same DuckDB connection.
|
|
119
|
-
let releaseOperation: (() => void) | undefined
|
|
120
|
-
const operationFinished = new Promise<void>((resolve) => {
|
|
121
|
-
releaseOperation = resolve
|
|
122
|
-
})
|
|
123
|
-
const waitForTurn = this.operations.then(() => {
|
|
124
|
-
this.assertNotClosed()
|
|
125
|
-
})
|
|
126
|
-
this.operations = waitForTurn
|
|
127
|
-
.then(() => operationFinished)
|
|
128
|
-
.then(
|
|
129
|
-
() => {},
|
|
130
|
-
() => {}
|
|
131
|
-
)
|
|
132
|
-
|
|
133
|
-
try {
|
|
134
|
-
await waitForTurn
|
|
135
|
-
const result = await this.connection.stream(
|
|
136
|
-
sql,
|
|
137
|
-
values === undefined ? undefined : [...values]
|
|
138
|
-
)
|
|
139
|
-
for await (const batch of result.yieldConvertedRowObjects(sixbDuckDbValueConverter)) {
|
|
140
|
-
for (const row of batch) {
|
|
141
|
-
yield row as Record<string, unknown>
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
} finally {
|
|
145
|
-
releaseOperation?.()
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
142
|
async withAppender<T>(
|
|
150
143
|
tableName: string,
|
|
151
144
|
useAppender: (appender: DuckDbAppender) => T | Promise<T>
|
|
@@ -168,18 +161,29 @@ class NodeDuckDbRuntime implements DuckDbRuntime {
|
|
|
168
161
|
})
|
|
169
162
|
}
|
|
170
163
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
164
|
+
close(): Promise<void> {
|
|
165
|
+
this.closePromise ??= this.finish()
|
|
166
|
+
return this.closePromise
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async stopReaders(): Promise<void> {
|
|
170
|
+
const results = await Promise.allSettled([...this.readers].map((reader) => reader.close()))
|
|
171
|
+
const failed = results.find((result) => result.status === "rejected")
|
|
172
|
+
if (failed?.status === "rejected") throw failed.reason
|
|
173
|
+
}
|
|
175
174
|
|
|
175
|
+
private async finish(): Promise<void> {
|
|
176
176
|
this.closing = true
|
|
177
|
+
const results = await Promise.allSettled([...this.readers].map((reader) => reader.close()))
|
|
177
178
|
// resetRuntime()/close() can run while an API read is still using this
|
|
178
179
|
// runtime. Wait for accepted work before closing the native connection.
|
|
179
180
|
await this.operations.catch(() => {})
|
|
180
181
|
this.closed = true
|
|
181
182
|
this.connection.closeSync()
|
|
182
183
|
this.instance.closeSync()
|
|
184
|
+
if (this.temporaryDirectory) await rm(this.temporaryDirectory, { recursive: true, force: true })
|
|
185
|
+
const failed = results.find((result) => result.status === "rejected")
|
|
186
|
+
if (failed?.status === "rejected") throw failed.reason
|
|
183
187
|
}
|
|
184
188
|
|
|
185
189
|
private enqueue<T>(operation: () => T | Promise<T>): Promise<T> {
|
|
@@ -286,8 +290,28 @@ class NodeDuckDbAppenderAdapter implements DuckDbAppender {
|
|
|
286
290
|
export async function createDuckDbRuntime(
|
|
287
291
|
options: DuckDbRuntimeOptions = {}
|
|
288
292
|
): Promise<DuckDbRuntime> {
|
|
289
|
-
const
|
|
290
|
-
|
|
293
|
+
const path = options.path ?? ":memory:"
|
|
294
|
+
const base = options.config?.temp_directory ?? (path === ":memory:" ? ".tmp" : `${path}.tmp`)
|
|
295
|
+
// DuckDB's default .tmp filenames collide between independent instances/processes. Keep the
|
|
296
|
+
// configured disk location, but give each runtime its own directory and cleanup ownership.
|
|
297
|
+
let temporaryDirectory: string | undefined
|
|
298
|
+
if (base !== "") {
|
|
299
|
+
const directory = resolve(base)
|
|
300
|
+
await mkdir(directory, { recursive: true })
|
|
301
|
+
temporaryDirectory = await mkdtemp(join(directory, "sixb-"))
|
|
302
|
+
}
|
|
303
|
+
let instance: DuckDBInstance | undefined
|
|
304
|
+
try {
|
|
305
|
+
instance = await DuckDBInstance.create(path, {
|
|
306
|
+
...options.config,
|
|
307
|
+
...(temporaryDirectory ? { temp_directory: temporaryDirectory } : {}),
|
|
308
|
+
})
|
|
309
|
+
return new NodeDuckDbRuntime(instance, await instance.connect(), temporaryDirectory)
|
|
310
|
+
} catch (error) {
|
|
311
|
+
instance?.closeSync()
|
|
312
|
+
if (temporaryDirectory) await rm(temporaryDirectory, { recursive: true, force: true })
|
|
313
|
+
throw error
|
|
314
|
+
}
|
|
291
315
|
}
|
|
292
316
|
|
|
293
317
|
/**
|