github.com/jonasnick/go-ethereum@v0.7.12-0.20150216215225-22176f05d387/ethdb/database.go (about) 1 package ethdb 2 3 import ( 4 "path" 5 "fmt" 6 7 "github.com/jonasnick/go-ethereum/ethutil" 8 "github.com/jonasnick/go-ethereum/compression/rle" 9 "github.com/syndtr/goleveldb/leveldb" 10 "github.com/syndtr/goleveldb/leveldb/iterator" 11 ) 12 13 type LDBDatabase struct { 14 db *leveldb.DB 15 comp bool 16 } 17 18 func NewLDBDatabase(name string) (*LDBDatabase, error) { 19 dbPath := path.Join(ethutil.Config.ExecPath, name) 20 21 // Open the db 22 db, err := leveldb.OpenFile(dbPath, nil) 23 if err != nil { 24 return nil, err 25 } 26 27 database := &LDBDatabase{db: db, comp: true} 28 29 return database, nil 30 } 31 32 func (self *LDBDatabase) Put(key []byte, value []byte) { 33 if self.comp { 34 value = rle.Compress(value) 35 } 36 37 err := self.db.Put(key, value, nil) 38 if err != nil { 39 fmt.Println("Error put", err) 40 } 41 } 42 43 func (self *LDBDatabase) Get(key []byte) ([]byte, error) { 44 dat, err := self.db.Get(key, nil) 45 if err != nil { 46 return nil, err 47 } 48 49 if self.comp { 50 return rle.Decompress(dat) 51 } 52 53 return dat, nil 54 } 55 56 func (self *LDBDatabase) Delete(key []byte) error { 57 return self.db.Delete(key, nil) 58 } 59 60 func (self *LDBDatabase) LastKnownTD() []byte { 61 data, _ := self.Get([]byte("LTD")) 62 63 if len(data) == 0 { 64 data = []byte{0x0} 65 } 66 67 return data 68 } 69 70 func (self *LDBDatabase) NewIterator() iterator.Iterator { 71 return self.db.NewIterator(nil, nil) 72 } 73 74 func (self *LDBDatabase) Write(batch *leveldb.Batch) error { 75 return self.db.Write(batch, nil) 76 } 77 78 func (self *LDBDatabase) Close() { 79 // Close the leveldb database 80 self.db.Close() 81 } 82 83 func (self *LDBDatabase) Print() { 84 iter := self.db.NewIterator(nil, nil) 85 for iter.Next() { 86 key := iter.Key() 87 value := iter.Value() 88 89 fmt.Printf("%x(%d): ", key, len(key)) 90 node := ethutil.NewValueFromBytes(value) 91 fmt.Printf("%v\n", node) 92 } 93 }