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  }