forked from ubuconeurope/present-switch
-
Notifications
You must be signed in to change notification settings - Fork 0
/
persistence.go
107 lines (86 loc) · 2.28 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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package main
import (
"encoding/json"
"errors"
"log"
"strconv"
"time"
bolt "go.etcd.io/bbolt"
)
// RoomInfo represents the current state of a RoomInfo.
type RoomInfo struct {
ID int `json:"room_id"` // room number
RoomName string `json:"room"`
CurrentTitle string `json:"title"`
CurrentSpeaker string `json:"speaker"`
CurrentTime string `json:"time"`
NextTitle string `json:"n_title"`
NextSpeaker string `json:"n_speaker"`
NextTime string `json:"n_time"`
AutoLoopSec int `json:"auto_loop_sec"`
}
// InitDB creates a new DB object using filename as parameter
func InitDB(filepath string) *bolt.DB {
db, err := bolt.Open(filepath, 0600, &bolt.Options{Timeout: 1 * time.Second})
if err != nil {
log.Println("Error InitDB")
panic(err)
}
if db == nil {
panic("db nil")
}
return db
}
// StoreItem stores multiple items
func StoreItem(db *bolt.DB, item RoomInfo) {
roomInfoKey := strconv.Itoa(item.ID)
roomInfoValue, err := json.Marshal(item)
if err != nil {
log.Println(err)
}
db.Update(func(tx *bolt.Tx) error {
b, err := tx.CreateBucketIfNotExists([]byte("room_info"))
if err != nil {
return err
}
return b.Put([]byte(roomInfoKey), []byte(roomInfoValue))
})
}
// ReadRoomInfoTable reads all rows in the room_info table
func ReadRoomInfoTable(db *bolt.DB) (map[int]RoomInfo, error) {
tx, err := db.Begin(false)
if err != nil {
return nil, err
}
defer tx.Rollback()
roomInfoArray := make(map[int]RoomInfo)
b := tx.Bucket([]byte("room_info"))
c := b.Cursor()
for k, v := c.First(); k != nil; k, v = c.Next() {
roomInfo := RoomInfo{}
if err = json.Unmarshal(v, &roomInfo); err != nil {
return nil, err
}
roomInfoArray[roomInfo.ID] = roomInfo
}
return roomInfoArray, nil
}
// ReadRoomInfo read one row, with the row ID
func ReadRoomInfo(db *bolt.DB, id int) (RoomInfo, error) {
roomInfoKey := strconv.Itoa(id)
tx, err := db.Begin(false)
if err != nil {
return RoomInfo{}, err
}
defer tx.Rollback()
bkt := tx.Bucket([]byte("room_info"))
if bkt == nil {
return RoomInfo{}, errors.New("No room_info bucket available (database is empty)")
}
v := bkt.Get([]byte(roomInfoKey))
var roomInfo RoomInfo
if err = json.Unmarshal(v, &roomInfo); err != nil {
return RoomInfo{}, err
}
return roomInfo, err
}