gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[GNUnet-SVN] [taler-wallet-webex] 02/04: make sure that refreshing works


From: gnunet
Subject: [GNUnet-SVN] [taler-wallet-webex] 02/04: make sure that refreshing works after refund
Date: Sun, 27 Aug 2017 06:48:04 +0200

This is an automated email from the git hooks/post-receive script.

dold pushed a commit to branch master
in repository wallet-webex.

commit 63914ab53b18ec29269c2c3fe4e01ac9b36330e5
Author: Florian Dold <address@hidden>
AuthorDate: Sun Aug 27 05:42:46 2017 +0200

    make sure that refreshing works after refund
---
 src/query.ts  | 18 ++++++++++++++++--
 src/types.ts  |  5 +++++
 src/wallet.ts | 37 +++++++++++++++++++++----------------
 3 files changed, 42 insertions(+), 18 deletions(-)

diff --git a/src/query.ts b/src/query.ts
index ee1ac260..d7689f2b 100644
--- a/src/query.ts
+++ b/src/query.ts
@@ -547,9 +547,18 @@ export class QueryRoot {
 
   private finished: boolean = false;
 
+  private keys: { [keyName: string]: IDBValidKey } = {};
+
   constructor(public db: IDBDatabase) {
   }
 
+  /**
+   * Get a named key that was created during the query.
+   */
+  key(keyName: string): IDBValidKey|undefined {
+    return this.keys[keyName];
+  }
+
   private checkFinished() {
     if (this.finished) {
       throw Error("Can't add work to query after it was started");
@@ -627,10 +636,15 @@ export class QueryRoot {
    * Overrides if an existing object with the same key exists
    * in the store.
    */
-  put<T>(store: Store<T>, val: T): QueryRoot {
+  put<T>(store: Store<T>, val: T, keyName?: string): QueryRoot {
     this.checkFinished();
     const doPut = (tx: IDBTransaction) => {
-      tx.objectStore(store.name).put(val);
+      const req = tx.objectStore(store.name).put(val);
+      if (keyName) {
+        req.onsuccess = () => {
+            this.keys[keyName] = req.result;
+        };
+      }
     };
     this.scheduleFinish();
     this.addWork(doPut, store.name, true);
diff --git a/src/types.ts b/src/types.ts
index aabf4ffc..9492d1a7 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -759,6 +759,11 @@ export interface RefreshSessionRecord {
    * Is this session finished?
    */
   finished: boolean;
+
+  /**
+   * Record ID when retrieved from the DB.
+   */
+  id?: number;
 }
 
 
diff --git a/src/wallet.ts b/src/wallet.ts
index 72c8a70f..e7a36f7b 100644
--- a/src/wallet.ts
+++ b/src/wallet.ts
@@ -555,7 +555,7 @@ export namespace Stores {
   export const nonces = new NonceStore();
   export const precoins = new Store<PreCoinRecord>("precoins", {keyPath: 
"coinPub"});
   export const proposals = new ProposalsStore();
-  export const refresh = new Store<RefreshSessionRecord>("refresh", {keyPath: 
"meltCoinPub"});
+  export const refresh = new Store<RefreshSessionRecord>("refresh", {keyPath: 
"id", autoIncrement: true});
   export const reserves = new Store<ReserveRecord>("reserves", {keyPath: 
"reserve_pub"});
   export const purchases = new PurchasesStore();
 }
@@ -1836,7 +1836,7 @@ export class Wallet {
       if (c.suspended) {
         return balance;
       }
-      if (!(c.status === CoinStatus.Dirty || c.status === CoinStatus.Fresh)) {
+      if (!(c.status === CoinStatus.Fresh)) {
         return balance;
       }
       console.log("collecting balance");
@@ -1999,25 +1999,30 @@ export class Wallet {
 
     // Store refresh session and subtract refreshed amount from
     // coin in the same transaction.
-    await this.q()
-              .put(Stores.refresh, refreshSession)
-              .mutate(Stores.coins, coin.coinPub, mutateCoin)
-              .finish();
+    const query = this.q();
+    query.put(Stores.refresh, refreshSession, "refreshKey")
+         .mutate(Stores.coins, coin.coinPub, mutateCoin);
+    await query.finish();
+
+    const key = query.key("refreshKey");
+    if (!key || typeof key !== "number") {
+      throw Error("insert failed");
+    }
+
+    refreshSession.id = key;
 
     return refreshSession;
   }
 
 
   async refresh(oldCoinPub: string): Promise<void> {
-    let refreshSession: RefreshSessionRecord|undefined;
-    const oldSession = await this.q().get(Stores.refresh, oldCoinPub);
-    if (oldSession) {
-      console.log("got old session for", oldCoinPub);
-      console.log(oldSession);
-      refreshSession = oldSession;
-    } else {
-      refreshSession = await this.createRefreshSession(oldCoinPub);
+
+    const oldRefreshSessions = await this.q().iter(Stores.refresh).toArray();
+    for (const session of oldRefreshSessions) {
+      console.log("got old session for", oldCoinPub, session);
+      this.continueRefreshSession(session);
     }
+    let refreshSession = await this.createRefreshSession(oldCoinPub);
     if (!refreshSession) {
       // refreshing not necessary
       console.log("not refreshing", oldCoinPub);
@@ -2031,9 +2036,8 @@ export class Wallet {
       return;
     }
     if (typeof refreshSession.norevealIndex !== "number") {
-      const coinPub = refreshSession.meltCoinPub;
       await this.refreshMelt(refreshSession);
-      const r = await this.q().get<RefreshSessionRecord>(Stores.refresh, 
coinPub);
+      const r = await this.q().get<RefreshSessionRecord>(Stores.refresh, 
refreshSession.id);
       if (!r) {
         throw Error("refresh session does not exist anymore");
       }
@@ -2441,6 +2445,7 @@ export class Wallet {
       console.error(`Exchange ${req.exchange} not known to the wallet`);
       return;
     }
+    console.log("selecting coins for return:", req);
     const cds = await this.getCoinsForReturn(req.exchange, req.amount);
     console.log(cds);
 

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

[Prev in Thread] Current Thread [Next in Thread]