mirror of
https://github.com/cirruslabs/orchard.git
synced 2026-10-22 06:18:16 +02:00
Refactored working with a storage (#20)
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
package badger
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/cirruslabs/orchard/internal/controller/store"
|
||||
"github.com/dgraph-io/badger/v3"
|
||||
)
|
||||
|
||||
type Store struct {
|
||||
db *badger.DB
|
||||
store.Store
|
||||
}
|
||||
|
||||
type Transaction struct {
|
||||
badgerTxn *badger.Txn
|
||||
store.Transaction
|
||||
}
|
||||
|
||||
func NewBadgerStore(dbPath string) (store.Store, error) {
|
||||
opts := badger.DefaultOptions(dbPath)
|
||||
|
||||
opts.SyncWrites = true
|
||||
|
||||
db, err := badger.Open(opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &Store{
|
||||
db: db,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (store *Store) View(cb func(txn store.Transaction) error) error {
|
||||
return store.db.View(func(txn *badger.Txn) error {
|
||||
return cb(&Transaction{
|
||||
badgerTxn: txn,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func (store *Store) Update(cb func(txn store.Transaction) error) error {
|
||||
return store.db.Update(func(txn *badger.Txn) error {
|
||||
return cb(&Transaction{
|
||||
badgerTxn: txn,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func mapErr(err error) error {
|
||||
if err != nil {
|
||||
if errors.Is(err, badger.ErrKeyNotFound) {
|
||||
return store.ErrNotFound
|
||||
}
|
||||
|
||||
return fmt.Errorf("%w: %v", store.ErrStoreFailed, err)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
//nolint:dupl // maybe we'll figure out how to make DB resource accessors generic in the future
|
||||
package store
|
||||
package badger
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
@@ -14,7 +14,7 @@ func VMKey(name string) []byte {
|
||||
return []byte(path.Join(SpaceVMs, name))
|
||||
}
|
||||
|
||||
func (txn *Txn) GetVM(name string) (result *v1.VM, err error) {
|
||||
func (txn *Transaction) GetVM(name string) (result *v1.VM, err error) {
|
||||
defer func() {
|
||||
err = mapErr(err)
|
||||
}()
|
||||
@@ -41,7 +41,7 @@ func (txn *Txn) GetVM(name string) (result *v1.VM, err error) {
|
||||
return &vm, nil
|
||||
}
|
||||
|
||||
func (txn *Txn) SetVM(vm *v1.VM) (err error) {
|
||||
func (txn *Transaction) SetVM(vm *v1.VM) (err error) {
|
||||
defer func() {
|
||||
err = mapErr(err)
|
||||
}()
|
||||
@@ -56,7 +56,7 @@ func (txn *Txn) SetVM(vm *v1.VM) (err error) {
|
||||
return txn.badgerTxn.Set(key, valueBytes)
|
||||
}
|
||||
|
||||
func (txn *Txn) DeleteVM(name string) (err error) {
|
||||
func (txn *Transaction) DeleteVM(name string) (err error) {
|
||||
defer func() {
|
||||
err = mapErr(err)
|
||||
}()
|
||||
@@ -66,7 +66,7 @@ func (txn *Txn) DeleteVM(name string) (err error) {
|
||||
return txn.badgerTxn.Delete(key)
|
||||
}
|
||||
|
||||
func (txn *Txn) ListVMs() (result []*v1.VM, err error) {
|
||||
func (txn *Transaction) ListVMs() (result []*v1.VM, err error) {
|
||||
defer func() {
|
||||
err = mapErr(err)
|
||||
}()
|
||||
+5
-5
@@ -1,5 +1,5 @@
|
||||
//nolint:dupl // maybe we'll figure out how to make DB resource accessors generic in the future
|
||||
package store
|
||||
package badger
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
@@ -14,7 +14,7 @@ func WorkerKey(name string) []byte {
|
||||
return []byte(path.Join(SpaceWorkers, name))
|
||||
}
|
||||
|
||||
func (txn *Txn) GetWorker(name string) (result *v1.Worker, err error) {
|
||||
func (txn *Transaction) GetWorker(name string) (result *v1.Worker, err error) {
|
||||
defer func() {
|
||||
err = mapErr(err)
|
||||
}()
|
||||
@@ -41,7 +41,7 @@ func (txn *Txn) GetWorker(name string) (result *v1.Worker, err error) {
|
||||
return &worker, nil
|
||||
}
|
||||
|
||||
func (txn *Txn) SetWorker(worker *v1.Worker) (err error) {
|
||||
func (txn *Transaction) SetWorker(worker *v1.Worker) (err error) {
|
||||
defer func() {
|
||||
err = mapErr(err)
|
||||
}()
|
||||
@@ -56,7 +56,7 @@ func (txn *Txn) SetWorker(worker *v1.Worker) (err error) {
|
||||
return txn.badgerTxn.Set(key, valueBytes)
|
||||
}
|
||||
|
||||
func (txn *Txn) DeleteWorker(name string) (err error) {
|
||||
func (txn *Transaction) DeleteWorker(name string) (err error) {
|
||||
defer func() {
|
||||
err = mapErr(err)
|
||||
}()
|
||||
@@ -66,7 +66,7 @@ func (txn *Txn) DeleteWorker(name string) (err error) {
|
||||
return txn.badgerTxn.Delete(key)
|
||||
}
|
||||
|
||||
func (txn *Txn) ListWorkers() (result []*v1.Worker, err error) {
|
||||
func (txn *Transaction) ListWorkers() (result []*v1.Worker, err error) {
|
||||
defer func() {
|
||||
err = mapErr(err)
|
||||
}()
|
||||
@@ -2,23 +2,10 @@ package store
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"github.com/dgraph-io/badger/v3"
|
||||
)
|
||||
|
||||
var (
|
||||
ErrNotFound = errors.New("DB entry not found")
|
||||
ErrBadgerFailed = errors.New("BadgerDB failed")
|
||||
ErrNotFound = errors.New("store entry not found")
|
||||
ErrConflict = errors.New("store conflict")
|
||||
ErrStoreFailed = errors.New("store failed")
|
||||
)
|
||||
|
||||
func mapErr(err error) error {
|
||||
if err != nil {
|
||||
if errors.Is(err, badger.ErrKeyNotFound) {
|
||||
return ErrNotFound
|
||||
}
|
||||
|
||||
return fmt.Errorf("%w: %v", ErrBadgerFailed, err)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -1,24 +1,20 @@
|
||||
package store
|
||||
|
||||
import (
|
||||
"github.com/dgraph-io/badger/v3"
|
||||
)
|
||||
import v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
|
||||
|
||||
type Store struct {
|
||||
db *badger.DB
|
||||
type Store interface {
|
||||
View(cb func(txn Transaction) error) error
|
||||
Update(cb func(txn Transaction) error) error
|
||||
}
|
||||
|
||||
func New(dbPath string) (*Store, error) {
|
||||
opts := badger.DefaultOptions(dbPath)
|
||||
type Transaction interface {
|
||||
GetVM(name string) (result *v1.VM, err error)
|
||||
SetVM(vm *v1.VM) (err error)
|
||||
DeleteVM(name string) (err error)
|
||||
ListVMs() (result []*v1.VM, err error)
|
||||
|
||||
opts.SyncWrites = true
|
||||
|
||||
db, err := badger.Open(opts)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &Store{
|
||||
db: db,
|
||||
}, nil
|
||||
GetWorker(name string) (result *v1.Worker, err error)
|
||||
SetWorker(worker *v1.Worker) (err error)
|
||||
DeleteWorker(name string) (err error)
|
||||
ListWorkers() (result []*v1.Worker, err error)
|
||||
}
|
||||
|
||||
@@ -1,23 +0,0 @@
|
||||
package store
|
||||
|
||||
import "github.com/dgraph-io/badger/v3"
|
||||
|
||||
type Txn struct {
|
||||
badgerTxn *badger.Txn
|
||||
}
|
||||
|
||||
func (store *Store) View(cb func(txn *Txn) error) error {
|
||||
return store.db.View(func(txn *badger.Txn) error {
|
||||
return cb(&Txn{
|
||||
badgerTxn: txn,
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func (store *Store) Update(cb func(txn *Txn) error) error {
|
||||
return store.db.Update(func(txn *badger.Txn) error {
|
||||
return cb(&Txn{
|
||||
badgerTxn: txn,
|
||||
})
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user