diff --git a/bzz/database.go b/bzz/database.go new file mode 100644 index 0000000000..bd7e7e6d6a --- /dev/null +++ b/bzz/database.go @@ -0,0 +1,93 @@ +package bzz + +import ( + "fmt" + + "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/compression/rle" + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/iterator" + "github.com/syndtr/goleveldb/leveldb/opt" +) + +const openFileLimit = 128 + +type LDBDatabase struct { + db *leveldb.DB + comp bool +} + +func NewLDBDatabase(file string) (*LDBDatabase, error) { + // Open the db + db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: openFileLimit}) + if err != nil { + return nil, err + } + + database := &LDBDatabase{db: db, comp: true} + + return database, nil +} + +func (self *LDBDatabase) Put(key []byte, value []byte) { + if self.comp { + value = rle.Compress(value) + } + + err := self.db.Put(key, value, nil) + if err != nil { + fmt.Println("Error put", err) + } +} + +func (self *LDBDatabase) Get(key []byte) ([]byte, error) { + dat, err := self.db.Get(key, nil) + if err != nil { + return nil, err + } + + if self.comp { + return rle.Decompress(dat) + } + + return dat, nil +} + +func (self *LDBDatabase) Delete(key []byte) error { + return self.db.Delete(key, nil) +} + +func (self *LDBDatabase) LastKnownTD() []byte { + data, _ := self.Get([]byte("LTD")) + + if len(data) == 0 { + data = []byte{0x0} + } + + return data +} + +func (self *LDBDatabase) NewIterator() iterator.Iterator { + return self.db.NewIterator(nil, nil) +} + +func (self *LDBDatabase) Write(batch *leveldb.Batch) error { + return self.db.Write(batch, nil) +} + +func (self *LDBDatabase) Close() { + // Close the leveldb database + self.db.Close() +} + +func (self *LDBDatabase) Print() { + iter := self.db.NewIterator(nil, nil) + for iter.Next() { + key := iter.Key() + value := iter.Value() + + fmt.Printf("%x(%d): ", key, len(key)) + node := common.NewValueFromBytes(value) + fmt.Printf("%v\n", node) + } +} diff --git a/bzz/dbstore.go b/bzz/dbstore.go index e3325077e1..44d9760e37 100644 --- a/bzz/dbstore.go +++ b/bzz/dbstore.go @@ -8,7 +8,6 @@ import ( "fmt" "sync" - "github.com/ethereum/go-ethereum/ethdb" "github.com/ethereum/go-ethereum/rlp" "github.com/syndtr/goleveldb/leveldb" ) @@ -32,7 +31,7 @@ type gcItem struct { } type dbStore struct { - db *ethdb.LDBDatabase + db *LDBDatabase // this should be stored in db, accessed transactionally entryCnt, accessCnt, dataIdx, capacity uint64 @@ -381,7 +380,7 @@ func newDbStore(path string) (s *dbStore, err error) { s = new(dbStore) - s.db, err = ethdb.NewLDBDatabase(path) + s.db, err = NewLDBDatabase(path) if err != nil { return }