quiverdb 0.5.0 → 0.6.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/README.md +108 -108
- package/dist/composites.d.ts +9 -0
- package/dist/composites.d.ts.map +1 -0
- package/dist/composites.js +69 -0
- package/dist/composites.js.map +1 -0
- package/dist/create.d.ts +9 -0
- package/dist/create.d.ts.map +1 -0
- package/dist/create.js +104 -0
- package/dist/create.js.map +1 -0
- package/dist/csv.d.ts +11 -0
- package/dist/csv.d.ts.map +1 -0
- package/dist/csv.js +67 -0
- package/dist/csv.js.map +1 -0
- package/dist/database.d.ts +13 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +42 -0
- package/dist/database.js.map +1 -0
- package/dist/errors.d.ts +5 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +18 -0
- package/dist/errors.js.map +1 -0
- package/dist/ffi-helpers.d.ts +57 -0
- package/dist/ffi-helpers.d.ts.map +1 -0
- package/dist/ffi-helpers.js +136 -0
- package/dist/ffi-helpers.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/introspection.d.ts +10 -0
- package/dist/introspection.d.ts.map +1 -0
- package/dist/introspection.js +27 -0
- package/dist/introspection.js.map +1 -0
- package/dist/loader.d.ts +7 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +165 -0
- package/dist/loader.js.map +1 -0
- package/dist/lua-runner.d.ts +11 -0
- package/dist/lua-runner.d.ts.map +1 -0
- package/dist/lua-runner.js +43 -0
- package/dist/lua-runner.js.map +1 -0
- package/dist/metadata.d.ts +28 -0
- package/dist/metadata.d.ts.map +1 -0
- package/dist/metadata.js +100 -0
- package/dist/metadata.js.map +1 -0
- package/dist/query.d.ts +9 -0
- package/dist/query.d.ts.map +1 -0
- package/dist/query.js +90 -0
- package/dist/query.js.map +1 -0
- package/dist/read.d.ts +25 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +220 -0
- package/dist/read.js.map +1 -0
- package/dist/time-series.d.ts +12 -0
- package/dist/time-series.d.ts.map +1 -0
- package/dist/time-series.js +155 -0
- package/dist/time-series.js.map +1 -0
- package/dist/transaction.d.ts +10 -0
- package/dist/transaction.d.ts.map +1 -0
- package/dist/transaction.js +22 -0
- package/dist/transaction.js.map +1 -0
- package/{src/types.ts → dist/types.d.ts} +1 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +24 -16
- package/src/create.ts +0 -128
- package/src/database.ts +0 -68
- package/src/errors.ts +0 -24
- package/src/ffi-helpers.ts +0 -48
- package/src/index.ts +0 -8
- package/src/loader.ts +0 -286
- package/src/query.ts +0 -164
- package/src/read.ts +0 -231
- package/src/transaction.ts +0 -35
- package/tsconfig.json +0 -13
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import koffi from "koffi";
|
|
2
|
+
import { Database } from "./database.js";
|
|
3
|
+
import { check } from "./errors.js";
|
|
4
|
+
import { allocNativeFloat64, allocNativeInt64, allocNativePtrTable, allocNativeString, allocNativeStringArray, allocPtrOut, allocUint64Out, decodeFloat64Array, decodeInt64Array, decodePtrArray, decodeStringArray, readPtrOut, readUint64Out, } from "./ffi-helpers.js";
|
|
5
|
+
import { getSymbols } from "./loader.js";
|
|
6
|
+
const DATA_TYPE_INTEGER = 0;
|
|
7
|
+
const DATA_TYPE_FLOAT = 1;
|
|
8
|
+
const DATA_TYPE_STRING = 2;
|
|
9
|
+
const DATA_TYPE_DATE_TIME = 3;
|
|
10
|
+
Database.prototype.readTimeSeriesGroup = function (collection, group, id) {
|
|
11
|
+
const lib = getSymbols();
|
|
12
|
+
const outNames = allocPtrOut();
|
|
13
|
+
const outTypes = allocPtrOut();
|
|
14
|
+
const outData = allocPtrOut();
|
|
15
|
+
const outColCount = allocUint64Out();
|
|
16
|
+
const outRowCount = allocUint64Out();
|
|
17
|
+
check(lib.quiver_database_read_time_series_group(this._handle, collection, group, id, outNames, outTypes, outData, outColCount, outRowCount));
|
|
18
|
+
const colCount = readUint64Out(outColCount);
|
|
19
|
+
const rowCount = readUint64Out(outRowCount);
|
|
20
|
+
if (colCount === 0)
|
|
21
|
+
return {};
|
|
22
|
+
const namesPtr = readPtrOut(outNames);
|
|
23
|
+
const typesPtr = readPtrOut(outTypes);
|
|
24
|
+
const dataPtr = readPtrOut(outData);
|
|
25
|
+
const colNames = decodeStringArray(namesPtr, colCount);
|
|
26
|
+
const types = koffi.decode(typesPtr, koffi.array("int", colCount));
|
|
27
|
+
const dataPtrs = decodePtrArray(dataPtr, colCount);
|
|
28
|
+
const result = {};
|
|
29
|
+
for (let c = 0; c < colCount; c++) {
|
|
30
|
+
const colName = colNames[c];
|
|
31
|
+
switch (types[c]) {
|
|
32
|
+
case DATA_TYPE_INTEGER:
|
|
33
|
+
result[colName] = decodeInt64Array(dataPtrs[c], rowCount);
|
|
34
|
+
break;
|
|
35
|
+
case DATA_TYPE_FLOAT:
|
|
36
|
+
result[colName] = decodeFloat64Array(dataPtrs[c], rowCount);
|
|
37
|
+
break;
|
|
38
|
+
case DATA_TYPE_STRING:
|
|
39
|
+
case DATA_TYPE_DATE_TIME:
|
|
40
|
+
result[colName] = decodeStringArray(dataPtrs[c], rowCount);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
lib.quiver_database_free_time_series_data(namesPtr, typesPtr, dataPtr, colCount, rowCount);
|
|
45
|
+
return result;
|
|
46
|
+
};
|
|
47
|
+
Database.prototype.updateTimeSeriesGroup = function (collection, group, id, data) {
|
|
48
|
+
const lib = getSymbols();
|
|
49
|
+
const entries = Object.entries(data);
|
|
50
|
+
if (entries.length === 0) {
|
|
51
|
+
check(lib.quiver_database_update_time_series_group(this._handle, collection, group, id, null, null, null, 0, 0));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const columnCount = entries.length;
|
|
55
|
+
const rowCount = entries[0][1].length;
|
|
56
|
+
const keepalive = [];
|
|
57
|
+
// Build column names as native string array
|
|
58
|
+
const colNames = entries.map(([name]) => name);
|
|
59
|
+
const { table: namesTable, keepalive: namesPtrs } = allocNativeStringArray(colNames);
|
|
60
|
+
keepalive.push(namesTable, ...namesPtrs);
|
|
61
|
+
// Build column types and data
|
|
62
|
+
const typesArr = new Int32Array(columnCount);
|
|
63
|
+
const dataPtrs = [];
|
|
64
|
+
for (let c = 0; c < columnCount; c++) {
|
|
65
|
+
const values = entries[c][1];
|
|
66
|
+
if (values.length === 0) {
|
|
67
|
+
typesArr[c] = DATA_TYPE_STRING;
|
|
68
|
+
dataPtrs.push(null);
|
|
69
|
+
}
|
|
70
|
+
else if (typeof values[0] === "string") {
|
|
71
|
+
typesArr[c] = DATA_TYPE_STRING;
|
|
72
|
+
const { table, keepalive: strPtrs } = allocNativeStringArray(values);
|
|
73
|
+
keepalive.push(table, ...strPtrs);
|
|
74
|
+
dataPtrs.push(table);
|
|
75
|
+
}
|
|
76
|
+
else if (typeof values[0] === "number") {
|
|
77
|
+
const allIntegers = values.every((v) => Number.isInteger(v));
|
|
78
|
+
if (allIntegers) {
|
|
79
|
+
typesArr[c] = DATA_TYPE_INTEGER;
|
|
80
|
+
const p = allocNativeInt64(values);
|
|
81
|
+
keepalive.push(p);
|
|
82
|
+
dataPtrs.push(p);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
typesArr[c] = DATA_TYPE_FLOAT;
|
|
86
|
+
const p = allocNativeFloat64(values);
|
|
87
|
+
keepalive.push(p);
|
|
88
|
+
dataPtrs.push(p);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const dataTable = allocNativePtrTable(dataPtrs);
|
|
93
|
+
keepalive.push(dataTable);
|
|
94
|
+
check(lib.quiver_database_update_time_series_group(this._handle, collection, group, id, namesTable, typesArr, dataTable, columnCount, rowCount));
|
|
95
|
+
};
|
|
96
|
+
Database.prototype.hasTimeSeriesFiles = function (collection) {
|
|
97
|
+
const lib = getSymbols();
|
|
98
|
+
const outResult = new Int32Array(1);
|
|
99
|
+
check(lib.quiver_database_has_time_series_files(this._handle, collection, outResult));
|
|
100
|
+
return outResult[0] !== 0;
|
|
101
|
+
};
|
|
102
|
+
Database.prototype.listTimeSeriesFilesColumns = function (collection) {
|
|
103
|
+
const lib = getSymbols();
|
|
104
|
+
const outColumns = allocPtrOut();
|
|
105
|
+
const outCount = allocUint64Out();
|
|
106
|
+
check(lib.quiver_database_list_time_series_files_columns(this._handle, collection, outColumns, outCount));
|
|
107
|
+
const count = readUint64Out(outCount);
|
|
108
|
+
if (count === 0)
|
|
109
|
+
return [];
|
|
110
|
+
const ptr = readPtrOut(outColumns);
|
|
111
|
+
const result = decodeStringArray(ptr, count);
|
|
112
|
+
lib.quiver_database_free_string_array(ptr, count);
|
|
113
|
+
return result;
|
|
114
|
+
};
|
|
115
|
+
Database.prototype.readTimeSeriesFiles = function (collection) {
|
|
116
|
+
const lib = getSymbols();
|
|
117
|
+
const outColumns = allocPtrOut();
|
|
118
|
+
const outPaths = allocPtrOut();
|
|
119
|
+
const outCount = allocUint64Out();
|
|
120
|
+
check(lib.quiver_database_read_time_series_files(this._handle, collection, outColumns, outPaths, outCount));
|
|
121
|
+
const count = readUint64Out(outCount);
|
|
122
|
+
if (count === 0)
|
|
123
|
+
return {};
|
|
124
|
+
const colsPtr = readPtrOut(outColumns);
|
|
125
|
+
const pathsPtr = readPtrOut(outPaths);
|
|
126
|
+
const colNames = decodeStringArray(colsPtr, count);
|
|
127
|
+
const paths = koffi.decode(pathsPtr, koffi.array("str", count));
|
|
128
|
+
const result = {};
|
|
129
|
+
for (let i = 0; i < count; i++) {
|
|
130
|
+
result[colNames[i]] = paths[i];
|
|
131
|
+
}
|
|
132
|
+
lib.quiver_database_free_time_series_files(colsPtr, pathsPtr, count);
|
|
133
|
+
return result;
|
|
134
|
+
};
|
|
135
|
+
Database.prototype.updateTimeSeriesFiles = function (collection, data) {
|
|
136
|
+
const lib = getSymbols();
|
|
137
|
+
const entries = Object.entries(data);
|
|
138
|
+
if (entries.length === 0)
|
|
139
|
+
return;
|
|
140
|
+
const keepalive = [];
|
|
141
|
+
const colNames = entries.map(([name]) => name);
|
|
142
|
+
const { table: colsTable, keepalive: colPtrs } = allocNativeStringArray(colNames);
|
|
143
|
+
keepalive.push(colsTable, ...colPtrs);
|
|
144
|
+
const pathPtrs = entries.map(([, value]) => {
|
|
145
|
+
if (value === null)
|
|
146
|
+
return null;
|
|
147
|
+
const p = allocNativeString(value);
|
|
148
|
+
keepalive.push(p);
|
|
149
|
+
return p;
|
|
150
|
+
});
|
|
151
|
+
const pathsTable = allocNativePtrTable(pathPtrs);
|
|
152
|
+
keepalive.push(pathsTable);
|
|
153
|
+
check(lib.quiver_database_update_time_series_files(this._handle, collection, colsTable, pathsTable, entries.length));
|
|
154
|
+
};
|
|
155
|
+
//# sourceMappingURL=time-series.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"time-series.js","sourceRoot":"","sources":["../src/time-series.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,sBAAsB,EACtB,WAAW,EACX,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,iBAAiB,EACjB,UAAU,EACV,aAAa,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAezC,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAC5B,MAAM,eAAe,GAAG,CAAC,CAAC;AAC1B,MAAM,gBAAgB,GAAG,CAAC,CAAC;AAC3B,MAAM,mBAAmB,GAAG,CAAC,CAAC;AAE9B,QAAQ,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAA0B,UAAkB,EAAE,KAAa,EAAE,EAAU;IAC9G,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IACrC,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;IAErC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAC9C,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,CAC3F,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAa,CAAC;IAC/E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAEnD,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC5B,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACjB,KAAK,iBAAiB;gBACpB,MAAM,CAAC,OAAO,CAAC,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC1D,MAAM;YACR,KAAK,eAAe;gBAClB,MAAM,CAAC,OAAO,CAAC,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC5D,MAAM;YACR,KAAK,gBAAgB,CAAC;YACtB,KAAK,mBAAmB;gBACtB,MAAM,CAAC,OAAO,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAC3D,MAAM;QACV,CAAC;IACH,CAAC;IAED,GAAG,CAAC,qCAAqC,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC3F,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,QAAQ,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAA0B,UAAkB,EAAE,KAAa,EAAE,EAAU,EAAE,IAAoB;IACtI,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAErC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACjH,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACtC,MAAM,SAAS,GAAoB,EAAE,CAAC;IAEtC,4CAA4C;IAC5C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IACrF,SAAS,CAAC,IAAI,CAAC,UAAU,EAAE,GAAG,SAAS,CAAC,CAAC;IAEzC,8BAA8B;IAC9B,MAAM,QAAQ,GAAG,IAAI,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAoB,EAAE,CAAC;IAErC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAE7B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,QAAQ,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;aAAM,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACzC,QAAQ,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC;YAC/B,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,sBAAsB,CAAC,MAAkB,CAAC,CAAC;YACjF,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,OAAO,CAAC,CAAC;YAClC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YACzC,MAAM,WAAW,GAAI,MAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3E,IAAI,WAAW,EAAE,CAAC;gBAChB,QAAQ,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC;gBAChC,MAAM,CAAC,GAAG,gBAAgB,CAAC,MAAkB,CAAC,CAAC;gBAC/C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC;gBAC9B,MAAM,CAAC,GAAG,kBAAkB,CAAC,MAAkB,CAAC,CAAC;gBACjD,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IAChD,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE1B,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAChD,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,EAAE,EAAE,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,CAC5F,CAAC,CAAC;AACL,CAAC,CAAC;AAEF,QAAQ,CAAC,SAAS,CAAC,kBAAkB,GAAG,UAA0B,UAAkB;IAClF,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,KAAK,CAAC,GAAG,CAAC,qCAAqC,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC;IACtF,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC;AAEF,QAAQ,CAAC,SAAS,CAAC,0BAA0B,GAAG,UAA0B,UAAkB;IAC1F,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC1G,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACnC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,GAAG,CAAC,iCAAiC,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,QAAQ,CAAC,SAAS,CAAC,mBAAmB,GAAG,UAA0B,UAAkB;IACnF,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,KAAK,CAAC,GAAG,CAAC,sCAAsC,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC5G,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAsB,CAAC;IACrF,MAAM,MAAM,GAAkC,EAAE,CAAC;IACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC;IACD,GAAG,CAAC,sCAAsC,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrE,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,QAAQ,CAAC,SAAS,CAAC,qBAAqB,GAAG,UAA0B,UAAkB,EAAE,IAAmC;IAC1H,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IACjC,MAAM,SAAS,GAAoB,EAAE,CAAC;IAEtC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,sBAAsB,CAAC,QAAQ,CAAC,CAAC;IAClF,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,OAAO,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAoB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,EAAE,EAAE;QAC1D,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAChC,MAAM,CAAC,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACnC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC;IACX,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC;IACjD,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAE3B,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;AACvH,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,QAAQ;QAChB,gBAAgB,IAAI,IAAI,CAAC;QACzB,MAAM,IAAI,IAAI,CAAC;QACf,QAAQ,IAAI,IAAI,CAAC;QACjB,aAAa,IAAI,OAAO,CAAC;KAC1B;CACF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Database } from "./database.js";
|
|
2
|
+
import { check } from "./errors.js";
|
|
3
|
+
import { getSymbols } from "./loader.js";
|
|
4
|
+
Database.prototype.beginTransaction = function () {
|
|
5
|
+
const lib = getSymbols();
|
|
6
|
+
check(lib.quiver_database_begin_transaction(this._handle));
|
|
7
|
+
};
|
|
8
|
+
Database.prototype.commit = function () {
|
|
9
|
+
const lib = getSymbols();
|
|
10
|
+
check(lib.quiver_database_commit(this._handle));
|
|
11
|
+
};
|
|
12
|
+
Database.prototype.rollback = function () {
|
|
13
|
+
const lib = getSymbols();
|
|
14
|
+
check(lib.quiver_database_rollback(this._handle));
|
|
15
|
+
};
|
|
16
|
+
Database.prototype.inTransaction = function () {
|
|
17
|
+
const lib = getSymbols();
|
|
18
|
+
const outActive = new Int32Array(1);
|
|
19
|
+
check(lib.quiver_database_in_transaction(this._handle, outActive));
|
|
20
|
+
return outActive[0] !== 0;
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=transaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAWzC,QAAQ,CAAC,SAAS,CAAC,gBAAgB,GAAG;IACpC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,KAAK,CAAC,GAAG,CAAC,iCAAiC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC;AAEF,QAAQ,CAAC,SAAS,CAAC,MAAM,GAAG;IAC1B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC;AAEF,QAAQ,CAAC,SAAS,CAAC,QAAQ,GAAG;IAC5B,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC,CAAC;AAEF,QAAQ,CAAC,SAAS,CAAC,aAAa,GAAG;IACjC,MAAM,GAAG,GAAG,UAAU,EAAE,CAAC;IACzB,MAAM,SAAS,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;IACpC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IACnE,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAC5B,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;AAC1D,MAAM,MAAM,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;AACxD,MAAM,MAAM,KAAK,GAAG,WAAW,GAAG,UAAU,CAAC;AAC7C,MAAM,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC,CAAC;AAC5D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
|
@@ -1,39 +1,47 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "quiverdb",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.6.1",
|
|
4
|
+
"description": "SQLite wrapper binding for Quiver via koffi FFI",
|
|
5
5
|
"type": "module",
|
|
6
|
-
"main": "
|
|
7
|
-
"types": "
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
8
|
"exports": {
|
|
9
|
-
".":
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"types": "./dist/index.d.ts"
|
|
12
|
+
}
|
|
10
13
|
},
|
|
11
14
|
"files": [
|
|
12
|
-
"
|
|
13
|
-
"package.json",
|
|
14
|
-
"tsconfig.json",
|
|
15
|
-
"README.md"
|
|
15
|
+
"dist/"
|
|
16
16
|
],
|
|
17
|
-
"engines": {
|
|
18
|
-
"bun": ">=1.0.0"
|
|
19
|
-
},
|
|
20
17
|
"license": "MIT",
|
|
18
|
+
"repository": {
|
|
19
|
+
"type": "git",
|
|
20
|
+
"url": "https://github.com/psrenergy/quiver",
|
|
21
|
+
"directory": "bindings/js"
|
|
22
|
+
},
|
|
21
23
|
"keywords": [
|
|
22
24
|
"sqlite",
|
|
23
25
|
"database",
|
|
24
26
|
"ffi",
|
|
25
|
-
"
|
|
27
|
+
"node",
|
|
28
|
+
"deno",
|
|
26
29
|
"quiver"
|
|
27
30
|
],
|
|
28
31
|
"scripts": {
|
|
29
|
-
"
|
|
32
|
+
"build": "tsc",
|
|
33
|
+
"test": "vitest run",
|
|
30
34
|
"typecheck": "tsc --noEmit",
|
|
31
35
|
"lint": "biome check",
|
|
32
36
|
"format": "biome format --write"
|
|
33
37
|
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"koffi": "^2.9.0"
|
|
40
|
+
},
|
|
34
41
|
"devDependencies": {
|
|
35
42
|
"@biomejs/biome": "^2.4.6",
|
|
36
|
-
"@types/
|
|
37
|
-
"typescript": "^5.9.3"
|
|
43
|
+
"@types/node": "^22.0.0",
|
|
44
|
+
"typescript": "^5.9.3",
|
|
45
|
+
"vitest": "^3.2.1"
|
|
38
46
|
}
|
|
39
47
|
}
|
package/src/create.ts
DELETED
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { type Pointer, ptr } from "bun:ffi";
|
|
2
|
-
import { Database } from "./database";
|
|
3
|
-
import { check, QuiverError } from "./errors";
|
|
4
|
-
import { allocPointerOut, readPointerOut, toCString } from "./ffi-helpers";
|
|
5
|
-
import { getSymbols } from "./loader";
|
|
6
|
-
import type { ElementData, Value } from "./types";
|
|
7
|
-
|
|
8
|
-
declare module "./database" {
|
|
9
|
-
interface Database {
|
|
10
|
-
createElement(collection: string, data: ElementData): number;
|
|
11
|
-
deleteElement(collection: string, id: number): void;
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
type Symbols = ReturnType<typeof getSymbols>;
|
|
16
|
-
|
|
17
|
-
function setElementArray(lib: Symbols, elemPtr: Pointer, name: string, values: unknown[]): void {
|
|
18
|
-
const cName = toCString(name);
|
|
19
|
-
|
|
20
|
-
if (values.length === 0) {
|
|
21
|
-
// Empty array: pass null pointer with count 0
|
|
22
|
-
check(lib.quiver_element_set_array_integer(elemPtr, cName, null, 0));
|
|
23
|
-
return;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const first = values[0];
|
|
27
|
-
|
|
28
|
-
if (typeof first === "bigint") {
|
|
29
|
-
const arr = BigInt64Array.from(values as bigint[], (v) => BigInt(v));
|
|
30
|
-
check(lib.quiver_element_set_array_integer(elemPtr, cName, ptr(arr), values.length));
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
if (typeof first === "number") {
|
|
35
|
-
const allIntegers = (values as number[]).every((v) => Number.isInteger(v));
|
|
36
|
-
if (allIntegers) {
|
|
37
|
-
const arr = BigInt64Array.from(values as number[], (v) => BigInt(v));
|
|
38
|
-
check(lib.quiver_element_set_array_integer(elemPtr, cName, ptr(arr), values.length));
|
|
39
|
-
} else {
|
|
40
|
-
const arr = Float64Array.from(values as number[]);
|
|
41
|
-
check(lib.quiver_element_set_array_float(elemPtr, cName, ptr(arr), values.length));
|
|
42
|
-
}
|
|
43
|
-
return;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
if (typeof first === "string") {
|
|
47
|
-
// Build pointer table: BigInt64Array of pointers to each string buffer
|
|
48
|
-
const buffers = (values as string[]).map((s) => toCString(s));
|
|
49
|
-
const ptrTable = new BigInt64Array(buffers.length);
|
|
50
|
-
for (let i = 0; i < buffers.length; i++) {
|
|
51
|
-
ptrTable[i] = BigInt(ptr(buffers[i]));
|
|
52
|
-
}
|
|
53
|
-
check(lib.quiver_element_set_array_string(elemPtr, cName, ptr(ptrTable), values.length));
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
throw new QuiverError(`Unsupported array element type for '${name}': ${typeof first}`);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
function setElementField(lib: Symbols, elemPtr: Pointer, name: string, value: Value): void {
|
|
61
|
-
const cName = toCString(name);
|
|
62
|
-
|
|
63
|
-
if (value === null) {
|
|
64
|
-
check(lib.quiver_element_set_null(elemPtr, cName));
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
if (typeof value === "bigint") {
|
|
69
|
-
check(lib.quiver_element_set_integer(elemPtr, cName, value));
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
if (typeof value === "number") {
|
|
74
|
-
if (Number.isInteger(value)) {
|
|
75
|
-
check(lib.quiver_element_set_integer(elemPtr, cName, value));
|
|
76
|
-
} else {
|
|
77
|
-
check(lib.quiver_element_set_float(elemPtr, cName, value));
|
|
78
|
-
}
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
if (typeof value === "string") {
|
|
83
|
-
check(lib.quiver_element_set_string(elemPtr, cName, toCString(value)));
|
|
84
|
-
return;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
if (Array.isArray(value)) {
|
|
88
|
-
setElementArray(lib, elemPtr, name, value);
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
throw new QuiverError(`Unsupported value type for '${name}': ${typeof value}`);
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
Database.prototype.createElement = function (
|
|
96
|
-
this: Database,
|
|
97
|
-
collection: string,
|
|
98
|
-
data: ElementData,
|
|
99
|
-
): number {
|
|
100
|
-
const lib = getSymbols();
|
|
101
|
-
const handle = this._handle; // triggers ensureOpen
|
|
102
|
-
|
|
103
|
-
// Create element handle
|
|
104
|
-
const outElem = allocPointerOut();
|
|
105
|
-
check(lib.quiver_element_create(ptr(outElem)));
|
|
106
|
-
const elemPtr = readPointerOut(outElem);
|
|
107
|
-
|
|
108
|
-
try {
|
|
109
|
-
// Set fields from data object
|
|
110
|
-
for (const [key, value] of Object.entries(data)) {
|
|
111
|
-
if (value === undefined) continue;
|
|
112
|
-
setElementField(lib, elemPtr, key, value);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
// Create element in database
|
|
116
|
-
const outId = new BigInt64Array(1);
|
|
117
|
-
check(lib.quiver_database_create_element(handle, toCString(collection), elemPtr, ptr(outId)));
|
|
118
|
-
|
|
119
|
-
return Number(outId[0]);
|
|
120
|
-
} finally {
|
|
121
|
-
lib.quiver_element_destroy(elemPtr);
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
|
|
125
|
-
Database.prototype.deleteElement = function (this: Database, collection: string, id: number): void {
|
|
126
|
-
const lib = getSymbols();
|
|
127
|
-
check(lib.quiver_database_delete_element(this._handle, toCString(collection), id));
|
|
128
|
-
};
|
package/src/database.ts
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { type Pointer, ptr } from "bun:ffi";
|
|
2
|
-
import { check, QuiverError } from "./errors";
|
|
3
|
-
import { allocPointerOut, makeDefaultOptions, readPointerOut, toCString } from "./ffi-helpers";
|
|
4
|
-
import { getSymbols } from "./loader";
|
|
5
|
-
|
|
6
|
-
export class Database {
|
|
7
|
-
private _ptr: Pointer;
|
|
8
|
-
private _closed = false;
|
|
9
|
-
|
|
10
|
-
private constructor(nativePtr: Pointer) {
|
|
11
|
-
this._ptr = nativePtr;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
static fromSchema(dbPath: string, schemaPath: string): Database {
|
|
15
|
-
const lib = getSymbols();
|
|
16
|
-
const options = makeDefaultOptions();
|
|
17
|
-
const outDb = allocPointerOut();
|
|
18
|
-
|
|
19
|
-
check(
|
|
20
|
-
lib.quiver_database_from_schema(
|
|
21
|
-
toCString(dbPath),
|
|
22
|
-
toCString(schemaPath),
|
|
23
|
-
ptr(options),
|
|
24
|
-
ptr(outDb),
|
|
25
|
-
),
|
|
26
|
-
);
|
|
27
|
-
|
|
28
|
-
const dbPtr = readPointerOut(outDb);
|
|
29
|
-
return new Database(dbPtr);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
static fromMigrations(dbPath: string, migrationsPath: string): Database {
|
|
33
|
-
const lib = getSymbols();
|
|
34
|
-
const options = makeDefaultOptions();
|
|
35
|
-
const outDb = allocPointerOut();
|
|
36
|
-
|
|
37
|
-
check(
|
|
38
|
-
lib.quiver_database_from_migrations(
|
|
39
|
-
toCString(dbPath),
|
|
40
|
-
toCString(migrationsPath),
|
|
41
|
-
ptr(options),
|
|
42
|
-
ptr(outDb),
|
|
43
|
-
),
|
|
44
|
-
);
|
|
45
|
-
|
|
46
|
-
const dbPtr = readPointerOut(outDb);
|
|
47
|
-
return new Database(dbPtr);
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
close(): void {
|
|
51
|
-
if (this._closed) return;
|
|
52
|
-
const lib = getSymbols();
|
|
53
|
-
check(lib.quiver_database_close(this._ptr));
|
|
54
|
-
this._closed = true;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
private ensureOpen(): void {
|
|
58
|
-
if (this._closed) {
|
|
59
|
-
throw new QuiverError("Database is closed");
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
/** @internal */
|
|
64
|
-
get _handle(): Pointer {
|
|
65
|
-
this.ensureOpen();
|
|
66
|
-
return this._ptr;
|
|
67
|
-
}
|
|
68
|
-
}
|
package/src/errors.ts
DELETED
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { CString } from "bun:ffi";
|
|
2
|
-
import { getSymbols } from "./loader";
|
|
3
|
-
|
|
4
|
-
export class QuiverError extends Error {
|
|
5
|
-
constructor(message: string) {
|
|
6
|
-
super(message);
|
|
7
|
-
this.name = "QuiverError";
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export function check(err: number): void {
|
|
12
|
-
if (err !== 0) {
|
|
13
|
-
const lib = getSymbols();
|
|
14
|
-
const errPtr = lib.quiver_get_last_error();
|
|
15
|
-
if (errPtr) {
|
|
16
|
-
const detail = new CString(errPtr).toString();
|
|
17
|
-
if (detail) {
|
|
18
|
-
throw new QuiverError(detail);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
console.warn("check: C API returned error but quiver_get_last_error() is empty");
|
|
22
|
-
throw new QuiverError("Unknown error");
|
|
23
|
-
}
|
|
24
|
-
}
|
package/src/ffi-helpers.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { type Pointer, ptr, read } from "bun:ffi";
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Construct the 8-byte quiver_database_options_t struct manually.
|
|
5
|
-
* Layout: offset 0 = int32 read_only (default 0), offset 4 = int32 console_level (default 1 = QUIVER_LOG_INFO).
|
|
6
|
-
* DO NOT call quiver_database_options_default() -- it returns struct by value which bun:ffi cannot handle.
|
|
7
|
-
*/
|
|
8
|
-
export function makeDefaultOptions(): Uint8Array {
|
|
9
|
-
const buf = new ArrayBuffer(8);
|
|
10
|
-
const view = new Int32Array(buf);
|
|
11
|
-
view[0] = 0; // read_only = false
|
|
12
|
-
view[1] = 1; // console_level = QUIVER_LOG_INFO
|
|
13
|
-
return new Uint8Array(buf);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
/**
|
|
17
|
-
* Allocate a 1-element BigInt64Array (8 bytes) to receive a quiver_database_t** out-parameter.
|
|
18
|
-
* Caller passes ptr(result) to the FFI function.
|
|
19
|
-
*/
|
|
20
|
-
export function allocPointerOut(): BigInt64Array {
|
|
21
|
-
return new BigInt64Array(1);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Read the pointer value from an out-parameter buffer.
|
|
26
|
-
* Dereferences the pointer stored at offset 0 of the typed array.
|
|
27
|
-
* Returns a branded Pointer suitable for passing to FFI functions.
|
|
28
|
-
* read.ptr() returns number at runtime; the cast to Pointer satisfies bun:ffi type signatures.
|
|
29
|
-
*/
|
|
30
|
-
export function readPointerOut(buf: BigInt64Array): Pointer {
|
|
31
|
-
return read.ptr(ptr(buf), 0) as unknown as Pointer;
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
/**
|
|
35
|
-
* Read a pointer at the given byte offset from a base pointer.
|
|
36
|
-
* Wraps read.ptr() with a cast to the branded Pointer type.
|
|
37
|
-
*/
|
|
38
|
-
export function readPtrAt(base: Pointer, byteOffset: number): Pointer {
|
|
39
|
-
return read.ptr(base, byteOffset) as unknown as Pointer;
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Encode a JS string as null-terminated UTF-8 for the C API.
|
|
44
|
-
* Returns a Buffer suitable for passing as FFIType.ptr.
|
|
45
|
-
*/
|
|
46
|
-
export function toCString(str: string): Buffer {
|
|
47
|
-
return Buffer.from(`${str}\0`);
|
|
48
|
-
}
|
package/src/index.ts
DELETED