eth-tracker/internal/db/db.go

97 lines
1.4 KiB
Go

package db
import (
"encoding/binary"
"log/slog"
"github.com/dgraph-io/badger/v4"
)
type (
DBOpts struct {
Logg *slog.Logger
}
DB struct {
db *badger.DB
logg *slog.Logger
}
)
const (
dbFolderName = "celo_tracker_blocks_db"
upperBoundKey = "upper"
lowerBoundKey = "lower"
)
var (
sortableOrder = binary.BigEndian
)
func New(o DBOpts) (*DB, error) {
opts := badger.DefaultOptions(dbFolderName)
opts.Logger = nil
db, err := badger.Open(opts)
if err != nil {
return nil, err
}
return &DB{
db: db,
logg: o.Logg,
}, nil
}
func (d *DB) Close() error {
return d.db.Close()
}
func (d *DB) get(k string) ([]byte, error) {
var v []byte
err := d.db.View(func(txn *badger.Txn) error {
item, err := txn.Get([]byte(k))
if err != nil {
return err
}
v, err = item.ValueCopy(nil)
return err
})
if err != nil {
return nil, err
}
return v, nil
}
func (d *DB) setUint64(k string, v uint64) error {
err := d.db.Update(func(txn *badger.Txn) error {
return txn.Set([]byte(k), marshalUint64(v))
})
if err != nil {
return err
}
return nil
}
func (d *DB) setUint64AsKey(v uint64) error {
err := d.db.Update(func(txn *badger.Txn) error {
return txn.Set(marshalUint64(v), nil)
})
if err != nil {
return err
}
return nil
}
func unmarshalUint64(b []byte) uint64 {
return sortableOrder.Uint64(b)
}
func marshalUint64(v uint64) []byte {
b := make([]byte, 8)
sortableOrder.PutUint64(b, v)
return b
}