From 76c9c8d653ae49e347598f1bbd34c821354c9567 Mon Sep 17 00:00:00 2001 From: obscuren Date: Mon, 3 Nov 2014 00:31:15 +0100 Subject: Compress data on db level. Closes #174 --- ethdb/database.go | 51 +++++++++++++++++++++++++++++++++----------------- ethdb/database_test.go | 26 +++++++++++++++++++++++-- 2 files changed, 58 insertions(+), 19 deletions(-) (limited to 'ethdb') diff --git a/ethdb/database.go b/ethdb/database.go index de3afd74b..a59782047 100644 --- a/ethdb/database.go +++ b/ethdb/database.go @@ -4,12 +4,15 @@ import ( "fmt" "path" + "github.com/ethereum/go-ethereum/compression/rle" "github.com/ethereum/go-ethereum/ethutil" "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/iterator" ) type LDBDatabase struct { - db *leveldb.DB + db *leveldb.DB + comp bool } func NewLDBDatabase(name string) (*LDBDatabase, error) { @@ -21,32 +24,42 @@ func NewLDBDatabase(name string) (*LDBDatabase, error) { return nil, err } - database := &LDBDatabase{db: db} + database := &LDBDatabase{db: db, comp: true} return database, nil } -func (db *LDBDatabase) Put(key []byte, value []byte) { - err := db.db.Put(key, value, 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 (db *LDBDatabase) Get(key []byte) ([]byte, error) { - return db.db.Get(key, nil) -} +func (self *LDBDatabase) Get(key []byte) ([]byte, error) { + dat, err := self.db.Get(key, nil) + if err != nil { + return nil, err + } + + if self.comp { + //fmt.Println("get", dat) + return rle.Decompress(dat) + } -func (db *LDBDatabase) Delete(key []byte) error { - return db.db.Delete(key, nil) + return dat, nil } -func (db *LDBDatabase) Db() *leveldb.DB { - return db.db +func (self *LDBDatabase) Delete(key []byte) error { + return self.db.Delete(key, nil) } -func (db *LDBDatabase) LastKnownTD() []byte { - data, _ := db.db.Get([]byte("LTD"), nil) +func (self *LDBDatabase) LastKnownTD() []byte { + data, _ := self.Get([]byte("LTD")) if len(data) == 0 { data = []byte{0x0} @@ -55,13 +68,17 @@ func (db *LDBDatabase) LastKnownTD() []byte { return data } -func (db *LDBDatabase) Close() { +func (self *LDBDatabase) NewIterator() iterator.Iterator { + return self.db.NewIterator(nil, nil) +} + +func (self *LDBDatabase) Close() { // Close the leveldb database - db.db.Close() + self.db.Close() } -func (db *LDBDatabase) Print() { - iter := db.db.NewIterator(nil, nil) +func (self *LDBDatabase) Print() { + iter := self.db.NewIterator(nil, nil) for iter.Next() { key := iter.Key() value := iter.Value() diff --git a/ethdb/database_test.go b/ethdb/database_test.go index bb1b4de2a..2cbaf58e0 100644 --- a/ethdb/database_test.go +++ b/ethdb/database_test.go @@ -1,6 +1,28 @@ package ethdb +/* import ( - _ "fmt" - _ "testing" + "bytes" + "testing" ) + +func TestCompression(t *testing.T) { + ethutil.ReadConfig("", "/tmp", "") + + db, err := NewLDBDatabase("testdb") + if err != nil { + t.Fatal(err) + } + + in := make([]byte, 10) + db.Put([]byte("test1"), in) + out, err := db.Get([]byte("test1")) + if err != nil { + t.Fatal(err) + } + + if bytes.Compare(out, in) != 0 { + t.Error("put get", in, out) + } +} +*/ -- cgit