From 218c7d5bd6a918bd177982f9728ab809e1a3345b Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Tue, 18 Oct 2016 01:47:40 +0200 Subject: be even more safe in db --- lib/wallet/query.ts | 14 +++++++------- lib/wallet/wallet.ts | 15 +++++++++++---- 2 files changed, 18 insertions(+), 11 deletions(-) (limited to 'lib/wallet') diff --git a/lib/wallet/query.ts b/lib/wallet/query.ts index 03b443a6e..ddd22b4cf 100644 --- a/lib/wallet/query.ts +++ b/lib/wallet/query.ts @@ -34,7 +34,7 @@ export class Store { } } -export class Index { +export class Index { indexName: string; storeName: string; @@ -49,7 +49,7 @@ export class Index { * with indices. */ export interface QueryStream { - indexJoin(index: Index, + indexJoin(index: Index, keyFn: (obj: T) => I): QueryStream<[T, S]>; filter(f: (x: any) => boolean): QueryStream; reduce(f: (v: T, acc: S) => S, start?: S): Promise; @@ -92,7 +92,7 @@ abstract class QueryStreamBase implements QueryStream { return new QueryStreamFlatMap(this, f); } - indexJoin(index: Index, + indexJoin(index: Index, keyFn: (obj: T) => I): QueryStream<[T, S]> { this.root.addStoreAccess(index.storeName, false); return new QueryStreamIndexJoin(this, index.storeName, index.indexName, keyFn); @@ -301,7 +301,7 @@ export class QueryRoot { return new IterQueryStream(this, store.name, {}); } - iterIndex(index: Index, only?: S): QueryStream { + iterIndex(index: Index, only?: S): QueryStream { this.stores.add(index.storeName); return new IterQueryStream(this, index.storeName, { only, @@ -377,7 +377,7 @@ export class QueryRoot { /** * Get one object from a store by its key. */ - getIndexed(storeName: string, indexName: string, key: any): Promise { + getIndexed(index: Index, key: I): Promise { if (key === void 0) { throw Error("key must not be undefined"); } @@ -385,13 +385,13 @@ export class QueryRoot { const {resolve, promise} = openPromise(); const doGetIndexed = (tx: IDBTransaction) => { - const req = tx.objectStore(storeName).index(indexName).get(key); + const req = tx.objectStore(index.storeName).index(index.indexName).get(key); req.onsuccess = () => { resolve(req.result); }; }; - this.addWork(doGetIndexed, storeName, false); + this.addWork(doGetIndexed, index.storeName, false); return Promise.resolve() .then(() => this.finish()) .then(() => promise); diff --git a/lib/wallet/wallet.ts b/lib/wallet/wallet.ts index 54c979919..f55ba2170 100644 --- a/lib/wallet/wallet.ts +++ b/lib/wallet/wallet.ts @@ -329,9 +329,17 @@ namespace Stores { timestampIndex = new Index(this, "timestamp"); } + class TransactionsStore extends Store { + constructor() { + super("transactions"); + } + + repurchaseIndex = new Index<[string,string],Transaction>(this, "repurchase"); + } + export let exchanges: ExchangeStore = new ExchangeStore(); - export let transactions: Store = new Store("transactions"); + export let transactions: TransactionsStore = new TransactionsStore(); export let reserves: Store = new Store("reserves"); export let coins: CoinsStore = new CoinsStore(); export let refresh: Store = new Store("refresh"); @@ -1444,10 +1452,9 @@ export class Wallet { console.log("no repurchase: no correlation id"); return {isRepurchase: false}; } - let result: Transaction = await ( + let result: Transaction|undefined = await ( this.q() - .getIndexed("transactions", - "repurchase", + .getIndexed(Stores.transactions.repurchaseIndex, [ contract.merchant_pub, contract.repurchase_correlation_id -- cgit v1.2.3