From d4be3906e32ac7d9933c6030d6493f2f2152bdd9 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 12 Oct 2016 02:55:53 +0200 Subject: tree view of wallet db --- lib/wallet/query.ts | 58 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 20 deletions(-) (limited to 'lib/wallet/query.ts') diff --git a/lib/wallet/query.ts b/lib/wallet/query.ts index 3119aa58f..77a4f8e35 100644 --- a/lib/wallet/query.ts +++ b/lib/wallet/query.ts @@ -34,11 +34,12 @@ export function Query(db: IDBDatabase) { */ export interface QueryStream { indexJoin(storeName: string, - indexName: string, - keyFn: (obj: any) => any): QueryStream<[T,S]>; + indexName: string, + keyFn: (obj: any) => any): QueryStream<[T, S]>; filter(f: (x: any) => boolean): QueryStream; reduce(f: (v: T, acc: S) => S, start?: S): Promise; flatMap(f: (x: T) => T[]): QueryStream; + toArray(): Promise; } @@ -57,14 +58,14 @@ function openPromise() { // Never happens, unless JS implementation is broken throw Error(); } - return {resolve, reject, promise}; + return { resolve, reject, promise }; } abstract class QueryStreamBase implements QueryStream { abstract subscribe(f: (isDone: boolean, - value: any, - tx: IDBTransaction) => void): void; + value: any, + tx: IDBTransaction) => void): void; root: QueryRoot; @@ -77,8 +78,8 @@ abstract class QueryStreamBase implements QueryStream { } indexJoin(storeName: string, - indexName: string, - key: any): QueryStream<[T,S]> { + indexName: string, + key: any): QueryStream<[T, S]> { this.root.addStoreAccess(storeName, false); return new QueryStreamIndexJoin(this, storeName, indexName, key); } @@ -87,6 +88,23 @@ abstract class QueryStreamBase implements QueryStream { return new QueryStreamFilter(this, f); } + toArray(): Promise { + let {resolve, promise} = openPromise(); + let values: T[] = []; + + this.subscribe((isDone, value) => { + if (isDone) { + resolve(values); + return; + } + values.push(value); + }); + + return Promise.resolve() + .then(() => this.root.finish()) + .then(() => promise); + } + reduce(f: (x: any, acc?: A) => A, init?: A): Promise { let {resolve, promise} = openPromise(); let acc = init; @@ -100,8 +118,8 @@ abstract class QueryStreamBase implements QueryStream { }); return Promise.resolve() - .then(() => this.root.finish()) - .then(() => promise); + .then(() => this.root.finish()) + .then(() => promise); } } @@ -161,7 +179,7 @@ class QueryStreamFlatMap extends QueryStreamBase { } -class QueryStreamIndexJoin extends QueryStreamBase<[T, S]> { +class QueryStreamIndexJoin extends QueryStreamBase<[T, S]> { s: QueryStreamBase; storeName: string; key: any; @@ -214,11 +232,11 @@ class IterQueryStream extends QueryStreamBase { let s: any; if (indexName !== void 0) { s = tx.objectStore(this.storeName) - .index(this.options.indexName); + .index(this.options.indexName); } else { s = tx.objectStore(this.storeName); } - let kr: IDBKeyRange|undefined = undefined; + let kr: IDBKeyRange | undefined = undefined; if (only !== undefined) { kr = IDBKeyRange.only(this.options.only); } @@ -264,9 +282,9 @@ class QueryRoot { } iter(storeName: string, - {only = undefined, indexName = undefined} = {}): QueryStream { + {only = undefined, indexName = undefined} = {}): QueryStream { this.stores.add(storeName); - return new IterQueryStream(this, storeName, {only, indexName}); + return new IterQueryStream(this, storeName, { only, indexName }); } /** @@ -330,8 +348,8 @@ class QueryRoot { this.addWork(doGet, storeName, false); return Promise.resolve() - .then(() => this.finish()) - .then(() => promise); + .then(() => this.finish()) + .then(() => promise); } /** @@ -353,8 +371,8 @@ class QueryRoot { this.addWork(doGetIndexed, storeName, false); return Promise.resolve() - .then(() => this.finish()) - .then(() => promise); + .then(() => this.finish()) + .then(() => promise); } /** @@ -396,8 +414,8 @@ class QueryRoot { * Low-level function to add a task to the internal work queue. */ addWork(workFn: (t: IDBTransaction) => void, - storeName?: string, - isWrite?: boolean) { + storeName?: string, + isWrite?: boolean) { this.work.push(workFn); if (storeName) { this.addStoreAccess(storeName, isWrite); -- cgit v1.2.3