aboutsummaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/host-impl.qtart.ts
diff options
context:
space:
mode:
authorFlorian Dold <florian@dold.me>2023-07-11 15:41:48 +0200
committerFlorian Dold <florian@dold.me>2023-08-22 08:01:13 +0200
commitb2d0ad57ddf251a109d536cdc49fb6505dbdc50c (patch)
tree7eaeca3ad8ec97a9c1970c1004feda2d61c3441b /packages/taler-wallet-core/src/host-impl.qtart.ts
parent58fdf9dc091b076787a9746c405fe6a9366f5da6 (diff)
downloadwallet-core-b2d0ad57ddf251a109d536cdc49fb6505dbdc50c.tar.xz
sqlite3 backend for idb-bridge / wallet-core
Diffstat (limited to 'packages/taler-wallet-core/src/host-impl.qtart.ts')
-rw-r--r--packages/taler-wallet-core/src/host-impl.qtart.ts116
1 files changed, 104 insertions, 12 deletions
diff --git a/packages/taler-wallet-core/src/host-impl.qtart.ts b/packages/taler-wallet-core/src/host-impl.qtart.ts
index d10914b10..390282f8c 100644
--- a/packages/taler-wallet-core/src/host-impl.qtart.ts
+++ b/packages/taler-wallet-core/src/host-impl.qtart.ts
@@ -22,11 +22,17 @@
/**
* Imports.
*/
-import type { IDBFactory } from "@gnu-taler/idb-bridge";
+import type {
+ IDBFactory,
+ ResultRow,
+ Sqlite3Interface,
+ Sqlite3Statement,
+} from "@gnu-taler/idb-bridge";
// eslint-disable-next-line no-duplicate-imports
import {
BridgeIDBFactory,
MemoryBackend,
+ createSqliteBackend,
shimIndexedDB,
} from "@gnu-taler/idb-bridge";
import { AccessStats } from "@gnu-taler/idb-bridge";
@@ -41,12 +47,78 @@ import { DefaultNodeWalletArgs, makeTempfileId } from "./host-common.js";
const logger = new Logger("host-impl.qtart.ts");
-export async function createNativeWalletHost2(
+interface MakeDbResult {
+ idbFactory: BridgeIDBFactory;
+ getStats: () => AccessStats;
+}
+
+let numStmt = 0;
+
+export async function createQtartSqlite3Impl(): Promise<Sqlite3Interface> {
+ const tart: any = (globalThis as any)._tart;
+ if (!tart) {
+ throw Error("globalThis._qtart not defined");
+ }
+ return {
+ open(filename: string) {
+ const internalDbHandle = tart.sqlite3Open(filename);
+ return {
+ internalDbHandle,
+ close() {
+ tart.sqlite3Close(internalDbHandle);
+ },
+ prepare(stmtStr): Sqlite3Statement {
+ const stmtHandle = tart.sqlite3Prepare(internalDbHandle, stmtStr);
+ return {
+ internalStatement: stmtHandle,
+ getAll(params): ResultRow[] {
+ numStmt++;
+ return tart.sqlite3StmtGetAll(stmtHandle, params);
+ },
+ getFirst(params): ResultRow | undefined {
+ numStmt++;
+ return tart.sqlite3StmtGetFirst(stmtHandle, params);
+ },
+ run(params) {
+ numStmt++;
+ return tart.sqlite3StmtRun(stmtHandle, params);
+ },
+ };
+ },
+ exec(sqlStr): void {
+ numStmt++;
+ tart.sqlite3Exec(internalDbHandle, sqlStr);
+ },
+ };
+ },
+ };
+}
+
+async function makeSqliteDb(
+ args: DefaultNodeWalletArgs,
+): Promise<MakeDbResult> {
+ BridgeIDBFactory.enableTracing = false;
+ const imp = await createQtartSqlite3Impl();
+ const myBackend = await createSqliteBackend(imp, {
+ filename: args.persistentStoragePath ?? ":memory:",
+ });
+ myBackend.trackStats = true;
+ myBackend.enableTracing = false;
+ const myBridgeIdbFactory = new BridgeIDBFactory(myBackend);
+ return {
+ getStats() {
+ return {
+ ...myBackend.accessStats,
+ primitiveStatements: numStmt,
+ }
+ },
+ idbFactory: myBridgeIdbFactory,
+ };
+}
+
+async function makeFileDb(
args: DefaultNodeWalletArgs = {},
-): Promise<{
- wallet: Wallet;
- getDbStats: () => AccessStats;
-}> {
+): Promise<MakeDbResult> {
BridgeIDBFactory.enableTracing = false;
const myBackend = new MemoryBackend();
myBackend.enableTracing = false;
@@ -78,12 +150,34 @@ export async function createNativeWalletHost2(
};
}
- logger.info("done processing storage path");
+ const myBridgeIdbFactory = new BridgeIDBFactory(myBackend);
+ return {
+ idbFactory: myBridgeIdbFactory,
+ getStats: () => myBackend.accessStats,
+ };
+}
+export async function createNativeWalletHost2(
+ args: DefaultNodeWalletArgs = {},
+): Promise<{
+ wallet: Wallet;
+ getDbStats: () => AccessStats;
+}> {
BridgeIDBFactory.enableTracing = false;
- const myBridgeIdbFactory = new BridgeIDBFactory(myBackend);
- const myIdbFactory: IDBFactory = myBridgeIdbFactory as any as IDBFactory;
+ let dbResp: MakeDbResult;
+
+ if (args.persistentStoragePath && args.persistentStoragePath.endsWith(".json")) {
+ logger.info("using JSON file backend (slow!)");
+ dbResp = await makeFileDb(args);
+ } else {
+ logger.info("using JSON file backend (experimental!)");
+ dbResp = await makeSqliteDb(args)
+ }
+
+ const myIdbFactory: IDBFactory = dbResp.idbFactory as any as IDBFactory;
+
+ shimIndexedDB(dbResp.idbFactory);
let myHttpLib;
if (args.httpLib) {
@@ -102,8 +196,6 @@ export async function createNativeWalletHost2(
);
};
- shimIndexedDB(myBridgeIdbFactory);
-
const myDb = await openTalerDatabase(myIdbFactory, myVersionChange);
let workerFactory;
@@ -124,6 +216,6 @@ export async function createNativeWalletHost2(
}
return {
wallet: w,
- getDbStats: () => myBackend.accessStats,
+ getDbStats: dbResp.getStats,
};
}