|
|
|
@ -7,6 +7,7 @@ import ( |
|
|
|
|
"github.com/ethereum/go-ethereum/logger" |
|
|
|
|
"github.com/ethereum/go-ethereum/logger/glog" |
|
|
|
|
"github.com/syndtr/goleveldb/leveldb" |
|
|
|
|
"github.com/syndtr/goleveldb/leveldb/errors" |
|
|
|
|
"github.com/syndtr/goleveldb/leveldb/iterator" |
|
|
|
|
"github.com/syndtr/goleveldb/leveldb/opt" |
|
|
|
|
) |
|
|
|
@ -24,9 +25,17 @@ type LDBDatabase struct { |
|
|
|
|
quit chan struct{} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// NewLDBDatabase returns a LevelDB wrapped object. LDBDatabase does not persist data by
|
|
|
|
|
// it self but requires a background poller which syncs every X. `Flush` should be called
|
|
|
|
|
// when data needs to be stored and written to disk.
|
|
|
|
|
func NewLDBDatabase(file string) (*LDBDatabase, error) { |
|
|
|
|
// Open the db
|
|
|
|
|
db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: OpenFileLimit}) |
|
|
|
|
// check for curruption and attempt to recover
|
|
|
|
|
if _, iscorrupted := err.(*errors.ErrCorrupted); iscorrupted { |
|
|
|
|
db, err = leveldb.RecoverFile(file, nil) |
|
|
|
|
} |
|
|
|
|
// (re) check for errors and abort if opening of the db failed
|
|
|
|
|
if err != nil { |
|
|
|
|
return nil, err |
|
|
|
|
} |
|
|
|
@ -44,21 +53,15 @@ func (self *LDBDatabase) makeQueue() { |
|
|
|
|
self.queue = make(map[string][]byte) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Put puts the given key / value to the queue
|
|
|
|
|
func (self *LDBDatabase) Put(key []byte, value []byte) { |
|
|
|
|
self.mu.Lock() |
|
|
|
|
defer self.mu.Unlock() |
|
|
|
|
|
|
|
|
|
self.queue[string(key)] = value |
|
|
|
|
/* |
|
|
|
|
value = rle.Compress(value) |
|
|
|
|
|
|
|
|
|
err := self.db.Put(key, value, nil) |
|
|
|
|
if err != nil { |
|
|
|
|
fmt.Println("Error put", err) |
|
|
|
|
} |
|
|
|
|
*/ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Get returns the given key if it's present.
|
|
|
|
|
func (self *LDBDatabase) Get(key []byte) ([]byte, error) { |
|
|
|
|
self.mu.Lock() |
|
|
|
|
defer self.mu.Unlock() |
|
|
|
@ -76,6 +79,7 @@ func (self *LDBDatabase) Get(key []byte) ([]byte, error) { |
|
|
|
|
return rle.Decompress(dat) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Delete deletes the key from the queue and database
|
|
|
|
|
func (self *LDBDatabase) Delete(key []byte) error { |
|
|
|
|
self.mu.Lock() |
|
|
|
|
defer self.mu.Unlock() |
|
|
|
@ -100,6 +104,7 @@ func (self *LDBDatabase) NewIterator() iterator.Iterator { |
|
|
|
|
return self.db.NewIterator(nil, nil) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Flush flushes out the queue to leveldb
|
|
|
|
|
func (self *LDBDatabase) Flush() error { |
|
|
|
|
self.mu.Lock() |
|
|
|
|
defer self.mu.Unlock() |
|
|
|
|