Files
x-realy/database/main.go
2025-06-10 21:31:24 +01:00

91 lines
2.0 KiB
Go

package database
import (
"context"
"github.com/dgraph-io/badger/v4"
"x.realy.lol/chk"
"x.realy.lol/log"
"x.realy.lol/units"
)
type D struct {
ctx context.Context
cancel context.CancelCauseFunc
dataDir string
BlockCacheSize int
Logger *logger
InitLogLevel int
// DB is the badger db
*badger.DB
// seq is the monotonic collision free index for raw event storage.
seq *badger.Sequence
}
func New() (d *D) {
ctx, cancel := context.WithCancelCause(context.Background())
d = &D{BlockCacheSize: units.Gb, ctx: ctx, cancel: cancel}
return
}
// Path returns the path where the database files are stored.
func (d *D) Path() string { return d.dataDir }
// Init sets up the database with the loaded configuration.
func (d *D) Init(path string) (err error) {
d.dataDir = path
log.I.Ln("opening realy database at", d.dataDir)
opts := badger.DefaultOptions(d.dataDir)
opts.BlockCacheSize = int64(d.BlockCacheSize)
opts.BlockSize = units.Gb
opts.CompactL0OnClose = true
opts.LmaxCompaction = true
d.Logger = NewLogger(d.InitLogLevel, d.dataDir)
opts.Logger = d.Logger
if d.DB, err = badger.Open(opts); chk.E(err) {
return err
}
log.I.Ln("getting event store sequence index", d.dataDir)
if d.seq, err = d.DB.GetSequence([]byte("events"), 1000); chk.E(err) {
return err
}
return nil
}
func (d *D) Close() (err error) { return d.DB.Close() }
// Serial returns the next monotonic conflict free unique serial on the database.
func (d *D) Serial() (ser uint64, err error) {
if ser, err = d.seq.Next(); chk.E(err) {
}
// log.T.ToSliceOfBytes("serial %x", ser)
return
}
func (d *D) View(fn func(txn *badger.Txn) (err error)) (err error) {
if err = d.DB.View(fn); err != nil {
return
}
return
}
func (d *D) Update(fn func(txn *badger.Txn) (err error)) (err error) {
if err = d.DB.Update(fn); chk.E(err) {
return
}
return
}
func (d *D) Set(k, v []byte) (err error) {
if err = d.Update(func(txn *badger.Txn) (err error) {
if err = txn.Set(k, v); chk.E(err) {
return
}
return
}); chk.E(err) {
return
}
return
}