From 7c03db9ba0fcbf10da8fc37ff55b6d987aab8541 Mon Sep 17 00:00:00 2001 From: Florian Dold Date: Wed, 2 Mar 2016 00:47:00 +0100 Subject: db versioning --- content_scripts/notify.js | 6 ++++-- lib/wallet/db.ts | 14 ++++++++++++-- lib/wallet/wallet.ts | 7 +++++-- lib/wallet/wxMessaging.ts | 8 +++++--- popup/popup.tsx | 32 +++++++++++++++++++++++++++----- 5 files changed, 53 insertions(+), 14 deletions(-) diff --git a/content_scripts/notify.js b/content_scripts/notify.js index ee0d96d72..1a8f56b99 100644 --- a/content_scripts/notify.js +++ b/content_scripts/notify.js @@ -13,12 +13,14 @@ You should have received a copy of the GNU General Public License along with TALER; see the file COPYING. If not, If not, see */ -/// -"use strict"; /** * Script that is injected into (all!) pages to allow them * to interact with the GNU Taler wallet via DOM Events. + * + * @author Florian Dold */ +/// +"use strict"; // Make sure we don't pollute the namespace too much. var TalerNotify; (function (TalerNotify) { diff --git a/lib/wallet/db.ts b/lib/wallet/db.ts index 2503468d5..9374aa447 100644 --- a/lib/wallet/db.ts +++ b/lib/wallet/db.ts @@ -25,7 +25,7 @@ */ const DB_NAME = "taler"; -const DB_VERSION = 1; +const DB_VERSION = 5; /** * Return a promise that resolves @@ -45,7 +45,8 @@ export function openTalerDb(): Promise { console.log("DB: upgrade needed: oldVersion = " + e.oldVersion); switch (e.oldVersion) { case 0: // DB does not exist yet - const exchanges = db.createObjectStore("exchanges", {keyPath: "baseUrl"}); + const exchanges = db.createObjectStore("exchanges", + {keyPath: "baseUrl"}); exchanges.createIndex("pubKey", "masterPublicKey"); db.createObjectStore("reserves", {keyPath: "reserve_pub"}); db.createObjectStore("denoms", {keyPath: "denomPub"}); @@ -68,6 +69,15 @@ export function openTalerDb(): Promise { }); history.createIndex("timestamp", "timestamp"); break; + default: + if (e.oldVersion != DB_VERSION) { + window.alert("Incompatible wallet dababase version, please reset" + + " db."); + chrome.browserAction.setBadgeText({text: "R!"}); + chrome.browserAction.setBadgeBackgroundColor({color: "#F00"}); + throw Error("incompatible DB"); + } + break; } }; }); diff --git a/lib/wallet/wallet.ts b/lib/wallet/wallet.ts index 94ac8ee8a..3764edfbc 100644 --- a/lib/wallet/wallet.ts +++ b/lib/wallet/wallet.ts @@ -912,7 +912,10 @@ export class Wallet { return Query(this.db) .iter("coins") - .reduce(collectBalances, {}); + .reduce(collectBalances, {}) + .then(byCurrency => { + return {balances: byCurrency}; + }); } @@ -922,7 +925,7 @@ export class Wallet { getHistory(): Promise { function collect(x, acc) { acc.push(x); - return acc; + return {history: acc}; } return Query(this.db) diff --git a/lib/wallet/wxMessaging.ts b/lib/wallet/wxMessaging.ts index a6b3f9d1b..d49a80efb 100644 --- a/lib/wallet/wxMessaging.ts +++ b/lib/wallet/wxMessaging.ts @@ -47,9 +47,11 @@ function makeHandlers(db: IDBDatabase, return exportDb(db); }, ["reset"]: function(detail) { - let tx = db.transaction(db.objectStoreNames, 'readwrite'); - for (let i = 0; i < db.objectStoreNames.length; i++) { - tx.objectStore(db.objectStoreNames[i]).clear(); + if (db) { + let tx = db.transaction(db.objectStoreNames, 'readwrite'); + for (let i = 0; i < db.objectStoreNames.length; i++) { + tx.objectStore(db.objectStoreNames[i]).clear(); + } } deleteDb(); diff --git a/popup/popup.tsx b/popup/popup.tsx index 2cd753e4f..be33f870a 100644 --- a/popup/popup.tsx +++ b/popup/popup.tsx @@ -95,6 +95,7 @@ namespace WalletBalance { class Controller { myWallet; + gotError = false; constructor() { this.updateBalance(); @@ -104,9 +105,16 @@ namespace WalletBalance { updateBalance() { m.startComputation(); - chrome.runtime.sendMessage({type: "balances"}, (wallet) => { - console.log("got wallet", wallet); - this.myWallet = wallet; + chrome.runtime.sendMessage({type: "balances"}, (resp) => { + if (resp.error) { + this.gotError = true; + console.error("could not retrieve balances", resp); + m.endComputation(); + return; + } + this.gotError = false; + console.log("got wallet", resp); + this.myWallet = resp.balances; m.endComputation(); }); } @@ -114,6 +122,9 @@ namespace WalletBalance { export function view(ctrl: Controller) { let wallet = ctrl.myWallet; + if (ctrl.gotError) { + return i18n`Error: could not retrieve balance information.`; + } if (!wallet) { throw Error("Could not retrieve wallet"); } @@ -200,6 +211,7 @@ namespace WalletHistory { class Controller { myHistory; + gotError = false; constructor() { this.update(); @@ -209,8 +221,15 @@ namespace WalletHistory { update() { m.startComputation(); chrome.runtime.sendMessage({type: "get-history"}, (resp) => { - console.log("got history", history); - this.myHistory = resp; + if (resp.error) { + this.gotError = true; + console.error("could not retrieve history", resp); + m.endComputation(); + return; + } + this.gotError = false; + console.log("got history", resp.history); + this.myHistory = resp.history; m.endComputation(); }); } @@ -218,6 +237,9 @@ namespace WalletHistory { export function view(ctrl: Controller) { let history = ctrl.myHistory; + if (ctrl.gotError) { + return i18n`Error: could not retrieve event history`; + } if (!history) { throw Error("Could not retrieve history"); } -- cgit v1.2.3