/
repo.go
104 lines (89 loc) · 2.16 KB
/
repo.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
package repo
import (
"encoding/json"
"log"
"time"
"github.com/gomodule/redigo/redis"
)
type Repo interface {
SetDeviceStatus(DeviceState) (err error)
GetDeviceStatus(id string) (DeviceState, error)
DeleteDeviceStatus(id string) (err error)
}
type DeviceState struct {
ID string
Status DeviceStatus
}
type redisRepo struct {
pool *redis.Pool
}
func newPool(server string) *redis.Pool {
return &redis.Pool{
MaxIdle: 3,
IdleTimeout: 240 * time.Second,
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", server)
if err != nil {
return nil, err
}
return c, err
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
_, err := c.Do("PING")
return err
},
}
}
func NewRedisRepo(addr string) (repo Repo, err error) {
return &redisRepo{
pool: newPool(addr),
}, nil
}
func (r *redisRepo) SetDeviceStatus(d DeviceState) (err error) {
return r.setState(d)
}
func (r *redisRepo) GetDeviceStatus(id string) (d DeviceState, err error) {
return r.getState(id)
}
func (r *redisRepo) DeleteDeviceStatus(id string) (err error) {
return r.deleteState(id)
}
func (r *redisRepo) getState(devID string) (d DeviceState, err error) {
conn := r.pool.Get()
defer conn.Close()
bytes, err := redis.Bytes(conn.Do("GET", devID))
if err != nil {
log.Printf("Error occured while getting device status from redis " + err.Error())
return DeviceState{}, err
}
err = json.Unmarshal(bytes, &d)
if err != nil {
log.Printf("Error occured while unmarshalling the device status " + err.Error())
return DeviceState{}, err
}
return d, nil
}
func (r *redisRepo) setState(d DeviceState) (err error) {
conn := r.pool.Get()
defer conn.Close()
bytes, err := json.Marshal(&d)
if err != nil {
return err
}
err = conn.Send("SET", d.ID, bytes)
if err != nil {
log.Printf("Error occured while saving device status in redis " + err.Error())
return err
}
return nil
}
func (r *redisRepo) deleteState(devID string) (err error) {
conn := r.pool.Get()
defer conn.Close()
_, err = redis.Int64(conn.Do("DEL", devID))
if err != nil {
log.Printf("Error occured while deleting device status from redis " + err.Error())
return err
}
return nil
}