summaryrefslogtreecommitdiff
path: root/packages/taler-wallet-core/src/db.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/taler-wallet-core/src/db.ts')
-rw-r--r--packages/taler-wallet-core/src/db.ts66
1 files changed, 66 insertions, 0 deletions
diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts
new file mode 100644
index 000000000..a6eeb1205
--- /dev/null
+++ b/packages/taler-wallet-core/src/db.ts
@@ -0,0 +1,66 @@
+import { Stores } from "./types/dbTypes";
+import { openDatabase, Database, Store, Index } from "./util/query";
+import type { idbtypes } from "idb-bridge";
+
+/**
+ * Name of the Taler database. The name includes the
+ * major version of the DB schema. The version should be incremented
+ * with each major change. When incrementing the major version,
+ * the wallet should import data from the previous version.
+ */
+const TALER_DB_NAME = "taler-walletdb-v7";
+
+/**
+ * Current database minor version, should be incremented
+ * each time we do minor schema changes on the database.
+ * A change is considered minor when fields are added in a
+ * backwards-compatible way or object stores and indices
+ * are added.
+ */
+export const WALLET_DB_MINOR_VERSION = 1;
+
+/**
+ * Return a promise that resolves
+ * to the taler wallet db.
+ */
+export function openTalerDatabase(
+ idbFactory: idbtypes.IDBFactory,
+ onVersionChange: () => void,
+): Promise<idbtypes.IDBDatabase> {
+ const onUpgradeNeeded = (
+ db: idbtypes.IDBDatabase,
+ oldVersion: number,
+ newVersion: number,
+ ): void => {
+ switch (oldVersion) {
+ case 0: // DB does not exist yet
+ for (const n in Stores) {
+ if ((Stores as any)[n] instanceof Store) {
+ const si: Store<any> = (Stores as any)[n];
+ const s = db.createObjectStore(si.name, si.storeParams);
+ for (const indexName in si as any) {
+ if ((si as any)[indexName] instanceof Index) {
+ const ii: Index<any, any> = (si as any)[indexName];
+ s.createIndex(ii.indexName, ii.keyPath, ii.options);
+ }
+ }
+ }
+ }
+ break;
+ default:
+ throw Error("unsupported existig DB version");
+ }
+ };
+
+ return openDatabase(
+ idbFactory,
+ TALER_DB_NAME,
+ WALLET_DB_MINOR_VERSION,
+ onVersionChange,
+ onUpgradeNeeded,
+ );
+}
+
+export function deleteTalerDatabase(idbFactory: idbtypes.IDBFactory): void {
+ Database.deleteDatabase(idbFactory, TALER_DB_NAME);
+}