diff --git a/database/leveldb.go b/database/leveldb.go index 88495044..36a70c24 100644 --- a/database/leveldb.go +++ b/database/leveldb.go @@ -24,6 +24,7 @@ type Storage interface { KeysByPrefix(prefix []byte) [][]byte FetchByPrefix(prefix []byte) [][]byte Close() error + ReOpen() error StartBatch() FinishBatch() error CompactDB() error @@ -40,13 +41,17 @@ var ( _ Storage = &levelDB{} ) -// OpenDB opens (creates) LevelDB database -func OpenDB(path string) (Storage, error) { +func internalOpen(path string) (*leveldb.DB, error) { o := &opt.Options{ Filter: filter.NewBloomFilter(10), } - db, err := leveldb.OpenFile(path, o) + return leveldb.OpenFile(path, o) +} + +// OpenDB opens (creates) LevelDB database +func OpenDB(path string) (Storage, error) { + db, err := internalOpen(path) if err != nil { return nil, err } @@ -148,11 +153,25 @@ func (l *levelDB) FetchByPrefix(prefix []byte) [][]byte { // Close finishes DB work func (l *levelDB) Close() error { + if l.db == nil { + panic("database already closed") + } err := l.db.Close() l.db = nil return err } +// Reopen tries to re-open the database +func (l *levelDB) ReOpen() error { + if l.db != nil { + panic("database already open") + } + + var err error + l.db, err = internalOpen(l.path) + return err +} + // StartBatch starts batch processing of keys // // All subsequent Get, Put and Delete would work on batch diff --git a/database/leveldb_test.go b/database/leveldb_test.go index 90be5901..e2624723 100644 --- a/database/leveldb_test.go +++ b/database/leveldb_test.go @@ -155,3 +155,23 @@ func (s *LevelDBSuite) TestCompactDB(c *C) { c.Check(s.db.CompactDB(), IsNil) } + +func (s *LevelDBSuite) TestReOpen(c *C) { + var ( + key = []byte("key") + value = []byte("value") + ) + + err := s.db.Put(key, value) + c.Assert(err, IsNil) + + err = s.db.Close() + c.Assert(err, IsNil) + + err = s.db.ReOpen() + c.Assert(err, IsNil) + + result, err := s.db.Get(key) + c.Assert(err, IsNil) + c.Assert(result, DeepEquals, value) +}