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  }