forked from quickfixgo/quickfix
-
Notifications
You must be signed in to change notification settings - Fork 0
/
store.go
145 lines (117 loc) · 3.64 KB
/
store.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
// Copyright (c) quickfixengine.org All rights reserved.
//
// This file may be distributed under the terms of the quickfixengine.org
// license as defined by quickfixengine.org and appearing in the file
// LICENSE included in the packaging of this file.
//
// This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING
// THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A
// PARTICULAR PURPOSE.
//
// See http://www.quickfixengine.org/LICENSE for licensing information.
//
// Contact [email protected] if any conditions of this licensing
// are not clear to you.
package quickfix
import (
"time"
"github.com/pkg/errors"
)
// The MessageStore interface provides methods to record and retrieve messages for resend purposes.
type MessageStore interface {
NextSenderMsgSeqNum() int
NextTargetMsgSeqNum() int
IncrNextSenderMsgSeqNum() error
IncrNextTargetMsgSeqNum() error
SetNextSenderMsgSeqNum(next int) error
SetNextTargetMsgSeqNum(next int) error
CreationTime() time.Time
SaveMessage(seqNum int, msg []byte) error
SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg []byte) error
GetMessages(beginSeqNum, endSeqNum int) ([][]byte, error)
Refresh() error
Reset() error
Close() error
}
// The MessageStoreFactory interface is used by session to create a session specific message store.
type MessageStoreFactory interface {
Create(sessionID SessionID) (MessageStore, error)
}
type memoryStore struct {
senderMsgSeqNum, targetMsgSeqNum int
creationTime time.Time
messageMap map[int][]byte
}
func (store *memoryStore) NextSenderMsgSeqNum() int {
return store.senderMsgSeqNum + 1
}
func (store *memoryStore) NextTargetMsgSeqNum() int {
return store.targetMsgSeqNum + 1
}
func (store *memoryStore) IncrNextSenderMsgSeqNum() error {
store.senderMsgSeqNum++
return nil
}
func (store *memoryStore) IncrNextTargetMsgSeqNum() error {
store.targetMsgSeqNum++
return nil
}
func (store *memoryStore) SetNextSenderMsgSeqNum(nextSeqNum int) error {
store.senderMsgSeqNum = nextSeqNum - 1
return nil
}
func (store *memoryStore) SetNextTargetMsgSeqNum(nextSeqNum int) error {
store.targetMsgSeqNum = nextSeqNum - 1
return nil
}
func (store *memoryStore) CreationTime() time.Time {
return store.creationTime
}
func (store *memoryStore) Reset() error {
store.senderMsgSeqNum = 0
store.targetMsgSeqNum = 0
store.creationTime = time.Now()
store.messageMap = nil
return nil
}
func (store *memoryStore) Refresh() error {
// NOP, nothing to refresh.
return nil
}
func (store *memoryStore) Close() error {
// NOP, nothing to close.
return nil
}
func (store *memoryStore) SaveMessage(seqNum int, msg []byte) error {
if store.messageMap == nil {
store.messageMap = make(map[int][]byte)
}
store.messageMap[seqNum] = msg
return nil
}
func (store *memoryStore) SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg []byte) error {
err := store.SaveMessage(seqNum, msg)
if err != nil {
return err
}
return store.IncrNextSenderMsgSeqNum()
}
func (store *memoryStore) GetMessages(beginSeqNum, endSeqNum int) ([][]byte, error) {
var msgs [][]byte
for seqNum := beginSeqNum; seqNum <= endSeqNum; seqNum++ {
if m, ok := store.messageMap[seqNum]; ok {
msgs = append(msgs, m)
}
}
return msgs, nil
}
type memoryStoreFactory struct{}
func (f memoryStoreFactory) Create(sessionID SessionID) (MessageStore, error) {
m := new(memoryStore)
if err := m.Reset(); err != nil {
return m, errors.Wrap(err, "reset")
}
return m, nil
}
// NewMemoryStoreFactory returns a MessageStoreFactory instance that created in-memory MessageStores.
func NewMemoryStoreFactory() MessageStoreFactory { return memoryStoreFactory{} }