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 }