github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/ethdb/memory_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  //版权所有2014 Go Ethereum作者
    10  //此文件是Go以太坊库的一部分。
    11  //
    12  //Go-Ethereum库是免费软件:您可以重新分发它和/或修改
    13  //根据GNU发布的较低通用公共许可证的条款
    14  //自由软件基金会,或者许可证的第3版,或者
    15  //(由您选择)任何更高版本。
    16  //
    17  //Go以太坊图书馆的发行目的是希望它会有用,
    18  //但没有任何保证;甚至没有
    19  //适销性或特定用途的适用性。见
    20  //GNU较低的通用公共许可证,了解更多详细信息。
    21  //
    22  //你应该收到一份GNU较低级别的公共许可证副本
    23  //以及Go以太坊图书馆。如果没有,请参见<http://www.gnu.org/licenses/>。
    24  
    25  package ethdb
    26  
    27  import (
    28  	"errors"
    29  	"sync"
    30  
    31  	"github.com/ethereum/go-ethereum/common"
    32  )
    33  
    34  /*
    35   *这是一个测试内存数据库。不要用于任何不持久化的产品
    36   **/
    37  
    38  type MemDatabase struct {
    39  	db   map[string][]byte
    40  	lock sync.RWMutex
    41  }
    42  
    43  func NewMemDatabase() *MemDatabase {
    44  	return &MemDatabase{
    45  		db: make(map[string][]byte),
    46  	}
    47  }
    48  
    49  func NewMemDatabaseWithCap(size int) *MemDatabase {
    50  	return &MemDatabase{
    51  		db: make(map[string][]byte, size),
    52  	}
    53  }
    54  
    55  func (db *MemDatabase) Put(key []byte, value []byte) error {
    56  	db.lock.Lock()
    57  	defer db.lock.Unlock()
    58  
    59  	db.db[string(key)] = common.CopyBytes(value)
    60  	return nil
    61  }
    62  
    63  func (db *MemDatabase) Has(key []byte) (bool, error) {
    64  	db.lock.RLock()
    65  	defer db.lock.RUnlock()
    66  
    67  	_, ok := db.db[string(key)]
    68  	return ok, nil
    69  }
    70  
    71  func (db *MemDatabase) Get(key []byte) ([]byte, error) {
    72  	db.lock.RLock()
    73  	defer db.lock.RUnlock()
    74  
    75  	if entry, ok := db.db[string(key)]; ok {
    76  		return common.CopyBytes(entry), nil
    77  	}
    78  	return nil, errors.New("not found")
    79  }
    80  
    81  func (db *MemDatabase) Keys() [][]byte {
    82  	db.lock.RLock()
    83  	defer db.lock.RUnlock()
    84  
    85  	keys := [][]byte{}
    86  	for key := range db.db {
    87  		keys = append(keys, []byte(key))
    88  	}
    89  	return keys
    90  }
    91  
    92  func (db *MemDatabase) Delete(key []byte) error {
    93  	db.lock.Lock()
    94  	defer db.lock.Unlock()
    95  
    96  	delete(db.db, string(key))
    97  	return nil
    98  }
    99  
   100  func (db *MemDatabase) Close() {}
   101  
   102  func (db *MemDatabase) NewBatch() Batch {
   103  	return &memBatch{db: db}
   104  }
   105  
   106  func (db *MemDatabase) Len() int { return len(db.db) }
   107  
   108  type kv struct {
   109  	k, v []byte
   110  	del  bool
   111  }
   112  
   113  type memBatch struct {
   114  	db     *MemDatabase
   115  	writes []kv
   116  	size   int
   117  }
   118  
   119  func (b *memBatch) Put(key, value []byte) error {
   120  	b.writes = append(b.writes, kv{common.CopyBytes(key), common.CopyBytes(value), false})
   121  	b.size += len(value)
   122  	return nil
   123  }
   124  
   125  func (b *memBatch) Delete(key []byte) error {
   126  	b.writes = append(b.writes, kv{common.CopyBytes(key), nil, true})
   127  	b.size += 1
   128  	return nil
   129  }
   130  
   131  func (b *memBatch) Write() error {
   132  	b.db.lock.Lock()
   133  	defer b.db.lock.Unlock()
   134  
   135  	for _, kv := range b.writes {
   136  		if kv.del {
   137  			delete(b.db.db, string(kv.k))
   138  			continue
   139  		}
   140  		b.db.db[string(kv.k)] = kv.v
   141  	}
   142  	return nil
   143  }
   144  
   145  func (b *memBatch) ValueSize() int {
   146  	return b.size
   147  }
   148  
   149  func (b *memBatch) Reset() {
   150  	b.writes = b.writes[:0]
   151  	b.size = 0
   152  }