@duckdb/node-api 1.1.2-alpha.1

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/LICENSE ADDED
@@ -0,0 +1,7 @@
1
+ Copyright 2018-2023 Stichting DuckDB Foundation
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
4
+
5
+ The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # DuckDB Node API
2
+
3
+ API for using DuckDB in Node.
4
+
5
+ [Documentation](https://github.com/duckdb/duckdb-node-neo)
@@ -0,0 +1,36 @@
1
+ import duckdb from '@duckdb/node-bindings';
2
+ import { DuckDBType } from './DuckDBType';
3
+ import { Date_, Interval, Time, Timestamp } from './DuckDBValue';
4
+ import { DuckDBDataChunk } from './DuckDBDataChunk';
5
+ export declare class DuckDBAppender {
6
+ private readonly appender;
7
+ constructor(appender: duckdb.Appender);
8
+ dispose(): void;
9
+ close(): void;
10
+ flush(): void;
11
+ get columnCount(): number;
12
+ columnType(columnIndex: number): DuckDBType;
13
+ endRow(): void;
14
+ appendDefault(): void;
15
+ appendBoolean(value: boolean): void;
16
+ appendTinyInt(value: number): void;
17
+ appendSmallInt(value: number): void;
18
+ appendInteger(value: number): void;
19
+ appendBigInt(value: bigint): void;
20
+ appendHugeInt(value: bigint): void;
21
+ appendUTinyInt(value: number): void;
22
+ appendUSmallInt(value: number): void;
23
+ appendUInteger(value: number): void;
24
+ appendUBigInt(value: bigint): void;
25
+ appendUHugeInt(value: bigint): void;
26
+ appendFloat(value: number): void;
27
+ appendDouble(value: number): void;
28
+ appendDate(value: Date_): void;
29
+ appendTime(value: Time): void;
30
+ appendTimestamp(value: Timestamp): void;
31
+ appendInterval(value: Interval): void;
32
+ appendVarchar(value: string): void;
33
+ appendBlob(value: Uint8Array): void;
34
+ appendNull(): void;
35
+ appendDataChunk(dataChunk: DuckDBDataChunk): void;
36
+ }
@@ -0,0 +1,106 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DuckDBAppender = void 0;
7
+ const node_bindings_1 = __importDefault(require("@duckdb/node-bindings"));
8
+ const DuckDBLogicalType_1 = require("./DuckDBLogicalType");
9
+ class DuckDBAppender {
10
+ appender;
11
+ constructor(appender) {
12
+ this.appender = appender;
13
+ }
14
+ dispose() {
15
+ node_bindings_1.default.appender_destroy(this.appender);
16
+ }
17
+ close() {
18
+ node_bindings_1.default.appender_close(this.appender);
19
+ }
20
+ flush() {
21
+ node_bindings_1.default.appender_flush(this.appender);
22
+ }
23
+ get columnCount() {
24
+ return node_bindings_1.default.appender_column_count(this.appender);
25
+ }
26
+ columnType(columnIndex) {
27
+ return DuckDBLogicalType_1.DuckDBLogicalType.consumeAsType(node_bindings_1.default.appender_column_type(this.appender, columnIndex));
28
+ }
29
+ endRow() {
30
+ node_bindings_1.default.appender_end_row(this.appender);
31
+ }
32
+ appendDefault() {
33
+ node_bindings_1.default.append_default(this.appender);
34
+ }
35
+ appendBoolean(value) {
36
+ node_bindings_1.default.append_bool(this.appender, value);
37
+ }
38
+ appendTinyInt(value) {
39
+ node_bindings_1.default.append_int8(this.appender, value);
40
+ }
41
+ appendSmallInt(value) {
42
+ node_bindings_1.default.append_int16(this.appender, value);
43
+ }
44
+ appendInteger(value) {
45
+ node_bindings_1.default.append_int32(this.appender, value);
46
+ }
47
+ appendBigInt(value) {
48
+ node_bindings_1.default.append_int64(this.appender, value);
49
+ }
50
+ appendHugeInt(value) {
51
+ node_bindings_1.default.append_hugeint(this.appender, value);
52
+ }
53
+ appendUTinyInt(value) {
54
+ node_bindings_1.default.append_uint8(this.appender, value);
55
+ }
56
+ appendUSmallInt(value) {
57
+ node_bindings_1.default.append_uint16(this.appender, value);
58
+ }
59
+ appendUInteger(value) {
60
+ node_bindings_1.default.append_uint32(this.appender, value);
61
+ }
62
+ appendUBigInt(value) {
63
+ node_bindings_1.default.append_uint64(this.appender, value);
64
+ }
65
+ appendUHugeInt(value) {
66
+ node_bindings_1.default.append_uhugeint(this.appender, value);
67
+ }
68
+ // TODO: append DECIMAL?
69
+ appendFloat(value) {
70
+ node_bindings_1.default.append_float(this.appender, value);
71
+ }
72
+ appendDouble(value) {
73
+ node_bindings_1.default.append_double(this.appender, value);
74
+ }
75
+ appendDate(value) {
76
+ node_bindings_1.default.append_date(this.appender, value);
77
+ }
78
+ appendTime(value) {
79
+ node_bindings_1.default.append_time(this.appender, value);
80
+ }
81
+ appendTimestamp(value) {
82
+ node_bindings_1.default.append_timestamp(this.appender, value);
83
+ }
84
+ // TODO: append TIMESTAMPS_S/_MS/_NS?
85
+ // TODO: append TIME_TZ/TIMESTAMP_TZ?
86
+ appendInterval(value) {
87
+ node_bindings_1.default.append_interval(this.appender, value);
88
+ }
89
+ appendVarchar(value) {
90
+ node_bindings_1.default.append_varchar(this.appender, value);
91
+ }
92
+ appendBlob(value) {
93
+ node_bindings_1.default.append_blob(this.appender, value);
94
+ }
95
+ // TODO: append ENUM?
96
+ // TODO: append nested types? (ARRAY, LIST, STRUCT, MAP, UNION)
97
+ // TODO: append UUID?
98
+ // TODO: append BIT?
99
+ appendNull() {
100
+ node_bindings_1.default.append_null(this.appender);
101
+ }
102
+ appendDataChunk(dataChunk) {
103
+ node_bindings_1.default.append_data_chunk(this.appender, dataChunk.chunk);
104
+ }
105
+ }
106
+ exports.DuckDBAppender = DuckDBAppender;
@@ -0,0 +1,18 @@
1
+ import duckdb from '@duckdb/node-bindings';
2
+ import { DuckDBAppender } from './DuckDBAppender';
3
+ import { DuckDBExtractedStatements } from './DuckDBExtractedStatements';
4
+ import { DuckDBInstance } from './DuckDBInstance';
5
+ import { DuckDBPreparedStatement } from './DuckDBPreparedStatement';
6
+ import { DuckDBResult } from './DuckDBResult';
7
+ export declare class DuckDBConnection {
8
+ private readonly connection;
9
+ constructor(connection: duckdb.Connection);
10
+ static create(instance: DuckDBInstance): Promise<DuckDBConnection>;
11
+ dispose(): Promise<void>;
12
+ interrupt(): void;
13
+ get progress(): duckdb.QueryProgress;
14
+ run(sql: string): Promise<DuckDBResult>;
15
+ prepare(sql: string): Promise<DuckDBPreparedStatement>;
16
+ extractStatements(sql: string): Promise<DuckDBExtractedStatements>;
17
+ createAppender(schema: string, table: string): Promise<DuckDBAppender>;
18
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DuckDBConnection = void 0;
7
+ const node_bindings_1 = __importDefault(require("@duckdb/node-bindings"));
8
+ const DuckDBAppender_1 = require("./DuckDBAppender");
9
+ const DuckDBExtractedStatements_1 = require("./DuckDBExtractedStatements");
10
+ const DuckDBPreparedStatement_1 = require("./DuckDBPreparedStatement");
11
+ const DuckDBResult_1 = require("./DuckDBResult");
12
+ class DuckDBConnection {
13
+ connection;
14
+ constructor(connection) {
15
+ this.connection = connection;
16
+ }
17
+ static async create(instance) {
18
+ return instance.connect();
19
+ }
20
+ dispose() {
21
+ return node_bindings_1.default.disconnect(this.connection);
22
+ }
23
+ interrupt() {
24
+ node_bindings_1.default.interrupt(this.connection);
25
+ }
26
+ get progress() {
27
+ return node_bindings_1.default.query_progress(this.connection);
28
+ }
29
+ async run(sql) {
30
+ return new DuckDBResult_1.DuckDBResult(await node_bindings_1.default.query(this.connection, sql));
31
+ }
32
+ async prepare(sql) {
33
+ return new DuckDBPreparedStatement_1.DuckDBPreparedStatement(await node_bindings_1.default.prepare(this.connection, sql));
34
+ }
35
+ async extractStatements(sql) {
36
+ const { extracted_statements, statement_count } = await node_bindings_1.default.extract_statements(this.connection, sql);
37
+ if (statement_count === 0) {
38
+ try {
39
+ throw new Error(`Failed to extract statements: ${node_bindings_1.default.extract_statements_error(extracted_statements)}`);
40
+ }
41
+ finally {
42
+ node_bindings_1.default.destroy_extracted(extracted_statements);
43
+ }
44
+ }
45
+ return new DuckDBExtractedStatements_1.DuckDBExtractedStatements(this.connection, extracted_statements, statement_count);
46
+ }
47
+ async createAppender(schema, table) {
48
+ return new DuckDBAppender_1.DuckDBAppender(node_bindings_1.default.appender_create(this.connection, schema, table));
49
+ }
50
+ }
51
+ exports.DuckDBConnection = DuckDBConnection;
@@ -0,0 +1,13 @@
1
+ import duckdb from '@duckdb/node-bindings';
2
+ import { DuckDBVector } from './DuckDBVector';
3
+ export declare class DuckDBDataChunk {
4
+ readonly chunk: duckdb.DataChunk;
5
+ constructor(chunk: duckdb.DataChunk);
6
+ static create(logical_types: duckdb.LogicalType[]): DuckDBDataChunk;
7
+ dispose(): void;
8
+ reset(): void;
9
+ get columnCount(): number;
10
+ getColumn(columnIndex: number): DuckDBVector<any>;
11
+ get rowCount(): number;
12
+ set rowCount(count: number);
13
+ }
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DuckDBDataChunk = void 0;
7
+ const node_bindings_1 = __importDefault(require("@duckdb/node-bindings"));
8
+ const DuckDBVector_1 = require("./DuckDBVector");
9
+ class DuckDBDataChunk {
10
+ chunk;
11
+ constructor(chunk) {
12
+ this.chunk = chunk;
13
+ }
14
+ static create(logical_types) {
15
+ return new DuckDBDataChunk(node_bindings_1.default.create_data_chunk(logical_types));
16
+ }
17
+ dispose() {
18
+ node_bindings_1.default.destroy_data_chunk(this.chunk);
19
+ }
20
+ reset() {
21
+ node_bindings_1.default.data_chunk_reset(this.chunk);
22
+ }
23
+ get columnCount() {
24
+ return node_bindings_1.default.data_chunk_get_column_count(this.chunk);
25
+ }
26
+ getColumn(columnIndex) {
27
+ // TODO: cache vectors?
28
+ return DuckDBVector_1.DuckDBVector.create(node_bindings_1.default.data_chunk_get_vector(this.chunk, columnIndex), this.rowCount);
29
+ }
30
+ get rowCount() {
31
+ return node_bindings_1.default.data_chunk_get_size(this.chunk);
32
+ }
33
+ set rowCount(count) {
34
+ node_bindings_1.default.data_chunk_set_size(this.chunk, count);
35
+ }
36
+ }
37
+ exports.DuckDBDataChunk = DuckDBDataChunk;
@@ -0,0 +1,11 @@
1
+ import duckdb from '@duckdb/node-bindings';
2
+ import { DuckDBPreparedStatement } from './DuckDBPreparedStatement';
3
+ export declare class DuckDBExtractedStatements {
4
+ private readonly connection;
5
+ private readonly extracted_statements;
6
+ private readonly statement_count;
7
+ constructor(connection: duckdb.Connection, extracted_statements: duckdb.ExtractedStatements, statement_count: number);
8
+ dispose(): void;
9
+ get count(): number;
10
+ prepare(index: number): Promise<DuckDBPreparedStatement>;
11
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DuckDBExtractedStatements = void 0;
7
+ const node_bindings_1 = __importDefault(require("@duckdb/node-bindings"));
8
+ const DuckDBPreparedStatement_1 = require("./DuckDBPreparedStatement");
9
+ class DuckDBExtractedStatements {
10
+ connection;
11
+ extracted_statements;
12
+ statement_count;
13
+ constructor(connection, extracted_statements, statement_count) {
14
+ this.connection = connection;
15
+ this.extracted_statements = extracted_statements;
16
+ this.statement_count = statement_count;
17
+ }
18
+ dispose() {
19
+ node_bindings_1.default.destroy_extracted(this.extracted_statements);
20
+ }
21
+ get count() {
22
+ return this.statement_count;
23
+ }
24
+ async prepare(index) {
25
+ return new DuckDBPreparedStatement_1.DuckDBPreparedStatement(await node_bindings_1.default.prepare_extracted_statement(this.connection, this.extracted_statements, index));
26
+ }
27
+ }
28
+ exports.DuckDBExtractedStatements = DuckDBExtractedStatements;
@@ -0,0 +1,9 @@
1
+ import duckdb from '@duckdb/node-bindings';
2
+ import { DuckDBConnection } from './DuckDBConnection';
3
+ export declare class DuckDBInstance {
4
+ private readonly db;
5
+ constructor(db: duckdb.Database);
6
+ static create(path?: string, options?: Record<string, string>): Promise<DuckDBInstance>;
7
+ dispose(): Promise<void>;
8
+ connect(): Promise<DuckDBConnection>;
9
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DuckDBInstance = void 0;
7
+ const node_bindings_1 = __importDefault(require("@duckdb/node-bindings"));
8
+ const DuckDBConnection_1 = require("./DuckDBConnection");
9
+ class DuckDBInstance {
10
+ db;
11
+ constructor(db) {
12
+ this.db = db;
13
+ }
14
+ static async create(path, options) {
15
+ if (options) {
16
+ const config = node_bindings_1.default.create_config();
17
+ try {
18
+ for (const optionName in options) {
19
+ const optionValue = options[optionName];
20
+ node_bindings_1.default.set_config(config, optionName, optionValue);
21
+ }
22
+ return new DuckDBInstance(await node_bindings_1.default.open(path, config));
23
+ }
24
+ finally {
25
+ node_bindings_1.default.destroy_config(config);
26
+ }
27
+ }
28
+ else {
29
+ return new DuckDBInstance(await node_bindings_1.default.open(path));
30
+ }
31
+ }
32
+ dispose() {
33
+ return node_bindings_1.default.close(this.db);
34
+ }
35
+ async connect() {
36
+ return new DuckDBConnection_1.DuckDBConnection(await node_bindings_1.default.connect(this.db));
37
+ }
38
+ }
39
+ exports.DuckDBInstance = DuckDBInstance;
@@ -0,0 +1,70 @@
1
+ import duckdb from '@duckdb/node-bindings';
2
+ import { DuckDBDecimalType, DuckDBEnumType, DuckDBListType, DuckDBMapType, DuckDBStructType, DuckDBType, DuckDBUnionType } from './DuckDBType';
3
+ import { DuckDBTypeId } from './DuckDBTypeId';
4
+ export declare class DuckDBLogicalType {
5
+ readonly logical_type: duckdb.LogicalType;
6
+ protected constructor(logical_type: duckdb.LogicalType);
7
+ static consumeAsType(logical_type: duckdb.LogicalType): DuckDBType;
8
+ static create(logical_type: duckdb.LogicalType): DuckDBLogicalType;
9
+ static createDecimal(width: number, scale: number): DuckDBDecimalLogicalType;
10
+ static createEnum(member_names: readonly string[]): DuckDBEnumLogicalType;
11
+ static createList(valueType: DuckDBLogicalType): DuckDBListLogicalType;
12
+ static createStruct(entries: readonly DuckDBLogicalStructEntry[]): DuckDBStructLogicalType;
13
+ static createMap(keyType: DuckDBLogicalType, valueType: DuckDBLogicalType): DuckDBMapLogicalType;
14
+ static createArray(valueType: DuckDBLogicalType, length: number): DuckDBArrayLogicalType;
15
+ static createUnion(alternatives: readonly DuckDBLogicalUnionAlternative[]): DuckDBUnionLogicalType;
16
+ dispose(): void;
17
+ get typeId(): DuckDBTypeId;
18
+ get alias(): string | null;
19
+ set alias(newAlias: string);
20
+ asType(): DuckDBType;
21
+ }
22
+ export declare class DuckDBDecimalLogicalType extends DuckDBLogicalType {
23
+ get width(): number;
24
+ get scale(): number;
25
+ get internalTypeId(): DuckDBTypeId;
26
+ asType(): DuckDBDecimalType;
27
+ }
28
+ export declare class DuckDBEnumLogicalType extends DuckDBLogicalType {
29
+ get valueCount(): number;
30
+ value(index: number): string;
31
+ values(): readonly string[];
32
+ get internalTypeId(): DuckDBTypeId;
33
+ asType(): DuckDBEnumType;
34
+ }
35
+ export declare class DuckDBListLogicalType extends DuckDBLogicalType {
36
+ get valueType(): DuckDBLogicalType;
37
+ asType(): DuckDBListType;
38
+ }
39
+ export interface DuckDBLogicalStructEntry {
40
+ readonly name: string;
41
+ readonly valueType: DuckDBLogicalType;
42
+ }
43
+ export declare class DuckDBStructLogicalType extends DuckDBLogicalType {
44
+ get entryCount(): number;
45
+ entryName(index: number): string;
46
+ entryValueType(index: number): DuckDBLogicalType;
47
+ entries(): readonly DuckDBLogicalStructEntry[];
48
+ asType(): DuckDBStructType;
49
+ }
50
+ export declare class DuckDBMapLogicalType extends DuckDBLogicalType {
51
+ get keyType(): DuckDBLogicalType;
52
+ get valueType(): DuckDBLogicalType;
53
+ asType(): DuckDBMapType;
54
+ }
55
+ export declare class DuckDBArrayLogicalType extends DuckDBLogicalType {
56
+ get valueType(): DuckDBLogicalType;
57
+ get length(): number;
58
+ asType(): DuckDBListType;
59
+ }
60
+ export interface DuckDBLogicalUnionAlternative {
61
+ readonly tag: string;
62
+ readonly valueType: DuckDBLogicalType;
63
+ }
64
+ export declare class DuckDBUnionLogicalType extends DuckDBLogicalType {
65
+ get alternativeCount(): number;
66
+ alternativeTag(index: number): string;
67
+ alternativeValueType(index: number): DuckDBLogicalType;
68
+ alternatives(): readonly DuckDBLogicalUnionAlternative[];
69
+ asType(): DuckDBUnionType;
70
+ }