diff --git a/store/disk/badger.go b/store/disk/badger.go index 832abfe..1fa62cb 100644 --- a/store/disk/badger.go +++ b/store/disk/badger.go @@ -2,6 +2,7 @@ package disk import ( "bytes" + "errors" "strconv" "sync" "time" @@ -17,7 +18,10 @@ type BadgerDB struct { // OpenPogrebDB - Opens the specified path func OpenBadgerDB(path string) (*BadgerDB, error) { - db, err := badger.Open(badger.DefaultOptions(path)) + badgerOptions := badger.DefaultOptions(path) + badgerOptions.EventLogging = false + badgerOptions.Logger = nil + db, err := badger.Open(badgerOptions) if err != nil { return nil, err } @@ -74,18 +78,20 @@ func (bdb *BadgerDB) MSet(data map[string][]byte) error { func (bdb *BadgerDB) get(k string) ([]byte, error) { var data []byte delete := false - return data, bdb.db.Update(func(txn *badger.Txn) error { item, err := txn.Get([]byte(k)) if err != nil { return err } - _, err = item.ValueCopy(data) + data, err = item.ValueCopy(nil) if err != nil { return err } parts := bytes.SplitN(data, []byte(expSeparator), 2) + if len(data) == 2 { + return errors.New("couldn't retrieve data") + } expires, actual := parts[0], parts[1] if exp, _ := strconv.Atoi(string(expires)); exp > 0 && int(time.Now().Unix()) >= exp { delete = true diff --git a/store/disk/bboltdb.go b/store/disk/bboltdb.go index e6ec12d..9ee30d5 100644 --- a/store/disk/bboltdb.go +++ b/store/disk/bboltdb.go @@ -2,6 +2,7 @@ package disk import ( "bytes" + "errors" "strconv" "sync" "time" @@ -175,9 +176,9 @@ func (b *BBoltDB) Scan(scannerOpt ScannerOptions) error { return true } return b.db.View(func(tx *bolt.Tx) error { - b, err := tx.CreateBucketIfNotExists([]byte(b.BucketName)) - if err != nil { - return err + b := tx.Bucket([]byte(b.BucketName)) + if b == nil { + return errors.New("bucket not found") } c := b.Cursor() for key, val := c.First(); key != nil; key, val = c.Next() { diff --git a/store/disk/kv_test.go b/store/disk/kv_test.go new file mode 100644 index 0000000..44da8c0 --- /dev/null +++ b/store/disk/kv_test.go @@ -0,0 +1,56 @@ +package disk + +import ( + "path/filepath" + "testing" +) + +func TestKV(t *testing.T) { + var db DB + // bbolt + dbpath, _ := utiltestGetPath(t) + dbpath = filepath.Join(dbpath, "boltdb") + db, err := OpenBoltDBB(dbpath) + if err != nil { + t.Error(err) + } + db.(*BBoltDB).BucketName = "test" + utiltestOperations(t, db, 100) + utiltestRemoveDb(t, db, dbpath) + + // pebble + dbpath, _ = utiltestGetPath(t) + db, err = OpenPebbleDB(dbpath) + if err != nil { + t.Error(err) + } + utiltestOperations(t, db, 100) + utiltestRemoveDb(t, db, dbpath) + + // pogreb + dbpath, _ = utiltestGetPath(t) + db, err = OpenPogrebDB(dbpath) + if err != nil { + t.Error(err) + } + utiltestOperations(t, db, 100) + utiltestRemoveDb(t, db, dbpath) + + // leveldb + dbpath, _ = utiltestGetPath(t) + db, err = OpenLevelDB(dbpath) + if err != nil { + t.Error(err) + } + utiltestOperations(t, db, 100) + utiltestRemoveDb(t, db, dbpath) + + // badgerdb + dbpath, _ = utiltestGetPath(t) + db, err = OpenBadgerDB(dbpath) + if err != nil { + t.Error(err) + } + utiltestOperations(t, db, 100) + utiltestRemoveDb(t, db, dbpath) +} diff --git a/store/disk/pebble_test.go b/store/disk/pebble_test.go deleted file mode 100644 index f87039d..0000000 --- a/store/disk/pebble_test.go +++ /dev/null @@ -1,68 +0,0 @@ -package disk - -import ( - "bytes" - "fmt" - "testing" - "time" -) - -func TestOpenPebbleDB(t *testing.T) { - pbpath, _ := utiltestGetPath(t) - pb, err := OpenPebbleDB(pbpath) - if err != nil { - t.Error(err) - } - utiltestRemoveDb(pb, pbpath) -} - -func TestPebbleOperations(t *testing.T) { - pbpath, _ := utiltestGetPath(t) - pb, err := OpenPebbleDB(pbpath) - if err != nil { - t.Error(err) - } - - maxItems := 100 - - // set - for i := 0; i < maxItems; i++ { - key := fmt.Sprint(i) - value := []byte(key) - if err := pb.Set(key, value, time.Hour); err != nil { - t.Error("[put] ", err) - } - } - - // get - for i := 0; i < maxItems; i++ { - key := fmt.Sprint(i) - value := []byte(key) - if data, err := pb.Get(key); err != nil || !bytes.EqualFold(data, value) { - t.Errorf("[get] got %s but wanted %s: err %s", string(data), string(value), err) - } - } - - // scan - read := 0 - pb.Scan(ScannerOptions{ - Handler: func(k, v []byte) error { - _, _ = k, v - read++ - return nil - }, - }) - if read != maxItems { - t.Errorf("[scan] got %d but wanted %d", read, maxItems) - } - - // delete - for i := 0; i < maxItems; i++ { - key := fmt.Sprint(i) - if err := pb.Del(key); err != nil { - t.Errorf("[del] couldn't delete %s err %s", key, err) - } - } - - utiltestRemoveDb(pb, pbpath) -} diff --git a/store/disk/util_test.go b/store/disk/util_test.go index d518fd8..f01ae6c 100644 --- a/store/disk/util_test.go +++ b/store/disk/util_test.go @@ -1,11 +1,55 @@ package disk import ( + "bytes" + "fmt" "io/ioutil" "os" "testing" + "time" ) +func utiltestOperations(t *testing.T, db DB, maxItems int) { + // set + for i := 0; i < maxItems; i++ { + key := fmt.Sprint(i) + value := []byte(key) + if err := db.Set(key, value, time.Hour); err != nil { + t.Error("[put] ", err) + } + } + + // get + for i := 0; i < maxItems; i++ { + key := fmt.Sprint(i) + value := []byte(key) + if data, err := db.Get(key); err != nil || !bytes.EqualFold(data, value) { + t.Errorf("[get] got %s but wanted %s: err %s", string(data), string(value), err) + } + } + + // scan + read := 0 + db.Scan(ScannerOptions{ + Handler: func(k, v []byte) error { + _, _ = k, v + read++ + return nil + }, + }) + if read != maxItems { + t.Errorf("[scan] got %d but wanted %d", read, maxItems) + } + + // delete + for i := 0; i < maxItems; i++ { + key := fmt.Sprint(i) + if err := db.Del(key); err != nil { + t.Errorf("[del] couldn't delete %s err %s", key, err) + } + } +} + func utiltestGetPath(t *testing.T) (string, error) { tmpdir, err := ioutil.TempDir(os.TempDir(), "hmaptest") if err != nil { @@ -14,7 +58,7 @@ func utiltestGetPath(t *testing.T) (string, error) { return tmpdir, err } -func utiltestRemoveDb(db DB, pbpath string) { +func utiltestRemoveDb(t *testing.T, db DB, pbpath string) { db.Close() os.RemoveAll(pbpath) }