forked from sdgdsffdsfff/cat.go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmessageid.go
74 lines (62 loc) · 1.18 KB
/
messageid.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
package cat
import "time"
type MessageIdFactory interface {
Next() (MessageId, error)
}
type message_id_factory struct {
index uint64
ceiling uint64
tsh uint64
lock chan int
}
func NewMessageIdFactory() MessageIdFactory {
return &message_id_factory{
0,
0,
0,
make(chan int, 1),
}
}
var MESSAGE_ID_FACTORY MessageIdFactory = NewMessageIdFactory()
func (f *message_id_factory) requestForFreshIds() (err error) {
f.index, f.ceiling, f.tsh, err = cat_new_mids()
return err
}
func (f *message_id_factory) Next() (MessageId, error) {
var err error = nil
f.lock <- 0
if !((f.index < f.ceiling) && f.tsh == uint64(time.Now().Unix() / 3600)) {
err = f.requestForFreshIds()
}
index := f.index
tsh := f.tsh
f.index++
<-f.lock
next := NewMessageId()
next.SetIndex(index)
next.SetTsh(tsh)
return next, err
}
type MessageId interface {
Encodable
SetIndex(index uint64)
SetTsh(tsh uint64)
}
type message_id struct {
Header
index uint64
tsh uint64
}
func NewMessageId() MessageId {
return &message_id{
NewHeader(),
0,
0,
}
}
func (mid *message_id) SetIndex(index uint64) {
mid.index = index
}
func (mid *message_id) SetTsh(tsh uint64) {
mid.tsh = tsh
}