从零开始写数据库(二)

持久化数据

这里使用csv格式保存数据

修改db.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package main

import (
"encoding/csv"
"os"
"log"
"io/ioutil"
"bytes"
)

const FILE = "./db.csv"

// 声明一个map
var m map[string]string


func init() {
// 初始化map
m = make(map[string]string)

// 打开文件
file, err := os.Open(FILE)

if err != nil {
log.Fatal(err)
}

defer file.Close()

// 读取CSV文件
reader := csv.NewReader(file)

// 读取数据,这里data的类型是[][]string
data, err := reader.ReadAll()

if err != nil {
log.Fatal(err)
}

// 循环数组
for i := 0; i < len(data); i++ {
// 获取行
row := data[i]

// 第一个为key
key := row[0]
// 第二个为value
value := row[1]

// 保持到内存
m[key] = value
}
}
// 新建,修改
func Put(key string, value string) {
m[key] = value
}
// 删除
func Delete(key string) {
delete(m, key)
}
// 读取
func Get(key string) string {
return m[key]
}

// 写入文件
func Save() {

// 新建写入流
buf := new(bytes.Buffer)

writer := csv.NewWriter(buf)

log.Print(m)
for k, v := range m {
log.Printf(k, v)
// 写入数据
writer.Write([]string{k, v})
writer.Flush()
}

log.Println(buf)

// 保存到文件
ioutil.WriteFile(FILE, buf.Bytes(), 0777 )
}

我们写个测试类测试

main_test.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package main

import "testing"

func TestPut(t *testing.T) {
Put("hello", "world")
t.Log("insert a record")
value := Get("hello")
if value == "world" {
t.Log("get a record")
} else {
t.Error("insert error")
}

t.Log("save")
defer Save()
t.Log("save")
}

func TestGet(t *testing.T) {
value := Get("hello")
if value == "world" {
t.Log("get a record")
} else {
t.Error("insert error")
}
defer Save()
}

func TestDelete(t *testing.T) {
Delete("hello")
value := Get("hello")
if value == "world" {
t.Error("get a record")
} else {
t.Log("insert error")
}
defer Save()
}

开测

1
2
3
4
5
6
7
8
9
10
11
12
13
14
go test

2018/06/30 14:26:29 map[hello:world]
2018/06/30 14:26:29 hello: world
2018/06/30 14:26:29 hello,world

2018/06/30 14:26:29 map[hello:world]
2018/06/30 14:26:29 hello: world
2018/06/30 14:26:29 hello,world

2018/06/30 14:26:29 map[]
2018/06/30 14:26:29
PASS
ok github.com/ixiongdi/leveldb 0.013s

结果如预期的一样,这样我们实现了一个简单的具有数据持久化功能的kv数据库