tendermint/mem_db.go

107 lines
1.8 KiB
Go
Raw Normal View History

2015-10-22 12:31:02 -07:00
package db
import (
"fmt"
2016-11-29 16:06:36 -08:00
"sync"
2015-10-22 12:31:02 -07:00
)
type MemDB struct {
2016-11-29 16:06:36 -08:00
mtx sync.Mutex
db map[string][]byte
2015-10-22 12:31:02 -07:00
}
func NewMemDB() *MemDB {
database := &MemDB{db: make(map[string][]byte)}
return database
}
func (db *MemDB) Get(key []byte) []byte {
2016-11-29 16:06:36 -08:00
db.mtx.Lock()
defer db.mtx.Unlock()
2015-10-22 12:31:02 -07:00
return db.db[string(key)]
}
func (db *MemDB) Set(key []byte, value []byte) {
2016-11-29 16:06:36 -08:00
db.mtx.Lock()
defer db.mtx.Unlock()
2015-10-22 12:31:02 -07:00
db.db[string(key)] = value
}
func (db *MemDB) SetSync(key []byte, value []byte) {
2016-11-29 16:06:36 -08:00
db.mtx.Lock()
defer db.mtx.Unlock()
2015-10-22 12:31:02 -07:00
db.db[string(key)] = value
}
func (db *MemDB) Delete(key []byte) {
2016-11-29 16:06:36 -08:00
db.mtx.Lock()
defer db.mtx.Unlock()
2015-10-22 12:31:02 -07:00
delete(db.db, string(key))
}
func (db *MemDB) DeleteSync(key []byte) {
2016-11-29 16:06:36 -08:00
db.mtx.Lock()
defer db.mtx.Unlock()
2015-10-22 12:31:02 -07:00
delete(db.db, string(key))
}
func (db *MemDB) Close() {
2016-11-29 16:06:36 -08:00
db.mtx.Lock()
defer db.mtx.Unlock()
2015-10-22 12:31:02 -07:00
db = nil
}
func (db *MemDB) Print() {
2016-11-29 16:06:36 -08:00
db.mtx.Lock()
defer db.mtx.Unlock()
2015-10-22 12:31:02 -07:00
for key, value := range db.db {
fmt.Printf("[%X]:\t[%X]\n", []byte(key), value)
}
}
2016-11-29 16:06:36 -08:00
func (db *MemDB) NewBatch() Batch {
return &memDBBatch{db, nil}
}
//--------------------------------------------------------------------------------
type memDBBatch struct {
db *MemDB
ops []operation
}
type opType int
const (
opTypeSet = 1
opTypeDelete = 2
)
type operation struct {
opType
key []byte
value []byte
}
func (mBatch *memDBBatch) Set(key, value []byte) {
mBatch.ops = append(mBatch.ops, operation{opTypeSet, key, value})
}
func (mBatch *memDBBatch) Delete(key []byte) {
mBatch.ops = append(mBatch.ops, operation{opTypeDelete, key, nil})
}
func (mBatch *memDBBatch) Write() {
mBatch.db.mtx.Lock()
defer mBatch.db.mtx.Unlock()
for _, op := range mBatch.ops {
if op.opType == opTypeSet {
mBatch.db.db[string(op.key)] = op.value
} else if op.opType == opTypeDelete {
delete(mBatch.db.db, string(op.key))
}
}
}