11 registerDBCreator(MemDBBackendStr, func(name string, dir string) (DB, error) {
12 return NewMemDB(), nil
21 func NewMemDB() *MemDB {
22 database := &MemDB{db: make(map[string][]byte)}
26 func (db *MemDB) Get(key []byte) []byte {
29 return db.db[string(key)]
32 func (db *MemDB) Set(key []byte, value []byte) {
35 db.db[string(key)] = value
38 func (db *MemDB) SetSync(key []byte, value []byte) {
41 db.db[string(key)] = value
44 func (db *MemDB) Delete(key []byte) {
47 delete(db.db, string(key))
50 func (db *MemDB) DeleteSync(key []byte) {
53 delete(db.db, string(key))
56 func (db *MemDB) Close() {
57 // Close is a noop since for an in-memory
58 // database, we don't have a destination
59 // to flush contents to nor do we want
60 // any data loss on invoking Close()
61 // See the discussion in https://github.com/tendermint/tmlibs/pull/56
64 func (db *MemDB) Print() {
67 for key, value := range db.db {
68 fmt.Printf("[%X]:\t[%X]\n", []byte(key), value)
72 func (db *MemDB) Stats() map[string]string {
73 stats := make(map[string]string)
74 stats["database.type"] = "memDB"
78 type memDBIterator struct {
84 func newMemDBIterator() *memDBIterator {
85 return &memDBIterator{}
88 func (it *memDBIterator) Next() bool {
89 if it.last >= len(it.keys)-1 {
96 func (it *memDBIterator) Key() []byte {
97 return []byte(it.keys[it.last])
100 func (it *memDBIterator) Value() []byte {
101 return it.db.Get(it.Key())
104 func (it *memDBIterator) Seek(point []byte) bool {
105 for i, key := range it.keys {
106 if key >= string(point) {
114 func (it *memDBIterator) Release() {
119 func (it *memDBIterator) Error() error {
123 func (db *MemDB) Iterator() Iterator {
124 return db.IteratorPrefix([]byte{})
127 func (db *MemDB) IteratorPrefix(prefix []byte) Iterator {
128 it := newMemDBIterator()
133 defer db.mtx.Unlock()
135 // unfortunately we need a copy of all of the keys
136 for key, _ := range db.db {
137 if strings.HasPrefix(key, string(prefix)) {
138 it.keys = append(it.keys, key)
141 // and we need to sort them
142 sort.Strings(it.keys)
146 func (db *MemDB) NewBatch() Batch {
147 return &memDBBatch{db, nil}
150 //--------------------------------------------------------------------------------
152 type memDBBatch struct {
164 type operation struct {
170 func (mBatch *memDBBatch) Set(key, value []byte) {
171 mBatch.ops = append(mBatch.ops, operation{opTypeSet, key, value})
174 func (mBatch *memDBBatch) Delete(key []byte) {
175 mBatch.ops = append(mBatch.ops, operation{opTypeDelete, key, nil})
178 func (mBatch *memDBBatch) Write() {
180 defer mBatch.db.mtx.Unlock()
182 for _, op := range mBatch.ops {
183 if op.opType == opTypeSet {
184 mBatch.db.db[string(op.key)] = op.value
185 } else if op.opType == opTypeDelete {
186 delete(mBatch.db.db, string(op.key))