@@ -27,6 +27,11 @@ import (
27
27
"github.com/quickfixgo/quickfix/config"
28
28
)
29
29
30
+ const (
31
+ defaultMessagesTable = "messages"
32
+ defaultSessionsTable = "sessions"
33
+ )
34
+
30
35
type sqlStoreFactory struct {
31
36
settings * quickfix.Settings
32
37
}
@@ -39,6 +44,19 @@ type sqlStore struct {
39
44
sqlConnMaxLifetime time.Duration
40
45
db * sql.DB
41
46
placeholder placeholderFunc
47
+ messagesTable string
48
+ sessionsTable string
49
+
50
+ sqlUpdateSeqNums string
51
+ sqlInsertSession string
52
+ sqlGetSeqNums string
53
+ sqlUpdateMessage string
54
+ sqlInsertMessage string
55
+ sqlGetMessages string
56
+ sqlUpdateSession string
57
+ sqlUpdateSenderSeqNum string
58
+ sqlUpdateTargetSeqNum string
59
+ sqlDeleteMessages string
42
60
}
43
61
44
62
type placeholderFunc func (int ) string
@@ -88,17 +106,29 @@ func (f sqlStoreFactory) Create(sessionID quickfix.SessionID) (msgStore quickfix
88
106
if err != nil {
89
107
return nil , err
90
108
}
109
+
110
+ messagesTableName := defaultMessagesTable
111
+ if name , err := sessionSettings .Setting (config .SQLStoreMessagesTableName ); err == nil {
112
+ messagesTableName = name
113
+ }
114
+
115
+ sessionsTableName := defaultSessionsTable
116
+ if name , err := sessionSettings .Setting (config .SQLStoreSessionsTableName ); err == nil {
117
+ sessionsTableName = name
118
+ }
119
+
91
120
sqlConnMaxLifetime := 0 * time .Second
92
121
if sessionSettings .HasSetting (config .SQLStoreConnMaxLifetime ) {
93
122
sqlConnMaxLifetime , err = sessionSettings .DurationSetting (config .SQLStoreConnMaxLifetime )
94
123
if err != nil {
95
124
return nil , err
96
125
}
97
126
}
98
- return newSQLStore (sessionID , sqlDriver , sqlDataSourceName , sqlConnMaxLifetime )
127
+
128
+ return newSQLStore (sessionID , sqlDriver , sqlDataSourceName , messagesTableName , sessionsTableName , sqlConnMaxLifetime )
99
129
}
100
130
101
- func newSQLStore (sessionID quickfix.SessionID , driver string , dataSourceName string , connMaxLifetime time.Duration ) (store * sqlStore , err error ) {
131
+ func newSQLStore (sessionID quickfix.SessionID , driver , dataSourceName , messagesTableName , sessionsTableName string , connMaxLifetime time.Duration ) (store * sqlStore , err error ) {
102
132
103
133
memStore , memErr := quickfix .NewMemoryStoreFactory ().Create (sessionID )
104
134
if memErr != nil {
@@ -112,6 +142,8 @@ func newSQLStore(sessionID quickfix.SessionID, driver string, dataSourceName str
112
142
sqlDriver : driver ,
113
143
sqlDataSourceName : dataSourceName ,
114
144
sqlConnMaxLifetime : connMaxLifetime ,
145
+ messagesTable : messagesTableName ,
146
+ sessionsTable : sessionsTableName ,
115
147
}
116
148
if err = store .cache .Reset (); err != nil {
117
149
err = errors .Wrap (err , "cache reset" )
@@ -130,20 +162,58 @@ func newSQLStore(sessionID quickfix.SessionID, driver string, dataSourceName str
130
162
if err = store .db .Ping (); err != nil { // ensure immediate connection
131
163
return nil , err
132
164
}
165
+
166
+ store .setSQLStatements ()
167
+
133
168
if err = store .populateCache (); err != nil {
134
169
return nil , err
135
170
}
136
171
137
172
return store , nil
138
173
}
139
174
175
+ func (store * sqlStore ) setSQLStatements () {
176
+ idColumns := `beginstring, session_qualifier, sendercompid, sendersubid, senderlocid, targetcompid, targetsubid, targetlocid`
177
+ idPlaceholders := `?,?,?,?,?,?,?,?`
178
+ idWhereClause := `beginstring=? AND session_qualifier=? AND sendercompid=? AND sendersubid=? AND senderlocid=? AND targetcompid=? AND targetsubid=? AND targetlocid=?`
179
+
180
+ store .sqlInsertMessage = fmt .Sprintf (`INSERT INTO %s (
181
+ msgseqnum, message, %s) VALUES (?, ?, %s)` ,
182
+ store .messagesTable , idColumns , idPlaceholders )
183
+
184
+ store .sqlUpdateMessage = fmt .Sprintf (`UPDATE %s SET message=? WHERE %s AND msgseqnum=?` ,
185
+ store .messagesTable , idWhereClause )
186
+
187
+ store .sqlGetMessages = fmt .Sprintf (`SELECT message FROM %s WHERE %s AND msgseqnum>=? AND msgseqnum<=? ORDER BY msgseqnum` ,
188
+ store .messagesTable , idWhereClause )
189
+
190
+ store .sqlDeleteMessages = fmt .Sprintf (`DELETE FROM %s WHERE %s` ,
191
+ store .messagesTable , idWhereClause )
192
+
193
+ store .sqlInsertSession = fmt .Sprintf (`INSERT INTO %s (
194
+ creation_time, incoming_seqnum, outgoing_seqnum, %s) VALUES (?, ?, ?, %s)` ,
195
+ store .sessionsTable , idColumns , idPlaceholders )
196
+
197
+ store .sqlGetSeqNums = fmt .Sprintf (`SELECT creation_time, incoming_seqnum, outgoing_seqnum FROM %s WHERE %s` ,
198
+ store .sessionsTable , idWhereClause )
199
+
200
+ store .sqlUpdateSession = fmt .Sprintf (`UPDATE %s SET creation_time=?, incoming_seqnum=?, outgoing_seqnum=? WHERE %s` ,
201
+ store .sessionsTable , idWhereClause )
202
+
203
+ store .sqlUpdateSenderSeqNum = fmt .Sprintf (`UPDATE %s SET outgoing_seqnum=? WHERE %s` ,
204
+ store .sessionsTable , idWhereClause )
205
+
206
+ store .sqlUpdateTargetSeqNum = fmt .Sprintf (`UPDATE %s SET incoming_seqnum=? WHERE %s` ,
207
+ store .sessionsTable , idWhereClause )
208
+
209
+ store .sqlUpdateSeqNums = fmt .Sprintf (`UPDATE %s SET incoming_seqnum=?, outgoing_seqnum=? WHERE %s` ,
210
+ store .sessionsTable , idWhereClause )
211
+ }
212
+
140
213
// Reset deletes the store records and sets the seqnums back to 1.
141
214
func (store * sqlStore ) Reset () error {
142
215
s := store .sessionID
143
- _ , err := store .db .Exec (sqlString (`DELETE FROM messages
144
- WHERE beginstring=? AND session_qualifier=?
145
- AND sendercompid=? AND sendersubid=? AND senderlocid=?
146
- AND targetcompid=? AND targetsubid=? AND targetlocid=?` , store .placeholder ),
216
+ _ , err := store .db .Exec (sqlString (store .sqlDeleteMessages , store .placeholder ),
147
217
s .BeginString , s .Qualifier ,
148
218
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
149
219
s .TargetCompID , s .TargetSubID , s .TargetLocationID )
@@ -155,11 +225,7 @@ func (store *sqlStore) Reset() error {
155
225
return err
156
226
}
157
227
158
- _ , err = store .db .Exec (sqlString (`UPDATE sessions
159
- SET creation_time=?, incoming_seqnum=?, outgoing_seqnum=?
160
- WHERE beginstring=? AND session_qualifier=?
161
- AND sendercompid=? AND sendersubid=? AND senderlocid=?
162
- AND targetcompid=? AND targetsubid=? AND targetlocid=?` , store .placeholder ),
228
+ _ , err = store .db .Exec (sqlString (store .sqlUpdateSession , store .placeholder ),
163
229
store .cache .CreationTime (), store .cache .NextTargetMsgSeqNum (), store .cache .NextSenderMsgSeqNum (),
164
230
s .BeginString , s .Qualifier ,
165
231
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
@@ -180,11 +246,7 @@ func (store *sqlStore) populateCache() error {
180
246
s := store .sessionID
181
247
var creationTime time.Time
182
248
var incomingSeqNum , outgoingSeqNum int
183
- row := store .db .QueryRow (sqlString (`SELECT creation_time, incoming_seqnum, outgoing_seqnum
184
- FROM sessions
185
- WHERE beginstring=? AND session_qualifier=?
186
- AND sendercompid=? AND sendersubid=? AND senderlocid=?
187
- AND targetcompid=? AND targetsubid=? AND targetlocid=?` , store .placeholder ),
249
+ row := store .db .QueryRow (sqlString (store .sqlGetSeqNums , store .placeholder ),
188
250
s .BeginString , s .Qualifier ,
189
251
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
190
252
s .TargetCompID , s .TargetSubID , s .TargetLocationID )
@@ -209,12 +271,7 @@ func (store *sqlStore) populateCache() error {
209
271
}
210
272
211
273
// session record not found, create it
212
- _ , err = store .db .Exec (sqlString (`INSERT INTO sessions (
213
- creation_time, incoming_seqnum, outgoing_seqnum,
214
- beginstring, session_qualifier,
215
- sendercompid, sendersubid, senderlocid,
216
- targetcompid, targetsubid, targetlocid)
217
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` , store .placeholder ),
274
+ _ , err = store .db .Exec (sqlString (store .sqlInsertSession , store .placeholder ),
218
275
store .cache .CreationTime (),
219
276
store .cache .NextTargetMsgSeqNum (),
220
277
store .cache .NextSenderMsgSeqNum (),
@@ -238,10 +295,7 @@ func (store *sqlStore) NextTargetMsgSeqNum() int {
238
295
// SetNextSenderMsgSeqNum sets the next MsgSeqNum that will be sent.
239
296
func (store * sqlStore ) SetNextSenderMsgSeqNum (next int ) error {
240
297
s := store .sessionID
241
- _ , err := store .db .Exec (sqlString (`UPDATE sessions SET outgoing_seqnum = ?
242
- WHERE beginstring=? AND session_qualifier=?
243
- AND sendercompid=? AND sendersubid=? AND senderlocid=?
244
- AND targetcompid=? AND targetsubid=? AND targetlocid=?` , store .placeholder ),
298
+ _ , err := store .db .Exec (sqlString (store .sqlUpdateSenderSeqNum , store .placeholder ),
245
299
next , s .BeginString , s .Qualifier ,
246
300
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
247
301
s .TargetCompID , s .TargetSubID , s .TargetLocationID )
@@ -254,10 +308,7 @@ func (store *sqlStore) SetNextSenderMsgSeqNum(next int) error {
254
308
// SetNextTargetMsgSeqNum sets the next MsgSeqNum that should be received.
255
309
func (store * sqlStore ) SetNextTargetMsgSeqNum (next int ) error {
256
310
s := store .sessionID
257
- _ , err := store .db .Exec (sqlString (`UPDATE sessions SET incoming_seqnum = ?
258
- WHERE beginstring=? AND session_qualifier=?
259
- AND sendercompid=? AND sendersubid=? AND senderlocid=?
260
- AND targetcompid=? AND targetsubid=? AND targetlocid=?` , store .placeholder ),
311
+ _ , err := store .db .Exec (sqlString (store .sqlUpdateTargetSeqNum , store .placeholder ),
261
312
next , s .BeginString , s .Qualifier ,
262
313
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
263
314
s .TargetCompID , s .TargetSubID , s .TargetLocationID )
@@ -295,12 +346,7 @@ func (store *sqlStore) SetCreationTime(_ time.Time) {
295
346
func (store * sqlStore ) SaveMessage (seqNum int , msg []byte ) error {
296
347
s := store .sessionID
297
348
298
- _ , err := store .db .Exec (sqlString (`INSERT INTO messages (
299
- msgseqnum, message,
300
- beginstring, session_qualifier,
301
- sendercompid, sendersubid, senderlocid,
302
- targetcompid, targetsubid, targetlocid)
303
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` , store .placeholder ),
349
+ _ , err := store .db .Exec (sqlString (store .sqlInsertMessage , store .placeholder ),
304
350
seqNum , string (msg ),
305
351
s .BeginString , s .Qualifier ,
306
352
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
@@ -318,12 +364,7 @@ func (store *sqlStore) SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg []b
318
364
}
319
365
defer tx .Rollback ()
320
366
321
- _ , err = tx .Exec (sqlString (`INSERT INTO messages (
322
- msgseqnum, message,
323
- beginstring, session_qualifier,
324
- sendercompid, sendersubid, senderlocid,
325
- targetcompid, targetsubid, targetlocid)
326
- VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)` , store .placeholder ),
367
+ _ , err = tx .Exec (sqlString (store .sqlInsertMessage , store .placeholder ),
327
368
seqNum , string (msg ),
328
369
s .BeginString , s .Qualifier ,
329
370
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
@@ -333,10 +374,7 @@ func (store *sqlStore) SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg []b
333
374
}
334
375
335
376
next := store .cache .NextSenderMsgSeqNum () + 1
336
- _ , err = tx .Exec (sqlString (`UPDATE sessions SET outgoing_seqnum = ?
337
- WHERE beginstring=? AND session_qualifier=?
338
- AND sendercompid=? AND sendersubid=? AND senderlocid=?
339
- AND targetcompid=? AND targetsubid=? AND targetlocid=?` , store .placeholder ),
377
+ _ , err = tx .Exec (sqlString (store .sqlUpdateSenderSeqNum , store .placeholder ),
340
378
next , s .BeginString , s .Qualifier ,
341
379
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
342
380
s .TargetCompID , s .TargetSubID , s .TargetLocationID )
@@ -354,12 +392,7 @@ func (store *sqlStore) SaveMessageAndIncrNextSenderMsgSeqNum(seqNum int, msg []b
354
392
355
393
func (store * sqlStore ) IterateMessages (beginSeqNum , endSeqNum int , cb func ([]byte ) error ) error {
356
394
s := store .sessionID
357
- rows , err := store .db .Query (sqlString (`SELECT message FROM messages
358
- WHERE beginstring=? AND session_qualifier=?
359
- AND sendercompid=? AND sendersubid=? AND senderlocid=?
360
- AND targetcompid=? AND targetsubid=? AND targetlocid=?
361
- AND msgseqnum>=? AND msgseqnum<=?
362
- ORDER BY msgseqnum` , store .placeholder ),
395
+ rows , err := store .db .Query (sqlString (store .sqlGetMessages , store .placeholder ),
363
396
s .BeginString , s .Qualifier ,
364
397
s .SenderCompID , s .SenderSubID , s .SenderLocationID ,
365
398
s .TargetCompID , s .TargetSubID , s .TargetLocationID ,
0 commit comments