52fa41a12a
* added account_state + changed ECPoint to PublicKey * account state persist * in depth test for existing accounts. * implemented GetTransaction. * added enrollment TX * added persist of accounts and unspent coins * bumped version -> 0.32.0
58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package storage
|
|
|
|
import (
|
|
"github.com/syndtr/goleveldb/leveldb"
|
|
"github.com/syndtr/goleveldb/leveldb/opt"
|
|
"github.com/syndtr/goleveldb/leveldb/util"
|
|
)
|
|
|
|
// LevelDBStore is the official storage implementation for storing and retreiving
|
|
// blockchain data.
|
|
type LevelDBStore struct {
|
|
db *leveldb.DB
|
|
path string
|
|
}
|
|
|
|
// NewLevelDBStore return a new LevelDBStore object that will
|
|
// initialize the database found at the given path.
|
|
func NewLevelDBStore(path string, opts *opt.Options) (*LevelDBStore, error) {
|
|
db, err := leveldb.OpenFile(path, opts)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &LevelDBStore{
|
|
path: path,
|
|
db: db,
|
|
}, nil
|
|
}
|
|
|
|
// Put implements the Store interface.
|
|
func (s *LevelDBStore) Put(key, value []byte) error {
|
|
return s.db.Put(key, value, nil)
|
|
}
|
|
|
|
// Get implements the Store interface.
|
|
func (s *LevelDBStore) Get(key []byte) ([]byte, error) {
|
|
return s.db.Get(key, nil)
|
|
}
|
|
|
|
// PutBatch implements the Store interface.
|
|
func (s *LevelDBStore) PutBatch(batch Batch) error {
|
|
lvldbBatch := batch.(*leveldb.Batch)
|
|
return s.db.Write(lvldbBatch, nil)
|
|
}
|
|
|
|
// Seek implements the Store interface.
|
|
func (s *LevelDBStore) Seek(key []byte, f func(k, v []byte)) {
|
|
iter := s.db.NewIterator(util.BytesPrefix(key), nil)
|
|
for iter.Next() {
|
|
f(iter.Key(), iter.Value())
|
|
}
|
|
iter.Release()
|
|
}
|
|
|
|
// Batch implements the Batch interface and returns a leveldb
|
|
// compatible Batch.
|
|
func (s *LevelDBStore) Batch() Batch {
|
|
return new(leveldb.Batch)
|
|
}
|