/
open.go
56 lines (50 loc) · 1.84 KB
/
open.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
// 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 (
"context"
"github.com/EXCCoin/exccwallet/v2/errors"
"github.com/EXCCoin/exccwallet/v2/wallet/walletdb"
"github.com/EXCCoin/exccd/chaincfg/v3"
)
// Open opens the database and returns various "manager" types that must be used
// to access and modify data in the database.
//
// A NotExist error will be returned if the database has not been initialized.
// The recorded database version must match exactly with DBVersion. If the
// version does not match, an Invalid error is returned.
func Open(ctx context.Context, db walletdb.DB, params *chaincfg.Params, pubPass []byte) (addrMgr *Manager, txStore *Store, stakeStore *StakeStore, err error) {
err = walletdb.View(ctx, db, func(tx walletdb.ReadTx) error {
// Verify the database exists and the recorded version is supported by
// this software version.
metadataBucket := tx.ReadBucket(unifiedDBMetadata{}.rootBucketKey())
if metadataBucket == nil {
return errors.E(errors.NotExist, "database has not been initialized")
}
dbVersion, err := unifiedDBMetadata{}.getVersion(metadataBucket)
if err != nil {
return err
}
if dbVersion < DBVersion {
return errors.E(errors.Invalid, "database upgrade required")
}
if dbVersion > DBVersion {
return errors.E(errors.Invalid, "database has been upgraded to an unknown newer version")
}
addrmgrNs := tx.ReadBucket(waddrmgrBucketKey)
stakemgrNs := tx.ReadBucket(wstakemgrBucketKey)
addrMgr, err = loadManager(addrmgrNs, pubPass, params)
if err != nil {
return err
}
txStore = &Store{
chainParams: params,
acctLookupFunc: addrMgr.AddrAccount,
manager: addrMgr,
}
stakeStore, err = openStakeStore(stakemgrNs, addrMgr, params)
return err
})
return
}