diff --git a/database/leveldb.go b/database/leveldb.go new file mode 100644 index 00000000..087e1f61 --- /dev/null +++ b/database/leveldb.go @@ -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() +} diff --git a/database/leveldb_test.go b/database/leveldb_test.go new file mode 100644 index 00000000..b52e44c1 --- /dev/null +++ b/database/leveldb_test.go @@ -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) +}