decred.org/dcrwallet/v3@v3.1.0/wallet/udb/migration.go (about) 1 // Copyright (c) 2017-2018 The Decred developers 2 // Use of this source code is governed by an ISC 3 // license that can be found in the LICENSE file. 4 5 package udb 6 7 import ( 8 "context" 9 10 "decred.org/dcrwallet/v3/errors" 11 "decred.org/dcrwallet/v3/wallet/walletdb" 12 "github.com/decred/dcrd/chaincfg/v3" 13 ) 14 15 // Old package namespace bucket keys. These are still used as of the very first 16 // unified database layout. 17 var ( 18 waddrmgrBucketKey = []byte("waddrmgr") 19 wtxmgrBucketKey = []byte("wtxmgr") 20 wstakemgrBucketKey = []byte("wstakemgr") 21 ) 22 23 // NeedsMigration checks whether the database needs to be converted to the 24 // unified database format. 25 func NeedsMigration(ctx context.Context, db walletdb.DB) (bool, error) { 26 var needsMigration bool 27 err := walletdb.View(ctx, db, func(tx walletdb.ReadTx) error { 28 needsMigration = tx.ReadBucket(unifiedDBMetadata{}.rootBucketKey()) == nil 29 return nil 30 }) 31 return needsMigration, err 32 } 33 34 // Migrate converts a database to the first version of the unified database 35 // format. If any old upgrades are necessary, they are performed first. 36 // Upgrades added after the migration was implemented may still need to be 37 // performed. 38 func Migrate(ctx context.Context, db walletdb.DB, params *chaincfg.Params) error { 39 return walletdb.Update(ctx, db, func(tx walletdb.ReadWriteTx) error { 40 addrmgrNs := tx.ReadWriteBucket(waddrmgrBucketKey) 41 txmgrNs := tx.ReadWriteBucket(wtxmgrBucketKey) 42 stakemgrNs := tx.ReadWriteBucket(wstakemgrBucketKey) 43 44 stakeStoreVersionName := []byte("stakestorever") 45 46 // Perform any necessary upgrades for the old address manager. 47 err := upgradeManager(addrmgrNs) 48 if err != nil { 49 return err 50 } 51 52 // Perform any necessary upgrades for the old transaction manager. 53 err = upgradeTxDB(txmgrNs, params) 54 if err != nil { 55 return err 56 } 57 58 // The old stake manager had no upgrades, so nothing to do there. 59 60 // Now that all the old managers are upgraded, their versions can be 61 // removed and a single unified db version can be written in their 62 // place. 63 err = addrmgrNs.NestedReadWriteBucket(mainBucketName).Delete(mgrVersionName) 64 if err != nil { 65 return errors.E(errors.IO, err) 66 } 67 err = txmgrNs.Delete(rootVersion) 68 if err != nil { 69 return errors.E(errors.IO, err) 70 } 71 err = stakemgrNs.NestedReadWriteBucket(mainBucketName).Delete(stakeStoreVersionName) 72 if err != nil { 73 return errors.E(errors.IO, err) 74 } 75 metadataBucket, err := tx.CreateTopLevelBucket(unifiedDBMetadata{}.rootBucketKey()) 76 if err != nil { 77 return errors.E(errors.IO, err) 78 } 79 return unifiedDBMetadata{}.putVersion(metadataBucket, initialVersion) 80 }) 81 }