/
database.go
133 lines (108 loc) · 2.88 KB
/
database.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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package app
import (
"errors"
"os"
"os/user"
"path"
"github.com/syndtr/goleveldb/leveldb"
)
// GetDatabasePath return the path of the database
func GetDatabasePath() (string, error) {
usr, err := user.Current()
if err != nil {
return "", err
}
return path.Join(usr.HomeDir, ".jmpdata"), nil
}
// GetDatabase returns a levelDB object that can be used to access the database
func GetDatabase() (*leveldb.DB, error) {
databasePath, err := GetDatabasePath()
if err != nil {
return nil, err
}
db, err := leveldb.OpenFile(databasePath, nil)
if err != nil {
return nil, err
}
return db, err
}
// DestroyDatabase removes the directory where the leveldb stores the checkpoints
func DestroyDatabase() error {
databasePath, err := GetDatabasePath()
if err != nil {
return err
}
os.RemoveAll(databasePath)
return nil
}
// FetchCheckpoint return the string path of a checkpoint in the database
func FetchCheckpoint(name string) (string, error) {
db, err := GetDatabase()
if err != nil {
return "", err
}
defer db.Close()
path, err := db.Get([]byte(name), nil)
if err != nil {
if err == leveldb.ErrNotFound {
return "", errors.New("jump: Checkpoint not found")
}
return "", err
}
return string(path), nil
}
// AddCheckpoint adds a single key value pair in the form of name and path of a checkpoint to the database
func AddCheckpoint(name string, path string) error {
walk, err := FetchCheckpoint(name)
if len(walk) > 0 {
return errors.New("jump: Checkpoint already exists")
}
db, err := GetDatabase()
if err != nil {
return err
}
defer db.Close()
err = db.Put([]byte(name), []byte(path), nil)
if err != nil {
return err
}
return nil
}
// RemoveCheckpoint removes a single checkpoint from the database
func RemoveCheckpoint(name string) (string, error) {
walk, err := FetchCheckpoint(name)
if len(walk) == 0 {
return "", errors.New("jump: Checkpoint doesn't exist")
}
db, err := GetDatabase()
if err != nil {
return "", err
}
defer db.Close()
err = db.Delete([]byte(name), nil)
if err != nil {
return "", err
}
return walk, nil
}
// ShowCheckpoints return a list of all the checkpoints
func ShowCheckpoints() (Checkpoints, error) {
db, err := GetDatabase()
checkpoints := Checkpoints{}
if err != nil {
return checkpoints, err
}
defer db.Close()
iter := db.NewIterator(nil, nil)
for iter.Next() {
key := iter.Key()
value := iter.Value()
checkpoints = append(checkpoints, Checkpoint{Name: string(key), Path: string(value),})
}
iter.Release()
err = iter.Error()
if err != nil {
return checkpoints, err
}
return checkpoints, nil
}