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";
|
2019-07-31 01:33:56 +02:00
|
|
|
|
2020-05-08 14:15:23 +02:00
|
|
|
/**
|
|
|
|
* 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.
|
|
|
|
*/
|
2020-07-16 19:22:56 +02:00
|
|
|
const TALER_DB_NAME = "taler-walletdb-v6";
|
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-07-09 15:26:18 +02:00
|
|
|
export const WALLET_DB_MINOR_VERSION = 1;
|
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(
|
2019-07-31 01:33:56 +02:00
|
|
|
idbFactory: IDBFactory,
|
|
|
|
onVersionChange: () => void,
|
|
|
|
): Promise<IDBDatabase> {
|
2019-12-19 13:48:37 +01:00
|
|
|
const onUpgradeNeeded = (
|
|
|
|
db: IDBDatabase,
|
|
|
|
oldVersion: number,
|
|
|
|
newVersion: number,
|
2020-04-07 10:07:32 +02:00
|
|
|
): void => {
|
2019-12-19 13:48:37 +01:00
|
|
|
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");
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2019-12-12 22:39:45 +01:00
|
|
|
return openDatabase(
|
|
|
|
idbFactory,
|
|
|
|
TALER_DB_NAME,
|
2020-07-09 15:26:18 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
|
2020-04-07 10:07:32 +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
|
|
|
}
|