diff --git a/database/leveldb.go b/database/leveldb.go index deac8dea..0d66c3a1 100644 --- a/database/leveldb.go +++ b/database/leveldb.go @@ -7,6 +7,7 @@ import ( "github.com/syndtr/goleveldb/leveldb" "github.com/syndtr/goleveldb/leveldb/filter" "github.com/syndtr/goleveldb/leveldb/opt" + "github.com/syndtr/goleveldb/leveldb/storage" "github.com/syndtr/goleveldb/leveldb/util" ) @@ -51,6 +52,24 @@ func OpenDB(path string) (Storage, error) { return &levelDB{db: db}, nil } +// RecoverDB recovers LevelDB database from corruption +func RecoverDB(path string) error { + stor, err := storage.OpenFile("/Users/smira/.aptly/db/") + if err != nil { + return err + } + + db, err := leveldb.Recover(stor, nil) + if err != nil { + return err + } + + db.Close() + stor.Close() + + return nil +} + // Get key value from database func (l *levelDB) Get(key []byte) ([]byte, error) { value, err := l.db.Get(key, nil) diff --git a/database/leveldb_test.go b/database/leveldb_test.go index 5863b456..90be5901 100644 --- a/database/leveldb_test.go +++ b/database/leveldb_test.go @@ -11,7 +11,8 @@ func Test(t *testing.T) { } type LevelDBSuite struct { - db Storage + path string + db Storage } var _ = Suite(&LevelDBSuite{}) @@ -19,7 +20,8 @@ var _ = Suite(&LevelDBSuite{}) func (s *LevelDBSuite) SetUpTest(c *C) { var err error - s.db, err = OpenDB(c.MkDir()) + s.path = c.MkDir() + s.db, err = OpenDB(s.path) c.Assert(err, IsNil) } @@ -28,6 +30,29 @@ func (s *LevelDBSuite) TearDownTest(c *C) { c.Assert(err, IsNil) } +func (s *LevelDBSuite) TestRecoverDB(c *C) { + var ( + key = []byte("key") + value = []byte("value") + ) + + err := s.db.Put(key, value) + c.Check(err, IsNil) + + err = s.db.Close() + c.Check(err, IsNil) + + err = RecoverDB(s.path) + c.Check(err, IsNil) + + s.db, err = OpenDB(s.path) + c.Check(err, IsNil) + + result, err := s.db.Get(key) + c.Assert(err, IsNil) + c.Assert(result, DeepEquals, value) +} + func (s *LevelDBSuite) TestGetPut(c *C) { var ( key = []byte("key")