Skip to content

Commit

Permalink
WIP: Add support for Bitcask
Browse files Browse the repository at this point in the history
  • Loading branch information
prologic committed Oct 22, 2023
1 parent aa688ad commit f11d842
Show file tree
Hide file tree
Showing 7 changed files with 315 additions and 1 deletion.
12 changes: 12 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"cSpell.words": [
"badgerstore",
"bbolt",
"brianvoe",
"curr",
"gofakeit",
"ostafen",
"todos",
"vals"
]
}
11 changes: 10 additions & 1 deletion db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import (
q "github.com/ostafen/clover/v2/query"
badgerstore "github.com/ostafen/clover/v2/store/badger"
"github.com/ostafen/clover/v2/store/bbolt"
bitcaskstore "github.com/ostafen/clover/v2/store/bitcask"
)

const (
Expand Down Expand Up @@ -49,6 +50,14 @@ func getBadgerDB(dir string) (*c.DB, error) {
return c.OpenWithStore(store)
}

func getBitcaskDB(dir string) (*c.DB, error) {
store, err := bitcaskstore.Open(dir)
if err != nil {
return nil, err
}
return c.OpenWithStore(store)
}

func getBBoltDB(dir string) (*c.DB, error) {
store, err := bbolt.Open(dir)
if err != nil {
Expand All @@ -58,7 +67,7 @@ func getBBoltDB(dir string) (*c.DB, error) {
}

func getDBFactories() []dbFactory {
return []dbFactory{getBadgerDB, getBBoltDB}
return []dbFactory{getBadgerDB, getBBoltDB, getBitcaskDB}
}

func runCloverTest(t *testing.T, test func(t *testing.T, db *c.DB)) {
Expand Down
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ module github.com/ostafen/clover/v2
go 1.13

require (
git.mills.io/prologic/bitcask v1.0.2
github.com/brianvoe/gofakeit/v6 v6.23.2
github.com/dgraph-io/badger/v4 v4.2.0
github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 // indirect
Expand Down
170 changes: 170 additions & 0 deletions go.sum

Large diffs are not rendered by default.

6 changes: 6 additions & 0 deletions go.work
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
go 1.20

use (
.
/Users/prologic/Projects/bitcask
)
4 changes: 4 additions & 0 deletions go.work.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
github.com/hashicorp/go-immutable-radix v1.0.0 h1:AKDB1HM5PWEA7i4nhcpwOrO2byshxBjXVn/J/3+z5/0=
github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU=
github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
112 changes: 112 additions & 0 deletions store/bitcask/bitcask.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
// Package bitcask ...
package bitcask

import (
"path/filepath"

"git.mills.io/prologic/bitcask"
"github.com/ostafen/clover/v2/store"
)

type bitcaskStore struct {
db *bitcask.Bitcask
}

const (
dbFileName = "data.db"
)

// Open ...
func Open(dir string) (store.Store, error) {
db, err := bitcask.Open(filepath.Join(dir, dbFileName))
if err != nil {
return nil, err
}
return &bitcaskStore{db: db}, nil
}

func (store *bitcaskStore) Begin(update bool) (store.Tx, error) {
return &bitcaskTx{store.db}, nil
}

func (store *bitcaskStore) Close() error {
return store.db.Close()
}

type bitcaskTx struct {
*bitcask.Bitcask
}

func (tx *bitcaskTx) Set(key, value []byte) error {
return tx.Bitcask.Put(key, value)
}

func (tx *bitcaskTx) Get(key []byte) ([]byte, error) {
return tx.Bitcask.Get(key)
}

func (tx *bitcaskTx) Delete(key []byte) error {
return tx.Bitcask.Delete(key)
}

func (tx *bitcaskTx) Cursor(forward bool) (store.Cursor, error) {
var opts []bitcask.IteratorOption
if !forward {
opts = append(opts, bitcask.Reverse())
}
return &bitcaskCursor{Iterator: tx.Bitcask.Iterator(opts...)}, nil
}

func (tx *bitcaskTx) Commit() error {
return nil
}

func (tx *bitcaskTx) Rollback() error {
return nil
}

type bitcaskCursor struct {
*bitcask.Iterator
currItem *store.Item
}

func (c *bitcaskCursor) Seek(seek []byte) error {
item, err := c.Iterator.SeekPrefix(seek)
if err != nil || err == bitcask.ErrStopIteration {
c.currItem = nil
return err
}

c.currItem = &store.Item{
Key: item.Key(),
Value: item.Value(),
}

return nil
}

func (c *bitcaskCursor) Next() {
item, err := c.Iterator.Next()
if err != nil || err == bitcask.ErrStopIteration {
c.currItem = nil
return
}

c.currItem = &store.Item{
Key: item.Key(),
Value: item.Value(),
}
}

func (c *bitcaskCursor) Valid() bool {
return c.currItem != nil && c.currItem.Key != nil && c.currItem.Value != nil
}

func (c *bitcaskCursor) Item() (store.Item, error) {
item := c.currItem
return *item, nil
}

func (c *bitcaskCursor) Close() error {
return c.Iterator.Close()
}

0 comments on commit f11d842

Please sign in to comment.