mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-03-28 18:51:47 +01:00
This commit adds a reset() closure to the kvdb.View function which will be called before each retry (including the first) of the view transaction. The reset() closure can be used to reset external state (eg slices or maps) where the view closure puts intermediate results.
83 lines
2.0 KiB
Go
83 lines
2.0 KiB
Go
package channeldb
|
|
|
|
import (
|
|
"github.com/lightningnetwork/lnd/channeldb/kvdb"
|
|
)
|
|
|
|
var (
|
|
// metaBucket stores all the meta information concerning the state of
|
|
// the database.
|
|
metaBucket = []byte("metadata")
|
|
|
|
// dbVersionKey is a boltdb key and it's used for storing/retrieving
|
|
// current database version.
|
|
dbVersionKey = []byte("dbp")
|
|
)
|
|
|
|
// Meta structure holds the database meta information.
|
|
type Meta struct {
|
|
// DbVersionNumber is the current schema version of the database.
|
|
DbVersionNumber uint32
|
|
}
|
|
|
|
// FetchMeta fetches the meta data from boltdb and returns filled meta
|
|
// structure.
|
|
func (d *DB) FetchMeta(tx kvdb.RTx) (*Meta, error) {
|
|
var meta *Meta
|
|
|
|
err := kvdb.View(d, func(tx kvdb.RTx) error {
|
|
return fetchMeta(meta, tx)
|
|
}, func() {
|
|
meta = &Meta{}
|
|
})
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return meta, nil
|
|
}
|
|
|
|
// fetchMeta is an internal helper function used in order to allow callers to
|
|
// re-use a database transaction. See the publicly exported FetchMeta method
|
|
// for more information.
|
|
func fetchMeta(meta *Meta, tx kvdb.RTx) error {
|
|
metaBucket := tx.ReadBucket(metaBucket)
|
|
if metaBucket == nil {
|
|
return ErrMetaNotFound
|
|
}
|
|
|
|
data := metaBucket.Get(dbVersionKey)
|
|
if data == nil {
|
|
meta.DbVersionNumber = getLatestDBVersion(dbVersions)
|
|
} else {
|
|
meta.DbVersionNumber = byteOrder.Uint32(data)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// PutMeta writes the passed instance of the database met-data struct to disk.
|
|
func (d *DB) PutMeta(meta *Meta) error {
|
|
return kvdb.Update(d, func(tx kvdb.RwTx) error {
|
|
return putMeta(meta, tx)
|
|
})
|
|
}
|
|
|
|
// putMeta is an internal helper function used in order to allow callers to
|
|
// re-use a database transaction. See the publicly exported PutMeta method for
|
|
// more information.
|
|
func putMeta(meta *Meta, tx kvdb.RwTx) error {
|
|
metaBucket, err := tx.CreateTopLevelBucket(metaBucket)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return putDbVersion(metaBucket, meta)
|
|
}
|
|
|
|
func putDbVersion(metaBucket kvdb.RwBucket, meta *Meta) error {
|
|
scratch := make([]byte, 4)
|
|
byteOrder.PutUint32(scratch, meta.DbVersionNumber)
|
|
return metaBucket.Put(dbVersionKey, scratch)
|
|
}
|