-
Notifications
You must be signed in to change notification settings - Fork 0
/
persistence.go
92 lines (76 loc) · 1.33 KB
/
persistence.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
88
89
90
91
92
package kvndb
import (
"encoding/hex"
"io"
)
func save(d *db, dir string, hist uint) error {
maxId, err := getMaxSnapshotId(dir)
if err != nil {
return err
}
id := maxId + 1
fd, err := getSnapshotFDForWriting(id, dir)
if err != nil {
return err
}
for keyString, value := range d.data {
key, err := hex.DecodeString(keyString)
if err != nil {
return err
}
_, err = fd.Write(packBytes(key, value))
if err != nil {
return err
}
}
err = fd.Flush()
if err != nil {
return err
}
err = fd.Close()
if err != nil {
return err
}
// write checksum
err = writeSnapshotChecksum(id, dir)
if err != nil {
return err
}
err = cleanupSnapshotsUpTo(dir, hist)
if err != nil {
return err
}
return nil
}
func load(d *db, dir string) error {
// reset data regardless
d.data = make(map[string][]byte)
id, err := getMaxSnapshotId(dir)
if err != nil {
return err
}
// if id == 0 there is no snapshots to load
if id == 0 {
return ErrSnapshotNotFound
}
// verify snapshot checksum
err = verifySnapshotChecksum(id, dir)
if err != nil {
return err
}
fd, err := getSnapshotFDForReading(id, dir)
if err != nil {
return err
}
for true {
key, value, err := readNext(fd)
if err != nil {
if err == io.EOF {
break
}
return err
}
d.data[hex.EncodeToString(key)] = value
}
return nil
}