github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/storage/database.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //
    10  //
    11  //
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  
    25  package storage
    26  
    27  //
    28  //
    29  
    30  import (
    31  	"fmt"
    32  
    33  	"github.com/ethereum/go-ethereum/metrics"
    34  	"github.com/syndtr/goleveldb/leveldb"
    35  	"github.com/syndtr/goleveldb/leveldb/iterator"
    36  	"github.com/syndtr/goleveldb/leveldb/opt"
    37  )
    38  
    39  const openFileLimit = 128
    40  
    41  type LDBDatabase struct {
    42  	db *leveldb.DB
    43  }
    44  
    45  func NewLDBDatabase(file string) (*LDBDatabase, error) {
    46  //
    47  	db, err := leveldb.OpenFile(file, &opt.Options{OpenFilesCacheCapacity: openFileLimit})
    48  	if err != nil {
    49  		return nil, err
    50  	}
    51  
    52  	database := &LDBDatabase{db: db}
    53  
    54  	return database, nil
    55  }
    56  
    57  func (db *LDBDatabase) Put(key []byte, value []byte) {
    58  	metrics.GetOrRegisterCounter("ldbdatabase.put", nil).Inc(1)
    59  
    60  	err := db.db.Put(key, value, nil)
    61  	if err != nil {
    62  		fmt.Println("Error put", err)
    63  	}
    64  }
    65  
    66  func (db *LDBDatabase) Get(key []byte) ([]byte, error) {
    67  	metrics.GetOrRegisterCounter("ldbdatabase.get", nil).Inc(1)
    68  
    69  	dat, err := db.db.Get(key, nil)
    70  	if err != nil {
    71  		return nil, err
    72  	}
    73  	return dat, nil
    74  }
    75  
    76  func (db *LDBDatabase) Delete(key []byte) error {
    77  	return db.db.Delete(key, nil)
    78  }
    79  
    80  func (db *LDBDatabase) LastKnownTD() []byte {
    81  	data, _ := db.Get([]byte("LTD"))
    82  
    83  	if len(data) == 0 {
    84  		data = []byte{0x0}
    85  	}
    86  
    87  	return data
    88  }
    89  
    90  func (db *LDBDatabase) NewIterator() iterator.Iterator {
    91  	metrics.GetOrRegisterCounter("ldbdatabase.newiterator", nil).Inc(1)
    92  
    93  	return db.db.NewIterator(nil, nil)
    94  }
    95  
    96  func (db *LDBDatabase) Write(batch *leveldb.Batch) error {
    97  	metrics.GetOrRegisterCounter("ldbdatabase.write", nil).Inc(1)
    98  
    99  	return db.db.Write(batch, nil)
   100  }
   101  
   102  func (db *LDBDatabase) Close() {
   103  //
   104  	db.db.Close()
   105  }