/
test_boltdb.go
128 lines (114 loc) · 2.62 KB
/
test_boltdb.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
package main
import (
"bytes"
"encoding/gob"
_ "fmt"
"github.com/boltdb/bolt"
"log"
"time"
)
type JobControl struct {
MaxConcurrency uint32
StartTime time.Time
ContinueJobOnTaskError bool
RemoteCurDir string
WorkerNameRegex string
// CompiledWorkerNameRegex *regexp.Regexp
// TODO: consider OSRegex as well, to limit to Workers matching a particular OS/version
ProcessPriority int
// TODO: later
//AssignSingleTaskPerWorker bool
//TaskWorkerAssignment map[string][]uint32
JobPriority int8 // higher value means higher priority
JobTimeout float64 // seconds
TaskTimeout float64 // seconds
TaskSeemsHungTimeout uint32
AbandonedJobTimeout uint32
MaxTaskReallocations uint8
}
func (this *JobControl) ToBytes() ([]byte, error) {
var buff bytes.Buffer
enc := gob.NewEncoder(&buff)
err := enc.Encode(this)
if err != nil {
return nil, err
}
return buff.Bytes(), nil
}
func (this *JobControl) FromBytes(data []byte) error {
buff := bytes.NewBuffer(data)
dec := gob.NewDecoder(buff)
err := dec.Decode(this)
if err != nil {
return err
}
return nil
}
/*
func JobControlFromBytes(data []byte) (*JobControl, error) {
buff := bytes.NewBuffer(data)
dec := gob.NewDecoder(buff)
ctrl := &JobControl{}
err := dec.Decode(ctrl)
if err != nil {
return nil, err
}
return ctrl, nil
}
*/
func DoUpdate(db *bolt.DB) error {
err := db.Update(func(tx *bolt.Tx) error {
b, err := tx.CreateBucketIfNotExists([]byte("MyBucket"))
if err != nil {
return err
}
ctrl := &JobControl{MaxConcurrency: 316, StartTime: time.Now(), ContinueJobOnTaskError: true, RemoteCurDir: "/some/dir"}
data, err := ctrl.ToBytes()
if err != nil {
log.Println("err: ", err)
return err
}
err = b.Put([]byte("answer"), data)
if err != nil {
log.Println("err: ", err)
return err
}
return nil
})
return err
}
func DoRead(db *bolt.DB) error {
err := db.View(func(tx *bolt.Tx) error {
b := tx.Bucket([]byte("MyBucket"))
log.Println("b is %s", b)
//if err != nil {
// return err
//}
v := b.Get([]byte("answer"))
//log.Printf("v=%s", v)
//if err != nil {
// return err
//}
//ctrl, err := JobControlFromBytes(v)
ctrl := &JobControl{}
err := ctrl.FromBytes(v)
if err != nil {
log.Println("error", err)
return err
}
log.Printf("the value is %+v", ctrl)
return nil
})
return err
}
func main() {
// Open the my.db data file in your current directory.
// It will be created if it doesn't exist.
db, err := bolt.Open("bolt-test.db", 0600, nil)
if err != nil {
log.Fatal(err)
}
defer db.Close()
DoUpdate(db)
DoRead(db)
}