wallet-core/packages/taler-wallet-core/src/db.ts

91 lines
2.8 KiB
TypeScript
Raw Normal View History

2019-12-13 13:10:20 +01:00
import { Stores } from "./types/dbTypes";
2019-12-19 13:48:37 +01:00
import { openDatabase, Database, Store, Index } from "./util/query";
2020-11-16 14:12:37 +01:00
import { IDBFactory, IDBDatabase, IDBObjectStore, IDBTransaction } from "idb-bridge";
import { Logger } from './util/logging';
2019-07-31 01:33:56 +02:00
2020-05-08 14:15:23 +02:00
/**
2020-09-08 17:46:11 +02:00
* Name of the Taler database. This is effectively the major
* version of the DB schema. Whenever it changes, custom import logic
* for all previous versions must be written, which should be
* avoided.
2020-05-08 14:15:23 +02:00
*/
2020-09-08 17:46:11 +02:00
const TALER_DB_NAME = "taler-wallet-prod-v1";
2019-07-31 01:33:56 +02:00
2019-12-13 13:10:20 +01:00
/**
2020-05-08 14:15:23 +02:00
* 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.
2019-12-13 13:10:20 +01:00
*/
2020-11-16 14:12:37 +01:00
export const WALLET_DB_MINOR_VERSION = 2;
const logger = new Logger("db.ts");
2019-12-13 13:10:20 +01:00
2019-07-31 01:33:56 +02:00
/**
* Return a promise that resolves
* to the taler wallet db.
*/
2019-12-12 22:39:45 +01:00
export function openTalerDatabase(
idbFactory: IDBFactory,
2019-07-31 01:33:56 +02:00
onVersionChange: () => void,
): Promise<IDBDatabase> {
2019-12-19 13:48:37 +01:00
const onUpgradeNeeded = (
db: IDBDatabase,
2019-12-19 13:48:37 +01:00
oldVersion: number,
newVersion: number,
2020-11-16 14:12:37 +01:00
upgradeTransaction: IDBTransaction,
2020-04-07 10:07:32 +02:00
): void => {
2020-11-16 14:12:37 +01:00
if (oldVersion === 0) {
for (const n in Stores) {
if ((Stores as any)[n] instanceof Store) {
2020-11-27 11:23:06 +01:00
const si: Store<string, any> = (Stores as any)[n];
2020-11-16 14:12:37 +01:00
const s = db.createObjectStore(si.name, si.storeParams);
for (const indexName in si as any) {
if ((si as any)[indexName] instanceof Index) {
2020-11-27 11:23:06 +01:00
const ii: Index<string, string, any, any> = (si as any)[indexName];
2020-11-16 14:12:37 +01:00
s.createIndex(ii.indexName, ii.keyPath, ii.options);
}
}
}
}
return;
}
if (oldVersion === newVersion) {
return;
}
logger.info(`upgrading database from ${oldVersion} to ${newVersion}`);
for (const n in Stores) {
if ((Stores as any)[n] instanceof Store) {
2020-11-27 11:23:06 +01:00
const si: Store<string, any> = (Stores as any)[n];
2020-11-16 14:12:37 +01:00
let s: IDBObjectStore;
if ((si.storeParams?.versionAdded ?? 1) > oldVersion) {
s = db.createObjectStore(si.name, si.storeParams);
} else {
s = upgradeTransaction.objectStore(si.name);
}
for (const indexName in si as any) {
if ((si as any)[indexName] instanceof Index) {
2020-11-27 11:23:06 +01:00
const ii: Index<string, string, any, any> = (si as any)[indexName];
2020-11-16 14:12:37 +01:00
if ((ii.options?.versionAdded ?? 0) > oldVersion) {
s.createIndex(ii.indexName, ii.keyPath, ii.options);
2019-12-19 13:48:37 +01:00
}
}
}
2020-11-16 14:12:37 +01:00
}
2019-12-19 13:48:37 +01:00
}
};
2019-12-12 22:39:45 +01:00
return openDatabase(
idbFactory,
TALER_DB_NAME,
WALLET_DB_MINOR_VERSION,
2019-12-12 22:39:45 +01:00
onVersionChange,
2019-12-19 13:48:37 +01:00
onUpgradeNeeded,
2019-12-12 22:39:45 +01:00
);
2019-07-31 01:33:56 +02:00
}
export function deleteTalerDatabase(idbFactory: IDBFactory): void {
2019-12-12 22:39:45 +01:00
Database.deleteDatabase(idbFactory, TALER_DB_NAME);
2019-12-19 13:48:37 +01:00
}