Skip to content

Commit 20ca21a

Browse files
committed
store module and unit test for store
0 parents  commit 20ca21a

File tree

3 files changed

+205
-0
lines changed

3 files changed

+205
-0
lines changed

store.go

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package raftd
2+
3+
import (
4+
"path"
5+
"errors"
6+
"encoding/json"
7+
)
8+
9+
type Store struct {
10+
Nodes map[string]string `json:"nodes"`
11+
}
12+
13+
func createStore() *Store{
14+
s := new(Store)
15+
s.Nodes = make(map[string]string)
16+
return s
17+
}
18+
19+
// set the key to value, return the old value if the key exists
20+
func (s *Store) Set(key string, value string) (string, bool) {
21+
22+
key = path.Clean(key)
23+
24+
oldValue, ok := s.Nodes[key]
25+
26+
if ok {
27+
s.Nodes[key] = value
28+
return oldValue, true
29+
} else {
30+
s.Nodes[key] = value
31+
return "", false
32+
}
33+
34+
}
35+
36+
// get the node of the key
37+
func (s *Store) Get(key string) (string, error) {
38+
key = path.Clean(key)
39+
40+
value, ok := s.Nodes[key]
41+
42+
if ok {
43+
return value, nil
44+
} else {
45+
return "", errors.New("Key does not exist")
46+
}
47+
}
48+
49+
// delete the key, return the old value if the key exists
50+
func (s *Store) Delete(key string) (string, error) {
51+
key = path.Clean(key)
52+
53+
oldValue, ok := s.Nodes[key]
54+
55+
if ok {
56+
delete(s.Nodes, key)
57+
return oldValue, nil
58+
} else {
59+
return "", errors.New("Key does not exist")
60+
}
61+
}
62+
63+
func (s *Store) Save() ([]byte, error) {
64+
b, err := json.Marshal(s)
65+
if err != nil {
66+
return nil, err
67+
}
68+
return b, nil
69+
}
70+
71+
func (s *Store) Recovery(state []byte) error {
72+
err := json.Unmarshal(state, s)
73+
return err
74+
}

store_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package raftd
2+
3+
import (
4+
"testing"
5+
)
6+
7+
func TestStoreGet(t *testing.T) {
8+
store := createStore()
9+
10+
store.Set("foo", "bar")
11+
12+
value, err := store.Get("foo")
13+
14+
if err!= nil || value != "bar" {
15+
t.Fatalf("Cannot get stored value")
16+
}
17+
18+
store.Delete("foo")
19+
value, err = store.Get("foo")
20+
21+
if err == nil{
22+
t.Fatalf("Got deleted value")
23+
}
24+
}
25+
26+
func TestSaveAndRecovery(t *testing.T) {
27+
store := createStore()
28+
29+
store.Set("foo", "bar")
30+
31+
state, err := store.Save()
32+
33+
if err != nil {
34+
t.Fatalf("Cannot Save")
35+
}
36+
37+
newStore := createStore()
38+
newStore.Recovery(state)
39+
40+
value, err := newStore.Get("foo")
41+
42+
if err!= nil || value != "bar" {
43+
t.Fatalf("Cannot recovery")
44+
}
45+
46+
}

tree_store.bak

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package main
2+
3+
import (
4+
"path"
5+
"strings"
6+
)
7+
8+
type store struct {
9+
nodes map[string]node
10+
}
11+
12+
type node struct {
13+
value string
14+
dir bool // just for clearity
15+
nodes map[string]node
16+
}
17+
18+
// set the key to value, return the old value if the key exists
19+
func (s *store) set(key string, value string) string, error {
20+
21+
key = path.Clean(key)
22+
23+
nodeNames := strings.Split(key, "/")
24+
25+
levelNodes := s.nodes
26+
for i = 0; i < len(nodes) - 1; ++i {
27+
node, ok := levelNodes[nodeNames[i]]
28+
// add new dir
29+
if !ok {
30+
node := Node{nodeNames[i], true, make(map[string]node)}
31+
levelNodes[nodeNames[i]] := node
32+
} else if ok && !node.dir {
33+
return nil, errors.New("The key is a directory")
34+
}
35+
else {
36+
levelNodes = levelNodes.nodes
37+
}
38+
}
39+
// add the last node and value
40+
node, ok := levelNodes[nodeNames[i]]
41+
42+
if !ok {
43+
node := Node{nodeNames[i], false, nil}
44+
levelNodes[nodeNames] = node
45+
return nil, nil
46+
} else {
47+
oldValue := node.value
48+
node.value = value
49+
return oldValue ,nil
50+
}
51+
52+
}
53+
54+
// get the node of the key
55+
func (s *store) get(key string) node {
56+
key = path.Clean(key)
57+
58+
nodeNames := strings.Split(key, "/")
59+
60+
levelNodes := s.nodes
61+
62+
for i = 0; i < len(nodes) - 1; ++i {
63+
node, ok := levelNodes[nodeNames[i]]
64+
if !ok || !node.dir {
65+
return nil
66+
}
67+
levelNodes = levelNodes.nodes
68+
}
69+
70+
node, ok := levelNodes[nodeNames[i]]
71+
if ok {
72+
return node
73+
}
74+
return nil
75+
76+
}
77+
78+
// delete the key, return the old value if the key exists
79+
func (s *store) delete(key string) string {
80+
return nil
81+
}
82+
83+
func (n *node) Value() string{
84+
return n.value
85+
}

0 commit comments

Comments
 (0)