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 }