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  }