diff --git a/cmd/cmd.go b/cmd/cmd.go index 4d4d7f44..51f648a7 100644 --- a/cmd/cmd.go +++ b/cmd/cmd.go @@ -33,6 +33,8 @@ func Init() { switch flagStore { case "memcached": store.DefaultStore = store.NewMemcacheStore() + case "memory": + store.DefaultStore = store.NewMemoryStore() case "etcd": store.DefaultStore = store.NewEtcdStore() } diff --git a/store/memory_item.go b/store/memory_item.go new file mode 100644 index 00000000..c842ca55 --- /dev/null +++ b/store/memory_item.go @@ -0,0 +1,14 @@ +package store + +type MemoryItem struct { + key string + value []byte +} + +func (m *MemoryItem) Key() string { + return m.key +} + +func (m *MemoryItem) Value() []byte { + return m.value +} diff --git a/store/memory_store.go b/store/memory_store.go new file mode 100644 index 00000000..2b96ab0c --- /dev/null +++ b/store/memory_store.go @@ -0,0 +1,48 @@ +package store + +import ( + "errors" + "sync" +) + +type MemoryStore struct { + sync.RWMutex + store map[string]Item +} + +func (m *MemoryStore) Get(key string) (Item, error) { + m.RLock() + v, ok := m.store[key] + m.RUnlock() + if !ok { + return nil, errors.New("key not found") + } + return v, nil +} + +func (m *MemoryStore) Del(key string) error { + m.Lock() + delete(m.store, key) + m.Unlock() + return nil +} + +func (m *MemoryStore) Put(item Item) error { + m.Lock() + m.store[item.Key()] = item + m.Unlock() + return nil +} + +func (m *MemoryStore) NewItem(key string, value []byte) Item { + return &MemoryItem{ + key: key, + value: value, + } +} + +func NewMemoryStore() Store { + return &MemoryStore{ + store: make(map[string]Item), + } +}