decred.org/dcrwallet/v3@v3.1.0/wallet/udb/open.go (about) 1 // Copyright (c) 2017 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 // Open opens the database and returns various "manager" types that must be used 16 // to access and modify data in the database. 17 // 18 // A NotExist error will be returned if the database has not been initialized. 19 // The recorded database version must match exactly with DBVersion. If the 20 // version does not match, an Invalid error is returned. 21 func Open(ctx context.Context, db walletdb.DB, params *chaincfg.Params, pubPass []byte) (addrMgr *Manager, txStore *Store, stakeStore *StakeStore, err error) { 22 err = walletdb.View(ctx, db, func(tx walletdb.ReadTx) error { 23 // Verify the database exists and the recorded version is supported by 24 // this software version. 25 metadataBucket := tx.ReadBucket(unifiedDBMetadata{}.rootBucketKey()) 26 if metadataBucket == nil { 27 return errors.E(errors.NotExist, "database has not been initialized") 28 } 29 dbVersion, err := unifiedDBMetadata{}.getVersion(metadataBucket) 30 if err != nil { 31 return err 32 } 33 if dbVersion < DBVersion { 34 return errors.E(errors.Invalid, "database upgrade required") 35 } 36 if dbVersion > DBVersion { 37 return errors.E(errors.Invalid, "database has been upgraded to an unknown newer version") 38 } 39 40 addrmgrNs := tx.ReadBucket(waddrmgrBucketKey) 41 stakemgrNs := tx.ReadBucket(wstakemgrBucketKey) 42 43 addrMgr, err = loadManager(addrmgrNs, pubPass, params) 44 if err != nil { 45 return err 46 } 47 txStore = &Store{ 48 chainParams: params, 49 acctLookupFunc: addrMgr.AddrAccount, 50 manager: addrMgr, 51 } 52 stakeStore, err = openStakeStore(stakemgrNs, addrMgr, params) 53 return err 54 }) 55 return 56 }