-
Notifications
You must be signed in to change notification settings - Fork 329
/
main.go
102 lines (90 loc) · 2.17 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
package main
import (
"github.com/nutsdb/nutsdb"
"io/ioutil"
"log"
"os"
)
var (
db *nutsdb.DB
bucket string
err error
)
func init() {
fileDir := "/tmp/nutsdb_example"
files, _ := ioutil.ReadDir(fileDir)
for _, f := range files {
name := f.Name()
if name != "" {
err := os.RemoveAll(fileDir + "/" + name)
if err != nil {
panic(err)
}
}
}
db, _ = nutsdb.Open(
nutsdb.DefaultOptions,
nutsdb.WithDir(fileDir),
nutsdb.WithSegmentSize(1024*1024), // 1MB
)
if err != nil {
panic(err)
}
bucket = "bucketForString"
if err := db.Update(func(tx *nutsdb.Tx) error {
return tx.NewBucket(nutsdb.DataStructureBTree, bucket)
}); err != nil {
log.Fatal(err)
}
}
func main() {
// If we use `GetBit` on a key that does not exist, we will get an error with 'key not found'
getBit("non-exist", 12)
// If we `SetBit` on an exist k-v, we will update the corresponding bit of value.
put("key1", "value1")
setBit("key1", 5, 2)
getBit("key1", 5) // get bit: 2
// If we `SetBit` on a non-exist k-v or length of value is less than given offset, we will expand the value.
// The expanded value will be filled with 0. Until we can modify the corresponding bit with given offset.
setBit("key2", 5, 1)
getBit("key2", 5) // get bit: 1
get("key2") // get value: [0, 0, 0, 0, 0, 1]
}
func get(key string) {
if err := db.View(func(tx *nutsdb.Tx) error {
value, err := tx.Get(bucket, []byte(key))
if err != nil {
return err
}
log.Println("get value: ", value)
return nil
}); err != nil {
log.Println(err)
}
}
func put(key, value string) {
if err := db.Update(func(tx *nutsdb.Tx) error {
return tx.Put(bucket, []byte(key), []byte(value), nutsdb.Persistent)
}); err != nil {
log.Println(err)
}
}
func getBit(key string, offset int) {
if err := db.View(func(tx *nutsdb.Tx) error {
bit, err := tx.GetBit(bucket, []byte(key), offset)
if err != nil {
return err
}
log.Println("get bit:", bit)
return nil
}); err != nil {
log.Println(err)
}
}
func setBit(key string, offset int, bit byte) {
if err := db.Update(func(tx *nutsdb.Tx) error {
return tx.SetBit(bucket, []byte(key), offset, bit)
}); err != nil {
log.Println(err)
}
}