forked from IceFireDB/IceFireDB
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
117 lines (102 loc) · 2.14 KB
/
main.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
* @Author: gitsrc
* @Date: 2021-03-08 13:09:44
* @LastEditors: gitsrc
* @LastEditTime: 2021-03-12 14:21:15
* @FilePath: /IceFireDB/main.go
*/
package main
import (
"fmt"
"io"
"os"
"path/filepath"
"github.com/gitsrc/IceFireDB/rafthub"
lediscfg "github.com/ledisdb/ledisdb/config"
"github.com/ledisdb/ledisdb/ledis"
"github.com/syndtr/goleveldb/leveldb"
"github.com/tidwall/sds"
)
func main() {
fmt.Println(banner)
conf.Name = "IceFireDB"
conf.Version = "1.0.0"
conf.GitSHA = BuildVersion
conf.DataDirReady = func(dir string) {
os.RemoveAll(filepath.Join(dir, "main.db"))
//配置ledis相关路径
cfg := lediscfg.NewConfigDefault()
cfg.DataDir = filepath.Join(dir, "main.db")
var err error
le, err = ledis.Open(cfg)
if err != nil {
panic(err)
}
ldb, err = le.Select(0)
if err != nil {
panic(err)
}
//这块代码谨慎判断
driver := ldb.GetSDB().GetDriver().GetStorageEngine()
db = driver.(*leveldb.DB)
}
conf.Snapshot = snapshot
conf.Restore = restore
rafthub.Main(conf)
}
type snap struct {
s *leveldb.Snapshot
}
func (s *snap) Done(path string) {}
func (s *snap) Persist(wr io.Writer) error {
sw := sds.NewWriter(wr)
iter := s.s.NewIterator(nil, nil)
for ok := iter.First(); ok; ok = iter.Next() {
if err := sw.WriteBytes(iter.Key()); err != nil {
return err
}
if err := sw.WriteBytes(iter.Value()); err != nil {
return err
}
}
iter.Release()
if err := iter.Error(); err != nil {
return err
}
return sw.Flush()
}
func snapshot(data interface{}) (rafthub.Snapshot, error) {
s, err := db.GetSnapshot()
if err != nil {
return nil, err
}
return &snap{s: s}, nil
}
func restore(rd io.Reader) (interface{}, error) {
sr := sds.NewReader(rd)
var batch leveldb.Batch
for {
key, err := sr.ReadBytes()
if err != nil {
if err == io.EOF {
break
}
return nil, err
}
value, err := sr.ReadBytes()
if err != nil {
return nil, err
}
batch.Put(key, value)
if batch.Len() == 1000 {
if err := db.Write(&batch, nil); err != nil {
return nil, err
}
batch.Reset()
}
}
if err := db.Write(&batch, nil); err != nil {
return nil, err
}
return nil, nil
}