From 4649469b58b9a4068fa94de07f415f1bbc58794c Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 21 Sep 2022 21:47:00 +0200 Subject: wallet-core: DB improvements --- packages/taler-wallet-core/src/util/query.ts | 40 +++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 7 deletions(-) (limited to 'packages/taler-wallet-core/src/util') diff --git a/packages/taler-wallet-core/src/util/query.ts b/packages/taler-wallet-core/src/util/query.ts index 3d4ff79cb..71d7b9783 100644 --- a/packages/taler-wallet-core/src/util/query.ts +++ b/packages/taler-wallet-core/src/util/query.ts @@ -61,6 +61,13 @@ export interface IndexOptions { * undefined if added in the first version. */ versionAdded?: number; + + /** + * Does this index enforce unique keys? + * + * Defaults to false. + */ + unique?: boolean; } function requestToPromise(req: IDBRequest): Promise { @@ -276,6 +283,7 @@ export interface IndexDescriptor { name: string; keyPath: IDBKeyPath | IDBKeyPath[]; multiEntry?: boolean; + unique?: boolean; } export interface StoreDescriptor { @@ -292,7 +300,11 @@ export interface StoreOptions { export function describeContents( options: StoreOptions, ): StoreDescriptor { - return { keyPath: options.keyPath, _dummy: undefined as any }; + return { + keyPath: options.keyPath, + _dummy: undefined as any, + autoIncrement: options.autoIncrement, + }; } export function describeIndex( @@ -304,6 +316,7 @@ export function describeIndex( keyPath, name, multiEntry: options.multiEntry, + unique: options.unique, }; } @@ -339,11 +352,18 @@ export interface StoreReadOnlyAccessor { indexes: GetIndexReadOnlyAccess; } +export interface InsertResponse { + /** + * Key of the newly inserted (via put/add) record. + */ + key: IDBValidKey; +} + export interface StoreReadWriteAccessor { get(key: IDBValidKey): Promise; iter(query?: IDBValidKey): ResultStream; - put(r: RecordType): Promise; - add(r: RecordType): Promise; + put(r: RecordType): Promise; + add(r: RecordType): Promise; delete(key: IDBValidKey): Promise; indexes: GetIndexReadWriteAccess; } @@ -577,13 +597,19 @@ function makeWriteContext( const req = tx.objectStore(storeName).openCursor(query); return new ResultStream(req); }, - add(r) { + async add(r) { const req = tx.objectStore(storeName).add(r); - return requestToPromise(req); + const key = await requestToPromise(req); + return { + key: key, + }; }, - put(r) { + async put(r) { const req = tx.objectStore(storeName).put(r); - return requestToPromise(req); + const key = await requestToPromise(req); + return { + key: key, + }; }, delete(k) { const req = tx.objectStore(storeName).delete(k); -- cgit v1.2.3