Skip to content

Commit 08bf2e8

Browse files
authored
Merge pull request #265 from cbusbey/reduced_allocs3
reduces allocs more
2 parents 73e00a3 + 1d9f654 commit 08bf2e8

File tree

4 files changed

+54
-22
lines changed

4 files changed

+54
-22
lines changed

field_map.go

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package quickfix
33
import (
44
"bytes"
55
"sort"
6+
"time"
67
)
78

89
//FieldMap is a collection of fix fields that make up a fix message.
@@ -91,11 +92,32 @@ func (m FieldMap) GetBool(tag Tag) (bool, MessageRejectError) {
9192

9293
//GetInt is a GetField wrapper for int fields
9394
func (m FieldMap) GetInt(tag Tag) (int, MessageRejectError) {
94-
var val FIXInt
95-
if err := m.GetField(tag, &val); err != nil {
95+
bytes, err := m.GetBytes(tag)
96+
if err != nil {
9697
return 0, err
9798
}
98-
return int(val), nil
99+
100+
var val FIXInt
101+
if val.Read(bytes) != nil {
102+
err = IncorrectDataFormatForValue(tag)
103+
}
104+
105+
return int(val), err
106+
}
107+
108+
//GetTime is a GetField wrapper for utc timestamp fields
109+
func (m FieldMap) GetTime(tag Tag) (t time.Time, err MessageRejectError) {
110+
bytes, err := m.GetBytes(tag)
111+
if err != nil {
112+
return
113+
}
114+
115+
var val FIXUTCTimestamp
116+
if val.Read(bytes) != nil {
117+
err = IncorrectDataFormatForValue(tag)
118+
}
119+
120+
return val.Time, err
99121
}
100122

101123
//GetString is a GetField wrapper for string fields

message.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -195,12 +195,12 @@ func ParseMessage(rawMessage []byte) (Message, error) {
195195
}
196196
}
197197

198-
var bodyLength FIXInt
199-
if err := msg.Header.GetField(tagBodyLength, &bodyLength); err != nil {
198+
bodyLength, err := msg.Header.GetInt(tagBodyLength)
199+
if err != nil {
200200
return msg, parseError{OrigError: err.Error()}
201201
}
202202

203-
if length != int(bodyLength) {
203+
if length != bodyLength {
204204
return msg, parseError{OrigError: fmt.Sprintf("Incorrect Message Length, expected %d, got %d", bodyLength, length)}
205205
}
206206

message_router.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@ func (c MessageRouter) AddRoute(beginString string, msgType string, router Messa
2929

3030
//Route may be called from the fromApp/fromAdmin callbacks. Messages that cannot be routed will be rejected with UnsupportedMessageType.
3131
func (c MessageRouter) Route(msg Message, sessionID SessionID) MessageRejectError {
32-
var beginString FIXString
33-
if err := msg.Header.GetField(tagBeginString, &beginString); err != nil {
32+
beginString, err := msg.Header.GetBytes(tagBeginString)
33+
if err != nil {
3434
return nil
3535
}
3636

37-
msgType, err := msg.MsgType()
37+
msgType, err := msg.Header.GetBytes(tagMsgType)
3838
if err != nil {
3939
return err
4040
}

session.go

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -522,24 +522,34 @@ func (s *session) fromCallback(msg Message) MessageRejectError {
522522
}
523523

524524
func (s *session) checkTargetTooLow(msg Message) MessageRejectError {
525-
var seqNum FIXInt
526-
switch err := msg.Header.GetField(tagMsgSeqNum, &seqNum); {
527-
case err != nil:
525+
if !msg.Header.Has(tagMsgSeqNum) {
528526
return RequiredTagMissing(tagMsgSeqNum)
529-
case int(seqNum) < s.store.NextTargetMsgSeqNum():
530-
return targetTooLow{ReceivedTarget: int(seqNum), ExpectedTarget: s.store.NextTargetMsgSeqNum()}
527+
}
528+
529+
seqNum, err := msg.Header.GetInt(tagMsgSeqNum)
530+
if err != nil {
531+
return err
532+
}
533+
534+
if seqNum < s.store.NextTargetMsgSeqNum() {
535+
return targetTooLow{ReceivedTarget: seqNum, ExpectedTarget: s.store.NextTargetMsgSeqNum()}
531536
}
532537

533538
return nil
534539
}
535540

536541
func (s *session) checkTargetTooHigh(msg Message) MessageRejectError {
537-
var seqNum FIXInt
538-
switch err := msg.Header.GetField(tagMsgSeqNum, &seqNum); {
539-
case err != nil:
542+
if !msg.Header.Has(tagMsgSeqNum) {
540543
return RequiredTagMissing(tagMsgSeqNum)
541-
case int(seqNum) > s.store.NextTargetMsgSeqNum():
542-
return targetTooHigh{ReceivedTarget: int(seqNum), ExpectedTarget: s.store.NextTargetMsgSeqNum()}
544+
}
545+
546+
seqNum, err := msg.Header.GetInt(tagMsgSeqNum)
547+
if err != nil {
548+
return err
549+
}
550+
551+
if seqNum > s.store.NextTargetMsgSeqNum() {
552+
return targetTooHigh{ReceivedTarget: seqNum, ExpectedTarget: s.store.NextTargetMsgSeqNum()}
543553
}
544554

545555
return nil
@@ -570,12 +580,12 @@ func (s *session) checkSendingTime(msg Message) MessageRejectError {
570580
return RequiredTagMissing(tagSendingTime)
571581
}
572582

573-
sendingTime := new(FIXUTCTimestamp)
574-
if err := msg.Header.GetField(tagSendingTime, sendingTime); err != nil {
583+
sendingTime, err := msg.Header.GetTime(tagSendingTime)
584+
if err != nil {
575585
return err
576586
}
577587

578-
if delta := time.Since(sendingTime.Time); delta <= -1*time.Duration(120)*time.Second || delta >= time.Duration(120)*time.Second {
588+
if delta := time.Since(sendingTime); delta <= -1*time.Duration(120)*time.Second || delta >= time.Duration(120)*time.Second {
579589
return sendingTimeAccuracyProblem()
580590
}
581591

0 commit comments

Comments
 (0)