diff options
author | Florian Dold <florian@dold.me> | 2023-01-23 13:56:22 +0100 |
---|---|---|
committer | Florian Dold <florian@dold.me> | 2023-01-23 13:56:22 +0100 |
commit | 3222617b8177314cb417ca01049317c40870ac0a (patch) | |
tree | 11a81086f56c95e8df90b48ad73b4fd21c979284 /packages/taler-wallet-core/src | |
parent | 509011f9bca5c0693102b780fa782e910217f1ae (diff) | |
download | wallet-core-3222617b8177314cb417ca01049317c40870ac0a.tar.xz |
wallet-core: make DB migration logic more tolerant
Diffstat (limited to 'packages/taler-wallet-core/src')
-rw-r--r-- | packages/taler-wallet-core/src/db.ts | 60 |
1 files changed, 39 insertions, 21 deletions
diff --git a/packages/taler-wallet-core/src/db.ts b/packages/taler-wallet-core/src/db.ts index 72e9aff04..bde386766 100644 --- a/packages/taler-wallet-core/src/db.ts +++ b/packages/taler-wallet-core/src/db.ts @@ -2468,8 +2468,14 @@ export async function applyFixups( }); } +/** + * Upgrade an IndexedDB in an upgrade transaction. + * + * The upgrade is made based on a store map, i.e. the metadata + * structure that describes all the object stores and indexes. + */ function upgradeFromStoreMap( - storeMap: any, + storeMap: any, // FIXME: nail down type db: IDBDatabase, oldVersion: number, newVersion: number, @@ -2511,16 +2517,23 @@ function upgradeFromStoreMap( continue; } let s: IDBObjectStore; - try { - s = db.createObjectStore(swi.storeName, { - autoIncrement: storeDesc.autoIncrement, - keyPath: storeDesc.keyPath, - }); - } catch (e) { - const moreInfo = e instanceof Error ? ` Reason: ${e.message}` : ""; - throw Error( - `Migration failed. Could not create store ${swi.storeName}.${moreInfo}`, - ); + // Be tolerant if object store already exists. + // Probably means somebody deployed without + // adding the "addedInVersion" attribute. + if (!upgradeTransaction.objectStoreNames.contains(swi.storeName)) { + try { + s = db.createObjectStore(swi.storeName, { + autoIncrement: storeDesc.autoIncrement, + keyPath: storeDesc.keyPath, + }); + } catch (e) { + const moreInfo = e instanceof Error ? ` Reason: ${e.message}` : ""; + throw Error( + `Migration failed. Could not create store ${swi.storeName}.${moreInfo}`, + ); + } + } else { + s = upgradeTransaction.objectStore(swi.storeName); } for (const indexName in swi.indexMap as any) { const indexDesc: IndexDescriptor = swi.indexMap[indexName]; @@ -2528,16 +2541,21 @@ function upgradeFromStoreMap( if (indexAddedVersion <= oldVersion) { continue; } - try { - s.createIndex(indexDesc.name, indexDesc.keyPath, { - multiEntry: indexDesc.multiEntry, - unique: indexDesc.unique, - }); - } catch (e) { - const moreInfo = e instanceof Error ? ` Reason: ${e.message}` : ""; - throw Error( - `Migration failed. Could not create index ${indexDesc.name}/${indexDesc.keyPath}.${moreInfo}`, - ); + // Be tolerant if index already exists. + // Probably means somebody deployed without + // adding the "addedInVersion" attribute. + if (!s.indexNames.contains(indexDesc.name)) { + try { + s.createIndex(indexDesc.name, indexDesc.keyPath, { + multiEntry: indexDesc.multiEntry, + unique: indexDesc.unique, + }); + } catch (e) { + const moreInfo = e instanceof Error ? ` Reason: ${e.message}` : ""; + throw Error( + `Migration failed. Could not create index ${indexDesc.name}/${indexDesc.keyPath}.${moreInfo}`, + ); + } } } } |