LevelDB first mockup.

This commit is contained in:
Andrey Smirnov
2013-12-17 12:01:32 +04:00
parent 7bf9f00345
commit b73def6b32
2 changed files with 106 additions and 0 deletions

60
database/leveldb.go Normal file
View File

@@ -0,0 +1,60 @@
package database
import (
"errors"
"github.com/syndtr/goleveldb/leveldb"
"github.com/syndtr/goleveldb/leveldb/filter"
"github.com/syndtr/goleveldb/leveldb/opt"
)
var (
ErrNotFound = errors.New("key not found")
)
type Storage interface {
Get(key []byte) ([]byte, error)
Put(key []byte, value []byte) error
Close() error
}
type levelDB struct {
db *leveldb.DB
}
// Check interface
var (
_ Storage = &levelDB{}
)
func OpenDB(path string) (Storage, error) {
o := &opt.Options{
Filter: filter.NewBloomFilter(10),
Flag: opt.OFCreateIfMissing,
}
db, err := leveldb.OpenFile(path, o)
if err != nil {
return nil, err
}
return &levelDB{db: db}, nil
}
func (l *levelDB) Get(key []byte) ([]byte, error) {
value, err := l.db.Get(key, nil)
if err != nil {
if err == leveldb.ErrNotFound {
return nil, ErrNotFound
}
return nil, err
}
return value, nil
}
func (l *levelDB) Put(key []byte, value []byte) error {
return l.db.Put(key, value, nil)
}
func (l *levelDB) Close() error {
return l.db.Close()
}

46
database/leveldb_test.go Normal file
View File

@@ -0,0 +1,46 @@
package database
import (
. "launchpad.net/gocheck"
"testing"
)
// Launch gocheck tests
func Test(t *testing.T) {
TestingT(t)
}
type LevelDBSuite struct {
db Storage
}
var _ = Suite(&LevelDBSuite{})
func (s *LevelDBSuite) SetUpTest(c *C) {
var err error
s.db, err = OpenDB(c.MkDir())
c.Assert(err, IsNil)
}
func (s *LevelDBSuite) TearDownTest(c *C) {
err := s.db.Close()
c.Assert(err, IsNil)
}
func (s *LevelDBSuite) TestGetPut(c *C) {
var (
key = []byte("key")
value = []byte("value")
)
_, err := s.db.Get(key)
c.Assert(err, ErrorMatches, "key not found")
err = s.db.Put(key, value)
c.Assert(err, IsNil)
result, err := s.db.Get(key)
c.Assert(err, IsNil)
c.Assert(result, DeepEquals, value)
}