github.com/decred/dcrlnd@v0.7.6/channeldb/meta.go (about)

     1  package channeldb
     2  
     3  import (
     4  	"github.com/decred/dcrlnd/kvdb"
     5  )
     6  
     7  var (
     8  	// metaBucket stores all the meta information concerning the state of
     9  	// the database.
    10  	metaBucket = []byte("metadata")
    11  
    12  	// dbVersionKey is a bboltdb key and it's used for storing/retrieving
    13  	// current database version.
    14  	dbVersionKey = []byte("dbp")
    15  )
    16  
    17  // Meta structure holds the database meta information.
    18  type Meta struct {
    19  	// DbVersionNumber is the current schema version of the database.
    20  	DbVersionNumber uint32
    21  }
    22  
    23  // FetchMeta fetches the meta data from bboltdb and returns filled meta
    24  // structure.
    25  func (d *DB) FetchMeta(tx kvdb.RTx) (*Meta, error) {
    26  	var meta *Meta
    27  
    28  	err := kvdb.View(d, func(tx kvdb.RTx) error {
    29  		return fetchMeta(meta, tx)
    30  	}, func() {
    31  		meta = &Meta{}
    32  	})
    33  	if err != nil {
    34  		return nil, err
    35  	}
    36  
    37  	return meta, nil
    38  }
    39  
    40  // fetchMeta is an internal helper function used in order to allow callers to
    41  // re-use a database transaction. See the publicly exported FetchMeta method
    42  // for more information.
    43  func fetchMeta(meta *Meta, tx kvdb.RTx) error {
    44  	metaBucket := tx.ReadBucket(metaBucket)
    45  	if metaBucket == nil {
    46  		return ErrMetaNotFound
    47  	}
    48  
    49  	data := metaBucket.Get(dbVersionKey)
    50  	if data == nil {
    51  		meta.DbVersionNumber = getLatestDBVersion(dbVersions)
    52  	} else {
    53  		meta.DbVersionNumber = byteOrder.Uint32(data)
    54  	}
    55  
    56  	return nil
    57  }
    58  
    59  // PutMeta writes the passed instance of the database met-data struct to disk.
    60  func (d *DB) PutMeta(meta *Meta) error {
    61  	return kvdb.Update(d, func(tx kvdb.RwTx) error {
    62  		return putMeta(meta, tx)
    63  	}, func() {})
    64  }
    65  
    66  // putMeta is an internal helper function used in order to allow callers to
    67  // re-use a database transaction. See the publicly exported PutMeta method for
    68  // more information.
    69  func putMeta(meta *Meta, tx kvdb.RwTx) error {
    70  	metaBucket, err := tx.CreateTopLevelBucket(metaBucket)
    71  	if err != nil {
    72  		return err
    73  	}
    74  
    75  	return putDbVersion(metaBucket, meta)
    76  }
    77  
    78  func putDbVersion(metaBucket kvdb.RwBucket, meta *Meta) error {
    79  	scratch := make([]byte, 4)
    80  	byteOrder.PutUint32(scratch, meta.DbVersionNumber)
    81  	return metaBucket.Put(dbVersionKey, scratch)
    82  }