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