├── .devcontainer ├── Dockerfile.dev ├── devcontainer.json └── docker-compose.yml ├── .github ├── dependabot.yml └── workflows │ ├── ci.yaml │ └── codeql-analysis.yml ├── .gitignore ├── .golangci.yml ├── CHANGELOG.md ├── CONTRIBUTING.md ├── LICENSE ├── Makefile ├── README.md ├── _sql ├── embed.go ├── mssql │ ├── create.bat │ └── quickfix_database.sql ├── mysql │ ├── create.bat │ ├── create.sh │ ├── event_log_table.sql │ ├── messages_log_table.sql │ ├── messages_table.sql │ ├── mysql.sql │ ├── quickfix_database.sql │ └── sessions_table.sql ├── oracle │ ├── messages_table.sql │ └── sessions_table.sql ├── postgresql │ ├── create.bat │ ├── create.sh │ ├── event_log_table.sql │ ├── messages_log_table.sql │ ├── messages_table.sql │ ├── postgresql.sql │ └── sessions_table.sql └── sqlite3 │ ├── event_log_table.sql │ ├── messages_log_table.sql │ ├── messages_table.sql │ └── sessions_table.sql ├── _test ├── Comparator.rb ├── ComparatorTestCase.rb ├── FixParser.rb ├── FixParserTestCase.rb ├── Reflector.rb ├── ReflectorClient.rb ├── ReflectorClientTestCase.rb ├── ReflectorServer.rb ├── ReflectorServerTestCase.rb ├── ReflectorTestCase.rb ├── Runner.rb ├── RunnerTestCase.rb ├── SocketServer.rb ├── SocketServerTestCase.rb ├── atfixturerun.rb ├── cfg │ ├── lastseqnumprocessed │ │ ├── fix42.cfg │ │ ├── fix43.cfg │ │ ├── fix44.cfg │ │ ├── fix50.cfg │ │ ├── fix50sp1.cfg │ │ └── fix50sp2.cfg │ ├── nextexpectedseqnum │ │ ├── fix44.cfg │ │ ├── fix50.cfg │ │ ├── fix50sp1.cfg │ │ └── fix50sp2.cfg │ ├── resendreqchunksize │ │ ├── fix40.cfg │ │ ├── fix41.cfg │ │ ├── fix42.cfg │ │ ├── fix43.cfg │ │ ├── fix44.cfg │ │ ├── fix50.cfg │ │ ├── fix50sp1.cfg │ │ └── fix50sp2.cfg │ └── server │ │ ├── fix40.cfg │ │ ├── fix41.cfg │ │ ├── fix42.cfg │ │ ├── fix43.cfg │ │ ├── fix44.cfg │ │ ├── fix50.cfg │ │ ├── fix50sp1.cfg │ │ └── fix50sp2.cfg ├── definitions │ ├── fields.fmt │ ├── lastseqnumprocessed │ │ ├── fix42 │ │ │ └── LastProcessedMsgSeqNum.def │ │ ├── fix43 │ │ │ └── LastProcessedMsgSeqNum.def │ │ ├── fix44 │ │ │ └── LastProcessedMsgSeqNum.def │ │ ├── fix50 │ │ │ └── LastProcessedMsgSeqNum.def │ │ ├── fix50sp1 │ │ │ └── LastProcessedMsgSeqNum.def │ │ └── fix50sp2 │ │ │ └── LastProcessedMsgSeqNum.def │ ├── nextexpectedseqnum │ │ ├── fix44 │ │ │ ├── 2a_NextExpectedMsgSeqNumCorrect.def │ │ │ ├── 2b_NextExpectedMsgSeqNumTooHigh.def │ │ │ ├── 2c_NextExpectedMsgSeqNumTooLow.def │ │ │ └── ResetSeqNumFlagAndNextExpectedMsgSeqNum.def │ │ ├── fix50 │ │ │ ├── 2a_NextExpectedMsgSeqNumCorrect.def │ │ │ ├── 2b_NextExpectedMsgSeqNumTooHigh.def │ │ │ ├── 2c_NextExpectedMsgSeqNumTooLow.def │ │ │ └── ResetSeqNumFlagAndNextExpectedMsgSeqNum.def │ │ ├── fix50sp1 │ │ │ ├── 2a_NextExpectedMsgSeqNumCorrect.def │ │ │ ├── 2b_NextExpectedMsgSeqNumTooHigh.def │ │ │ ├── 2c_NextExpectedMsgSeqNumTooLow.def │ │ │ └── ResetSeqNumFlagAndNextExpectedMsgSeqNum.def │ │ └── fix50sp2 │ │ │ ├── 2a_NextExpectedMsgSeqNumCorrect.def │ │ │ ├── 2b_NextExpectedMsgSeqNumTooHigh.def │ │ │ ├── 2c_NextExpectedMsgSeqNumTooLow.def │ │ │ └── ResetSeqNumFlagAndNextExpectedMsgSeqNum.def │ ├── resendreqchunksize │ │ ├── fix40 │ │ │ ├── SequenceGapFollowedByMessageResent.def │ │ │ └── SequenceGapFollowedBySequenceResetWithGapFill.def │ │ ├── fix41 │ │ │ ├── SequenceGapFollowedByMessageResent.def │ │ │ └── SequenceGapFollowedBySequenceResetWithGapFill.def │ │ ├── fix42 │ │ │ ├── SequenceGapFollowedByMessageResent.def │ │ │ └── SequenceGapFollowedBySequenceResetWithGapFill.def │ │ ├── fix43 │ │ │ ├── SequenceGapFollowedByMessageResent.def │ │ │ └── SequenceGapFollowedBySequenceResetWithGapFill.def │ │ ├── fix44 │ │ │ ├── SequenceGapFollowedByMessageResent.def │ │ │ └── SequenceGapFollowedBySequenceResetWithGapFill.def │ │ ├── fix50 │ │ │ ├── SequenceGapFollowedByMessageResent.def │ │ │ └── SequenceGapFollowedBySequenceResetWithGapFill.def │ │ ├── fix50sp1 │ │ │ ├── SequenceGapFollowedByMessageResent.def │ │ │ └── SequenceGapFollowedBySequenceResetWithGapFill.def │ │ └── fix50sp2 │ │ │ ├── SequenceGapFollowedByMessageResent.def │ │ │ └── SequenceGapFollowedBySequenceResetWithGapFill.def │ └── server │ │ ├── fix40 │ │ ├── 10_MsgSeqNumEqual.def │ │ ├── 10_MsgSeqNumGreater.def │ │ ├── 10_MsgSeqNumLess.def │ │ ├── 11a_NewSeqNoGreater.def │ │ ├── 11b_NewSeqNoEqual.def │ │ ├── 11c_NewSeqNoLess.def │ │ ├── 13b_UnsolicitedLogoutMessage.def │ │ ├── 14a_BadField.def │ │ ├── 14b_RequiredFieldMissing.def │ │ ├── 14c_TagNotDefinedForMsgType.def │ │ ├── 14d_TagSpecifiedWithoutValue.def │ │ ├── 14e_IncorrectEnumValue.def │ │ ├── 14f_IncorrectDataFormat.def │ │ ├── 14g_HeaderBodyTrailerFieldsOutOfOrder.def │ │ ├── 14h_RepeatedTag.def │ │ ├── 15_HeaderAndBodyFieldsOrderedDifferently.def │ │ ├── 19a_PossResendMessageThatHAsAlreadyBeenSent.def │ │ ├── 19b_PossResendMessageThatHasNotBeenSent.def │ │ ├── 1a_ValidLogonMsgSeqNumTooHigh.def │ │ ├── 1a_ValidLogonWithCorrectMsgSeqNum.def │ │ ├── 1b_DuplicateIdentity.def │ │ ├── 1c_InvalidSenderCompID.def │ │ ├── 1c_InvalidTargetCompID.def │ │ ├── 1d_InvalidLogonBadSendingTime.def │ │ ├── 1d_InvalidLogonLengthInvalid.def │ │ ├── 1d_InvalidLogonWrongBeginString.def │ │ ├── 1e_NotLogonMessage.def │ │ ├── 20_SimultaneousResendRequest.def │ │ ├── 2a_MsgSeqNumCorrect.def │ │ ├── 2b_MsgSeqNumTooHigh.def │ │ ├── 2c_MsgSeqNumTooLow.def │ │ ├── 2d_GarbledMessage.def │ │ ├── 2e_PossDupAlreadyReceived.def │ │ ├── 2e_PossDupNotReceived.def │ │ ├── 2f_PossDupOrigSendingTimeTooHigh.def │ │ ├── 2g_PossDupNoOrigSendingTime.def │ │ ├── 2i_BeginStringValueUnexpected.def │ │ ├── 2k_CompIDDoesNotMatchProfile.def │ │ ├── 2m_BodyLengthValueNotCorrect.def │ │ ├── 2o_SendingTimeValueOutOfRange.def │ │ ├── 2q_MsgTypeNotValid.def │ │ ├── 2r_UnregisteredMsgType.def │ │ ├── 2t_FirstThreeFieldsOutOfOrder.def │ │ ├── 3b_InvalidChecksum.def │ │ ├── 3c_GarbledMessage.def │ │ ├── 4a_NoDataSentDuringHeartBtInt.def │ │ ├── 4b_ReceivedTestRequest.def │ │ ├── 6_SendTestRequest.def │ │ ├── 7_ReceiveRejectMessage.def │ │ ├── 8_AdminAndApplicationMessages.def │ │ ├── 8_OnlyAdminMessages.def │ │ ├── 8_OnlyApplicationMessages.def │ │ ├── AlreadyLoggedOn.def │ │ ├── RejectResentMessage.def │ │ ├── ReverseRoute.def │ │ └── ReverseRouteWithEmptyRoutingTags.def │ │ ├── fix41 │ │ ├── 10_MsgSeqNumEqual.def │ │ ├── 10_MsgSeqNumGreater.def │ │ ├── 10_MsgSeqNumLess.def │ │ ├── 11a_NewSeqNoGreater.def │ │ ├── 11b_NewSeqNoEqual.def │ │ ├── 11c_NewSeqNoLess.def │ │ ├── 13b_UnsolicitedLogoutMessage.def │ │ ├── 14a_BadField.def │ │ ├── 14b_RequiredFieldMissing.def │ │ ├── 14c_TagNotDefinedForMsgType.def │ │ ├── 14d_TagSpecifiedWithoutValue.def │ │ ├── 14e_IncorrectEnumValue.def │ │ ├── 14f_IncorrectDataFormat.def │ │ ├── 14g_HeaderBodyTrailerFieldsOutOfOrder.def │ │ ├── 14h_RepeatedTag.def │ │ ├── 15_HeaderAndBodyFieldsOrderedDifferently.def │ │ ├── 19a_PossResendMessageThatHAsAlreadyBeenSent.def │ │ ├── 19b_PossResendMessageThatHasNotBeenSent.def │ │ ├── 1a_ValidLogonMsgSeqNumTooHigh.def │ │ ├── 1a_ValidLogonWithCorrectMsgSeqNum.def │ │ ├── 1b_DuplicateIdentity.def │ │ ├── 1c_InvalidSenderCompID.def │ │ ├── 1c_InvalidTargetCompID.def │ │ ├── 1d_InvalidLogonBadSendingTime.def │ │ ├── 1d_InvalidLogonLengthInvalid.def │ │ ├── 1d_InvalidLogonWrongBeginString.def │ │ ├── 1e_NotLogonMessage.def │ │ ├── 20_SimultaneousResendRequest.def │ │ ├── 2a_MsgSeqNumCorrect.def │ │ ├── 2b_MsgSeqNumTooHigh.def │ │ ├── 2c_MsgSeqNumTooLow.def │ │ ├── 2d_GarbledMessage.def │ │ ├── 2e_PossDupAlreadyReceived.def │ │ ├── 2e_PossDupNotReceived.def │ │ ├── 2f_PossDupOrigSendingTimeTooHigh.def │ │ ├── 2g_PossDupNoOrigSendingTime.def │ │ ├── 2i_BeginStringValueUnexpected.def │ │ ├── 2k_CompIDDoesNotMatchProfile.def │ │ ├── 2m_BodyLengthValueNotCorrect.def │ │ ├── 2o_SendingTimeValueOutOfRange.def │ │ ├── 2q_MsgTypeNotValid.def │ │ ├── 2r_UnregisteredMsgType.def │ │ ├── 2t_FirstThreeFieldsOutOfOrder.def │ │ ├── 3b_InvalidChecksum.def │ │ ├── 3c_GarbledMessage.def │ │ ├── 4a_NoDataSentDuringHeartBtInt.def │ │ ├── 4b_ReceivedTestRequest.def │ │ ├── 6_SendTestRequest.def │ │ ├── 7_ReceiveRejectMessage.def │ │ ├── 8_AdminAndApplicationMessages.def │ │ ├── 8_OnlyAdminMessages.def │ │ ├── 8_OnlyApplicationMessages.def │ │ ├── AlreadyLoggedOn.def │ │ ├── RejectResentMessage.def │ │ ├── ReverseRoute.def │ │ └── ReverseRouteWithEmptyRoutingTags.def │ │ ├── fix42 │ │ ├── 10_MsgSeqNumEqual.def │ │ ├── 10_MsgSeqNumGreater.def │ │ ├── 10_MsgSeqNumLess.def │ │ ├── 11a_NewSeqNoGreater.def │ │ ├── 11b_NewSeqNoEqual.def │ │ ├── 11c_NewSeqNoLess.def │ │ ├── 13b_UnsolicitedLogoutMessage.def │ │ ├── 14a_BadField.def │ │ ├── 14b_RequiredFieldMissing.def │ │ ├── 14c_TagNotDefinedForMsgType.def │ │ ├── 14d_TagSpecifiedWithoutValue.def │ │ ├── 14e_IncorrectEnumValue.def │ │ ├── 14f_IncorrectDataFormat.def │ │ ├── 14g_HeaderBodyTrailerFieldsOutOfOrder.def │ │ ├── 14h_RepeatedTag.def │ │ ├── 14i_RepeatingGroupCountNotEqual.def │ │ ├── 15_HeaderAndBodyFieldsOrderedDifferently.def │ │ ├── 19a_PossResendMessageThatHAsAlreadyBeenSent.def │ │ ├── 19b_PossResendMessageThatHasNotBeenSent.def │ │ ├── 1a_ValidLogonMsgSeqNumTooHigh.def │ │ ├── 1a_ValidLogonWithCorrectMsgSeqNum.def │ │ ├── 1b_DuplicateIdentity.def │ │ ├── 1c_InvalidSenderCompID.def │ │ ├── 1c_InvalidTargetCompID.def │ │ ├── 1d_InvalidLogonBadSendingTime.def │ │ ├── 1d_InvalidLogonLengthInvalid.def │ │ ├── 1d_InvalidLogonWrongBeginString.def │ │ ├── 1e_NotLogonMessage.def │ │ ├── 20_SimultaneousResendRequest.def │ │ ├── 21_RepeatingGroupSpecifierWithValueOfZero.def │ │ ├── 2a_MsgSeqNumCorrect.def │ │ ├── 2b_MsgSeqNumTooHigh.def │ │ ├── 2c_MsgSeqNumTooLow.def │ │ ├── 2d_GarbledMessage.def │ │ ├── 2e_PossDupAlreadyReceived.def │ │ ├── 2e_PossDupNotReceived.def │ │ ├── 2f_PossDupOrigSendingTimeTooHigh.def │ │ ├── 2g_PossDupNoOrigSendingTime.def │ │ ├── 2i_BeginStringValueUnexpected.def │ │ ├── 2k_CompIDDoesNotMatchProfile.def │ │ ├── 2m_BodyLengthValueNotCorrect.def │ │ ├── 2o_SendingTimeValueOutOfRange.def │ │ ├── 2q_MsgTypeNotValid.def │ │ ├── 2r_UnregisteredMsgType.def │ │ ├── 2t_FirstThreeFieldsOutOfOrder.def │ │ ├── 3b_InvalidChecksum.def │ │ ├── 3c_GarbledMessage.def │ │ ├── 4a_NoDataSentDuringHeartBtInt.def │ │ ├── 4b_ReceivedTestRequest.def │ │ ├── 6_SendTestRequest.def │ │ ├── 7_ReceiveRejectMessage.def │ │ ├── 8_AdminAndApplicationMessages.def │ │ ├── 8_OnlyAdminMessages.def │ │ ├── 8_OnlyApplicationMessages.def │ │ ├── AlreadyLoggedOn.def │ │ ├── RejectResentMessage.def │ │ ├── ReverseRoute.def │ │ └── ReverseRouteWithEmptyRoutingTags.def │ │ ├── fix43 │ │ ├── 10_MsgSeqNumEqual.def │ │ ├── 10_MsgSeqNumGreater.def │ │ ├── 10_MsgSeqNumLess.def │ │ ├── 11a_NewSeqNoGreater.def │ │ ├── 11b_NewSeqNoEqual.def │ │ ├── 11c_NewSeqNoLess.def │ │ ├── 13b_UnsolicitedLogoutMessage.def │ │ ├── 14a_BadField.def │ │ ├── 14b_RequiredFieldMissing.def │ │ ├── 14c_TagNotDefinedForMsgType.def │ │ ├── 14d_TagSpecifiedWithoutValue.def │ │ ├── 14e_IncorrectEnumValue.def │ │ ├── 14f_IncorrectDataFormat.def │ │ ├── 14g_HeaderBodyTrailerFieldsOutOfOrder.def │ │ ├── 14h_RepeatedTag.def │ │ ├── 14i_RepeatingGroupCountNotEqual.def │ │ ├── 15_HeaderAndBodyFieldsOrderedDifferently.def │ │ ├── 19a_PossResendMessageThatHAsAlreadyBeenSent.def │ │ ├── 19b_PossResendMessageThatHasNotBeenSent.def │ │ ├── 1a_ValidLogonMsgSeqNumTooHigh.def │ │ ├── 1a_ValidLogonWithCorrectMsgSeqNum.def │ │ ├── 1b_DuplicateIdentity.def │ │ ├── 1c_InvalidSenderCompID.def │ │ ├── 1c_InvalidTargetCompID.def │ │ ├── 1d_InvalidLogonBadSendingTime.def │ │ ├── 1d_InvalidLogonLengthInvalid.def │ │ ├── 1d_InvalidLogonWrongBeginString.def │ │ ├── 1e_NotLogonMessage.def │ │ ├── 20_SimultaneousResendRequest.def │ │ ├── 21_RepeatingGroupSpecifierWithValueOfZero.def │ │ ├── 2a_MsgSeqNumCorrect.def │ │ ├── 2b_MsgSeqNumTooHigh.def │ │ ├── 2c_MsgSeqNumTooLow.def │ │ ├── 2d_GarbledMessage.def │ │ ├── 2e_PossDupAlreadyReceived.def │ │ ├── 2e_PossDupNotReceived.def │ │ ├── 2f_PossDupOrigSendingTimeTooHigh.def │ │ ├── 2g_PossDupNoOrigSendingTime.def │ │ ├── 2i_BeginStringValueUnexpected.def │ │ ├── 2k_CompIDDoesNotMatchProfile.def │ │ ├── 2m_BodyLengthValueNotCorrect.def │ │ ├── 2o_SendingTimeValueOutOfRange.def │ │ ├── 2q_MsgTypeNotValid.def │ │ ├── 2r_UnregisteredMsgType.def │ │ ├── 2t_FirstThreeFieldsOutOfOrder.def │ │ ├── 3b_InvalidChecksum.def │ │ ├── 3c_GarbledMessage.def │ │ ├── 4a_NoDataSentDuringHeartBtInt.def │ │ ├── 4b_ReceivedTestRequest.def │ │ ├── 6_SendTestRequest.def │ │ ├── 7_ReceiveRejectMessage.def │ │ ├── 8_AdminAndApplicationMessages.def │ │ ├── 8_OnlyAdminMessages.def │ │ ├── 8_OnlyApplicationMessages.def │ │ ├── AlreadyLoggedOn.def │ │ ├── RejectResentMessage.def │ │ ├── ReverseRoute.def │ │ └── ReverseRouteWithEmptyRoutingTags.def │ │ ├── fix44 │ │ ├── 10_MsgSeqNumEqual.def │ │ ├── 10_MsgSeqNumGreater.def │ │ ├── 10_MsgSeqNumLess.def │ │ ├── 11a_NewSeqNoGreater.def │ │ ├── 11b_NewSeqNoEqual.def │ │ ├── 11c_NewSeqNoLess.def │ │ ├── 13b_UnsolicitedLogoutMessage.def │ │ ├── 14a_BadField.def │ │ ├── 14b_RequiredFieldMissing.def │ │ ├── 14c_TagNotDefinedForMsgType.def │ │ ├── 14d_TagSpecifiedWithoutValue.def │ │ ├── 14e_IncorrectEnumValue.def │ │ ├── 14f_IncorrectDataFormat.def │ │ ├── 14g_HeaderBodyTrailerFieldsOutOfOrder.def │ │ ├── 14h_RepeatedTag.def │ │ ├── 14i_RepeatingGroupCountNotEqual.def │ │ ├── 15_HeaderAndBodyFieldsOrderedDifferently.def │ │ ├── 19a_PossResendMessageThatHAsAlreadyBeenSent.def │ │ ├── 19b_PossResendMessageThatHasNotBeenSent.def │ │ ├── 1a_ValidLogonMsgSeqNumTooHigh.def │ │ ├── 1a_ValidLogonWithCorrectMsgSeqNum.def │ │ ├── 1b_DuplicateIdentity.def │ │ ├── 1c_InvalidSenderCompID.def │ │ ├── 1c_InvalidTargetCompID.def │ │ ├── 1d_InvalidLogonBadSendingTime.def │ │ ├── 1d_InvalidLogonLengthInvalid.def │ │ ├── 1d_InvalidLogonWrongBeginString.def │ │ ├── 1e_NotLogonMessage.def │ │ ├── 20_SimultaneousResendRequest.def │ │ ├── 21_RepeatingGroupSpecifierWithValueOfZero.def │ │ ├── 2a_MsgSeqNumCorrect.def │ │ ├── 2b_MsgSeqNumTooHigh.def │ │ ├── 2c_MsgSeqNumTooLow.def │ │ ├── 2d_GarbledMessage.def │ │ ├── 2e_PossDupAlreadyReceived.def │ │ ├── 2e_PossDupNotReceived.def │ │ ├── 2f_PossDupOrigSendingTimeTooHigh.def │ │ ├── 2g_PossDupNoOrigSendingTime.def │ │ ├── 2i_BeginStringValueUnexpected.def │ │ ├── 2k_CompIDDoesNotMatchProfile.def │ │ ├── 2m_BodyLengthValueNotCorrect.def │ │ ├── 2o_SendingTimeValueOutOfRange.def │ │ ├── 2q_MsgTypeNotValid.def │ │ ├── 2r_UnregisteredMsgType.def │ │ ├── 2t_FirstThreeFieldsOutOfOrder.def │ │ ├── 3b_InvalidChecksum.def │ │ ├── 3c_GarbledMessage.def │ │ ├── 4a_NoDataSentDuringHeartBtInt.def │ │ ├── 4b_ReceivedTestRequest.def │ │ ├── 6_SendTestRequest.def │ │ ├── 7_ReceiveRejectMessage.def │ │ ├── 8_AdminAndApplicationMessages.def │ │ ├── 8_OnlyAdminMessages.def │ │ ├── 8_OnlyApplicationMessages.def │ │ ├── AlreadyLoggedOn.def │ │ ├── RejectResentMessage.def │ │ ├── ReverseRoute.def │ │ ├── ReverseRouteWithEmptyRoutingTags.def │ │ └── SessionReset.def │ │ ├── fix50 │ │ ├── 10_MsgSeqNumEqual.def │ │ ├── 10_MsgSeqNumGreater.def │ │ ├── 10_MsgSeqNumLess.def │ │ ├── 11a_NewSeqNoGreater.def │ │ ├── 11b_NewSeqNoEqual.def │ │ ├── 11c_NewSeqNoLess.def │ │ ├── 13b_UnsolicitedLogoutMessage.def │ │ ├── 14a_BadField.def │ │ ├── 14b_RequiredFieldMissing.def │ │ ├── 14c_TagNotDefinedForMsgType.def │ │ ├── 14d_TagSpecifiedWithoutValue.def │ │ ├── 14e_IncorrectEnumValue.def │ │ ├── 14f_IncorrectDataFormat.def │ │ ├── 14g_HeaderBodyTrailerFieldsOutOfOrder.def │ │ ├── 14h_RepeatedTag.def │ │ ├── 14i_RepeatingGroupCountNotEqual.def │ │ ├── 15_HeaderAndBodyFieldsOrderedDifferently.def │ │ ├── 19a_PossResendMessageThatHAsAlreadyBeenSent.def │ │ ├── 19b_PossResendMessageThatHasNotBeenSent.def │ │ ├── 1a_ValidLogonMsgSeqNumTooHigh.def │ │ ├── 1a_ValidLogonWithCorrectMsgSeqNum.def │ │ ├── 1b_DuplicateIdentity.def │ │ ├── 1c_InvalidSenderCompID.def │ │ ├── 1c_InvalidTargetCompID.def │ │ ├── 1d_InvalidLogonBadSendingTime.def │ │ ├── 1d_InvalidLogonLengthInvalid.def │ │ ├── 1d_InvalidLogonNoDefaultApplVerID.def │ │ ├── 1d_InvalidLogonWrongBeginString.def │ │ ├── 1e_NotLogonMessage.def │ │ ├── 20_SimultaneousResendRequest.def │ │ ├── 21_RepeatingGroupSpecifierWithValueOfZero.def │ │ ├── 2a_MsgSeqNumCorrect.def │ │ ├── 2b_MsgSeqNumTooHigh.def │ │ ├── 2c_MsgSeqNumTooLow.def │ │ ├── 2d_GarbledMessage.def │ │ ├── 2e_PossDupAlreadyReceived.def │ │ ├── 2e_PossDupNotReceived.def │ │ ├── 2f_PossDupOrigSendingTimeTooHigh.def │ │ ├── 2g_PossDupNoOrigSendingTime.def │ │ ├── 2i_BeginStringValueUnexpected.def │ │ ├── 2k_CompIDDoesNotMatchProfile.def │ │ ├── 2m_BodyLengthValueNotCorrect.def │ │ ├── 2o_SendingTimeValueOutOfRange.def │ │ ├── 2q_MsgTypeNotValid.def │ │ ├── 2r_UnregisteredMsgType.def │ │ ├── 2t_FirstThreeFieldsOutOfOrder.def │ │ ├── 3b_InvalidChecksum.def │ │ ├── 3c_GarbledMessage.def │ │ ├── 4a_NoDataSentDuringHeartBtInt.def │ │ ├── 4b_ReceivedTestRequest.def │ │ ├── 6_SendTestRequest.def │ │ ├── 7_ReceiveRejectMessage.def │ │ ├── 8_AdminAndApplicationMessages.def │ │ ├── 8_OnlyAdminMessages.def │ │ ├── 8_OnlyApplicationMessages.def │ │ ├── AlreadyLoggedOn.def │ │ ├── RejectResentMessage.def │ │ ├── ReverseRoute.def │ │ ├── ReverseRouteWithEmptyRoutingTags.def │ │ └── SessionReset.def │ │ ├── fix50sp1 │ │ ├── 10_MsgSeqNumEqual.def │ │ ├── 10_MsgSeqNumGreater.def │ │ ├── 10_MsgSeqNumLess.def │ │ ├── 11a_NewSeqNoGreater.def │ │ ├── 11b_NewSeqNoEqual.def │ │ ├── 11c_NewSeqNoLess.def │ │ ├── 13b_UnsolicitedLogoutMessage.def │ │ ├── 14a_BadField.def │ │ ├── 14b_RequiredFieldMissing.def │ │ ├── 14c_TagNotDefinedForMsgType.def │ │ ├── 14d_TagSpecifiedWithoutValue.def │ │ ├── 14e_IncorrectEnumValue.def │ │ ├── 14f_IncorrectDataFormat.def │ │ ├── 14g_HeaderBodyTrailerFieldsOutOfOrder.def │ │ ├── 14h_RepeatedTag.def │ │ ├── 14i_RepeatingGroupCountNotEqual.def │ │ ├── 15_HeaderAndBodyFieldsOrderedDifferently.def │ │ ├── 19a_PossResendMessageThatHAsAlreadyBeenSent.def │ │ ├── 19b_PossResendMessageThatHasNotBeenSent.def │ │ ├── 1a_ValidLogonMsgSeqNumTooHigh.def │ │ ├── 1a_ValidLogonWithCorrectMsgSeqNum.def │ │ ├── 1b_DuplicateIdentity.def │ │ ├── 1c_InvalidSenderCompID.def │ │ ├── 1c_InvalidTargetCompID.def │ │ ├── 1d_InvalidLogonBadSendingTime.def │ │ ├── 1d_InvalidLogonLengthInvalid.def │ │ ├── 1d_InvalidLogonNoDefaultApplVerID.def │ │ ├── 1d_InvalidLogonWrongBeginString.def │ │ ├── 1e_NotLogonMessage.def │ │ ├── 20_SimultaneousResendRequest.def │ │ ├── 21_RepeatingGroupSpecifierWithValueOfZero.def │ │ ├── 2a_MsgSeqNumCorrect.def │ │ ├── 2b_MsgSeqNumTooHigh.def │ │ ├── 2c_MsgSeqNumTooLow.def │ │ ├── 2d_GarbledMessage.def │ │ ├── 2e_PossDupAlreadyReceived.def │ │ ├── 2e_PossDupNotReceived.def │ │ ├── 2f_PossDupOrigSendingTimeTooHigh.def │ │ ├── 2g_PossDupNoOrigSendingTime.def │ │ ├── 2i_BeginStringValueUnexpected.def │ │ ├── 2k_CompIDDoesNotMatchProfile.def │ │ ├── 2m_BodyLengthValueNotCorrect.def │ │ ├── 2o_SendingTimeValueOutOfRange.def │ │ ├── 2q_MsgTypeNotValid.def │ │ ├── 2r_UnregisteredMsgType.def │ │ ├── 2t_FirstThreeFieldsOutOfOrder.def │ │ ├── 3b_InvalidChecksum.def │ │ ├── 3c_GarbledMessage.def │ │ ├── 4a_NoDataSentDuringHeartBtInt.def │ │ ├── 4b_ReceivedTestRequest.def │ │ ├── 6_SendTestRequest.def │ │ ├── 7_ReceiveRejectMessage.def │ │ ├── 8_AdminAndApplicationMessages.def │ │ ├── 8_OnlyAdminMessages.def │ │ ├── 8_OnlyApplicationMessages.def │ │ ├── AlreadyLoggedOn.def │ │ ├── RejectResentMessage.def │ │ ├── ReverseRoute.def │ │ ├── ReverseRouteWithEmptyRoutingTags.def │ │ └── SessionReset.def │ │ └── fix50sp2 │ │ ├── 10_MsgSeqNumEqual.def │ │ ├── 10_MsgSeqNumGreater.def │ │ ├── 10_MsgSeqNumLess.def │ │ ├── 11a_NewSeqNoGreater.def │ │ ├── 11b_NewSeqNoEqual.def │ │ ├── 11c_NewSeqNoLess.def │ │ ├── 13b_UnsolicitedLogoutMessage.def │ │ ├── 14a_BadField.def │ │ ├── 14b_RequiredFieldMissing.def │ │ ├── 14c_TagNotDefinedForMsgType.def │ │ ├── 14d_TagSpecifiedWithoutValue.def │ │ ├── 14e_IncorrectEnumValue.def │ │ ├── 14f_IncorrectDataFormat.def │ │ ├── 14g_HeaderBodyTrailerFieldsOutOfOrder.def │ │ ├── 14h_RepeatedTag.def │ │ ├── 14i_RepeatingGroupCountNotEqual.def │ │ ├── 15_HeaderAndBodyFieldsOrderedDifferently.def │ │ ├── 19a_PossResendMessageThatHAsAlreadyBeenSent.def │ │ ├── 19b_PossResendMessageThatHasNotBeenSent.def │ │ ├── 1a_ValidLogonMsgSeqNumTooHigh.def │ │ ├── 1a_ValidLogonWithCorrectMsgSeqNum.def │ │ ├── 1b_DuplicateIdentity.def │ │ ├── 1c_InvalidSenderCompID.def │ │ ├── 1c_InvalidTargetCompID.def │ │ ├── 1d_InvalidLogonBadSendingTime.def │ │ ├── 1d_InvalidLogonLengthInvalid.def │ │ ├── 1d_InvalidLogonNoDefaultApplVerID.def │ │ ├── 1d_InvalidLogonWrongBeginString.def │ │ ├── 1e_NotLogonMessage.def │ │ ├── 20_SimultaneousResendRequest.def │ │ ├── 21_RepeatingGroupSpecifierWithValueOfZero.def │ │ ├── 2a_MsgSeqNumCorrect.def │ │ ├── 2b_MsgSeqNumTooHigh.def │ │ ├── 2c_MsgSeqNumTooLow.def │ │ ├── 2d_GarbledMessage.def │ │ ├── 2e_PossDupAlreadyReceived.def │ │ ├── 2e_PossDupNotReceived.def │ │ ├── 2f_PossDupOrigSendingTimeTooHigh.def │ │ ├── 2g_PossDupNoOrigSendingTime.def │ │ ├── 2i_BeginStringValueUnexpected.def │ │ ├── 2k_CompIDDoesNotMatchProfile.def │ │ ├── 2m_BodyLengthValueNotCorrect.def │ │ ├── 2o_SendingTimeValueOutOfRange.def │ │ ├── 2q_MsgTypeNotValid.def │ │ ├── 2r_UnregisteredMsgType.def │ │ ├── 2t_FirstThreeFieldsOutOfOrder.def │ │ ├── 3b_InvalidChecksum.def │ │ ├── 3c_GarbledMessage.def │ │ ├── 4a_NoDataSentDuringHeartBtInt.def │ │ ├── 4b_ReceivedTestRequest.def │ │ ├── 6_SendTestRequest.def │ │ ├── 7_ReceiveRejectMessage.def │ │ ├── 8_AdminAndApplicationMessages.def │ │ ├── 8_OnlyAdminMessages.def │ │ ├── 8_OnlyApplicationMessages.def │ │ ├── AlreadyLoggedOn.def │ │ ├── RejectResentMessage.def │ │ ├── ReverseRoute.def │ │ ├── ReverseRouteWithEmptyRoutingTags.def │ │ └── SessionReset.def ├── fields.fmt ├── runat.sh ├── test-server │ └── main.go └── test.rb ├── _test_data ├── ca.crt ├── localhost.crt └── localhost.key ├── acceptor.go ├── acceptor_test.go ├── application.go ├── begin_string.go ├── cmd └── generate-fix │ ├── generate-fix.go │ └── internal │ ├── generate.go │ ├── globals.go │ ├── helpers.go │ ├── template_helpers.go │ └── templates.go ├── config └── configuration.go ├── connection.go ├── connection_internal_test.go ├── datadictionary ├── build.go ├── build_test.go ├── component_type_test.go ├── datadictionary.go ├── datadictionary_test.go ├── field_def_test.go ├── field_type_test.go ├── group_field_def_test.go ├── message_def_test.go ├── xml.go └── xml_test.go ├── dialer.go ├── dialer_test.go ├── doc.go ├── errors.go ├── errors_test.go ├── field.go ├── field_map.go ├── field_map_test.go ├── fix_boolean.go ├── fix_boolean_test.go ├── fix_bytes.go ├── fix_bytes_test.go ├── fix_decimal.go ├── fix_decimal_test.go ├── fix_float.go ├── fix_float_test.go ├── fix_int.go ├── fix_int_test.go ├── fix_string.go ├── fix_string_test.go ├── fix_udecimal.go ├── fix_udecimal_test.go ├── fix_utc_timestamp.go ├── fix_utc_timestamp_test.go ├── go.mod ├── go.sum ├── in_session.go ├── in_session_test.go ├── initiator.go ├── internal ├── event.go ├── event_timer.go ├── event_timer_test.go ├── session_settings.go ├── testsuite │ └── store_suite.go ├── time_range.go └── time_range_test.go ├── latent_state.go ├── latent_state_test.go ├── log.go ├── log ├── composite │ ├── composite_log.go │ └── composite_log_test.go ├── file │ ├── file_log.go │ ├── file_log_test.go │ ├── file_util.go │ └── file_util_test.go ├── mongo │ ├── mongo_log.go │ └── mongo_log_test.go ├── screen │ └── screen_log.go └── sql │ ├── sql_log.go │ └── sql_log_test.go ├── logon_state.go ├── logon_state_test.go ├── logout_state.go ├── logout_state_test.go ├── memory_store.go ├── message.go ├── message_router.go ├── message_router_test.go ├── message_test.go ├── msg_type.go ├── not_session_time.go ├── not_session_time_test.go ├── null_log.go ├── parser.go ├── parser_test.go ├── pending_timeout.go ├── pending_timeout_test.go ├── quickfix_test.go ├── registry.go ├── repeating_group.go ├── repeating_group_test.go ├── resend_state.go ├── resend_state_test.go ├── session.go ├── session_factory.go ├── session_factory_test.go ├── session_id.go ├── session_id_test.go ├── session_rejects.go ├── session_settings.go ├── session_settings_test.go ├── session_state.go ├── session_test.go ├── settings.go ├── settings_test.go ├── spec ├── FIX40.xml ├── FIX41.xml ├── FIX42.xml ├── FIX43.xml ├── FIX44.xml ├── FIX50.xml ├── FIX50SP1.xml ├── FIX50SP2.xml └── FIXT11.xml ├── store.go ├── store ├── file │ ├── file_store.go │ ├── file_store_test.go │ └── util.go ├── memory │ ├── ignore.go │ └── memory_store_test.go ├── mongo │ ├── mongo_store.go │ └── mongo_store_test.go └── sql │ ├── sql_store.go │ └── sql_store_test.go ├── tag.go ├── tag_value.go ├── tag_value_test.go ├── tls.go ├── tls_test.go ├── validation.go └── validation_test.go /.devcontainer/Dockerfile.dev: -------------------------------------------------------------------------------- 1 | FROM mcr.microsoft.com/devcontainers/go:1.23 -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Quickfix/Go Development", 3 | "dockerComposeFile": "docker-compose.yml", 4 | "service": "app", 5 | "workspaceFolder": "/workspace", 6 | "shutdownAction": "stopCompose", 7 | "runArgs": [ 8 | "--cap-add=SYS_PTRACE", 9 | "--security-opt", 10 | "seccomp=unconfined" 11 | ], 12 | "features": { 13 | "ruby": "latest" 14 | }, 15 | "customizations": { 16 | "vscode": { 17 | "settings": { 18 | "go.toolsManagement.checkForUpdates": "local", 19 | "go.useLanguageServer": true, 20 | "go.gopath": "/go" 21 | }, 22 | "extensions": [ 23 | "golang.Go", 24 | "mongodb.mongodb-vscode" 25 | ] 26 | } 27 | }, 28 | "remoteUser": "vscode" 29 | } -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: gomod 4 | directory: "/" 5 | schedule: 6 | interval: daily 7 | open-pull-requests-limit: 10 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.swp 3 | *.swo 4 | .idea 5 | vendor 6 | _test/test 7 | _test/echo_server 8 | _test/tmp 9 | _vendor* 10 | gen 11 | .DS_Store 12 | -------------------------------------------------------------------------------- /.golangci.yml: -------------------------------------------------------------------------------- 1 | run: 2 | timeout: 10m 3 | # deprecated config - 4 | # skip-dirs: 5 | # - gen 6 | # - vendor 7 | 8 | issues: 9 | exclude-dirs: 10 | - gen 11 | - vendor 12 | 13 | linters: 14 | disable-all: true 15 | enable: 16 | - dupl 17 | - gofmt 18 | - goimports 19 | - gosimple 20 | - govet 21 | - ineffassign 22 | - misspell 23 | - revive 24 | - unused 25 | - staticcheck 26 | - godot 27 | 28 | linters-settings: 29 | gofmt: 30 | simplify: true 31 | dupl: 32 | threshold: 400 -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contribution Guidelines 2 | 3 | We welcome pull requests, bug fixes and issue reports. 4 | 5 | Please direct questions about using the library to the [Mailing List](https://groups.google.com/forum/#!forum/quickfixgo). 6 | 7 | Before proposing a large change, please discuss your change by raising an issue. 8 | 9 | ## Submitting Changes 10 | 11 | * Push your changes to a topic branch in your fork of the repository 12 | * Submit a pull request to the repository in the QuickFIXGo Organization 13 | 14 | ## Notes 15 | 16 | * If you report a bug and do not include a fix, please include a failing test 17 | * Generally, contributions without tests will not be accepted 18 | * Contributions that fail the automated build will not be accepted 19 | -------------------------------------------------------------------------------- /_sql/embed.go: -------------------------------------------------------------------------------- 1 | package sql 2 | 3 | import "embed" 4 | 5 | //go:embed mssql mysql oracle postgresql sqlite3 6 | var FS embed.FS 7 | -------------------------------------------------------------------------------- /_sql/mssql/create.bat: -------------------------------------------------------------------------------- 1 | osql -U sa -P -i quickfix_database.sql -------------------------------------------------------------------------------- /_sql/mysql/create.bat: -------------------------------------------------------------------------------- 1 | mysql -u root --execute="source mysql.sql"; -------------------------------------------------------------------------------- /_sql/mysql/create.sh: -------------------------------------------------------------------------------- 1 | mysql -u root --execute="source mysql.sql"; -------------------------------------------------------------------------------- /_sql/mysql/event_log_table.sql: -------------------------------------------------------------------------------- 1 | USE quickfix; 2 | 3 | DROP TABLE IF EXISTS event_log; 4 | 5 | CREATE TABLE event_log ( 6 | id INT UNSIGNED NOT NULL AUTO_INCREMENT, 7 | time DATETIME NOT NULL, 8 | beginstring CHAR(8) NOT NULL, 9 | sendercompid VARCHAR(64) NOT NULL, 10 | sendersubid VARCHAR(64) NOT NULL, 11 | senderlocid VARCHAR(64) NOT NULL, 12 | targetcompid VARCHAR(64) NOT NULL, 13 | targetsubid VARCHAR(64) NOT NULL, 14 | targetlocid VARCHAR(64) NOT NULL, 15 | session_qualifier VARCHAR(64), 16 | text TEXT NOT NULL, 17 | PRIMARY KEY (id) 18 | ); -------------------------------------------------------------------------------- /_sql/mysql/messages_log_table.sql: -------------------------------------------------------------------------------- 1 | USE quickfix; 2 | 3 | DROP TABLE IF EXISTS messages_log; 4 | 5 | CREATE TABLE messages_log ( 6 | id INT UNSIGNED NOT NULL AUTO_INCREMENT, 7 | time DATETIME NOT NULL, 8 | beginstring CHAR(8) NOT NULL, 9 | sendercompid VARCHAR(64) NOT NULL, 10 | sendersubid VARCHAR(64) NOT NULL, 11 | senderlocid VARCHAR(64) NOT NULL, 12 | targetcompid VARCHAR(64) NOT NULL, 13 | targetsubid VARCHAR(64) NOT NULL, 14 | targetlocid VARCHAR(64) NOT NULL, 15 | session_qualifier VARCHAR(64) NOT NULL, 16 | text TEXT NOT NULL, 17 | PRIMARY KEY (id) 18 | ); -------------------------------------------------------------------------------- /_sql/mysql/messages_table.sql: -------------------------------------------------------------------------------- 1 | USE quickfix; 2 | 3 | DROP TABLE IF EXISTS messages; 4 | 5 | CREATE TABLE messages ( 6 | beginstring CHAR(8) NOT NULL, 7 | sendercompid VARCHAR(64) NOT NULL, 8 | sendersubid VARCHAR(64) NOT NULL, 9 | senderlocid VARCHAR(64) NOT NULL, 10 | targetcompid VARCHAR(64) NOT NULL, 11 | targetsubid VARCHAR(64) NOT NULL, 12 | targetlocid VARCHAR(64) NOT NULL, 13 | session_qualifier VARCHAR(64) NOT NULL, 14 | msgseqnum INT NOT NULL, 15 | message TEXT NOT NULL, 16 | PRIMARY KEY (beginstring, sendercompid, sendersubid, senderlocid, 17 | targetcompid, targetsubid, targetlocid, session_qualifier, 18 | msgseqnum) 19 | ); -------------------------------------------------------------------------------- /_sql/mysql/mysql.sql: -------------------------------------------------------------------------------- 1 | source quickfix_database.sql; 2 | source sessions_table.sql; 3 | source messages_table.sql; 4 | source messages_log_table.sql; 5 | source event_log_table.sql; -------------------------------------------------------------------------------- /_sql/mysql/quickfix_database.sql: -------------------------------------------------------------------------------- 1 | DROP DATABASE IF EXISTS quickfix; 2 | CREATE DATABASE quickfix; -------------------------------------------------------------------------------- /_sql/mysql/sessions_table.sql: -------------------------------------------------------------------------------- 1 | USE quickfix; 2 | 3 | DROP TABLE IF EXISTS sessions; 4 | 5 | CREATE TABLE sessions ( 6 | beginstring CHAR(8) NOT NULL, 7 | sendercompid VARCHAR(64) NOT NULL, 8 | sendersubid VARCHAR(64) NOT NULL, 9 | senderlocid VARCHAR(64) NOT NULL, 10 | targetcompid VARCHAR(64) NOT NULL, 11 | targetsubid VARCHAR(64) NOT NULL, 12 | targetlocid VARCHAR(64) NOT NULL, 13 | session_qualifier VARCHAR(64) NOT NULL, 14 | creation_time DATETIME NOT NULL, 15 | incoming_seqnum INT NOT NULL, 16 | outgoing_seqnum INT NOT NULL, 17 | PRIMARY KEY (beginstring, sendercompid, sendersubid, senderlocid, 18 | targetcompid, targetsubid, targetlocid, session_qualifier) 19 | ); -------------------------------------------------------------------------------- /_sql/oracle/messages_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE messages ( 2 | beginstring VARCHAR2(8) NOT NULL, 3 | sendercompid VARCHAR2(64) NOT NULL, 4 | sendersubid VARCHAR2(64) NOT NULL, 5 | senderlocid VARCHAR2(64) NOT NULL, 6 | targetcompid VARCHAR2(64) NOT NULL, 7 | targetsubid VARCHAR2(64) NOT NULL, 8 | targetlocid VARCHAR2(64) NOT NULL, 9 | session_qualifier VARCHAR2(64) NOT NULL, 10 | msgseqnum INTEGER NOT NULL, 11 | message VARCHAR2(4000) NOT NULL, 12 | PRIMARY KEY (beginstring, sendercompid, sendersubid, senderlocid, 13 | targetcompid, targetsubid, targetlocid, session_qualifier, msgseqnum) 14 | ); -------------------------------------------------------------------------------- /_sql/oracle/sessions_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE sessions ( 2 | beginstring VARCHAR2(8) NOT NULL, 3 | sendercompid VARCHAR2(64) NOT NULL, 4 | sendersubid VARCHAR2(64) NOT NULL, 5 | senderlocid VARCHAR2(64) NOT NULL, 6 | targetcompid VARCHAR2(64) NOT NULL, 7 | targetsubid VARCHAR2(64) NOT NULL, 8 | targetlocid VARCHAR2(64) NOT NULL, 9 | session_qualifier VARCHAR2(64) NOT NULL, 10 | creation_time TIMESTAMP NOT NULL, 11 | incoming_seqnum INTEGER NOT NULL, 12 | outgoing_seqnum INTEGER NOT NULL, 13 | PRIMARY KEY (beginstring, sendercompid, sendersubid, senderlocid, 14 | targetcompid, targetsubid, targetlocid, session_qualifier) 15 | ); -------------------------------------------------------------------------------- /_sql/postgresql/create.bat: -------------------------------------------------------------------------------- 1 | dropdb -U postgres --if-exists quickfix 2 | createdb -U postgres quickfix 3 | psql -U postgres -d quickfix -f postgresql.sql 4 | -------------------------------------------------------------------------------- /_sql/postgresql/create.sh: -------------------------------------------------------------------------------- 1 | dropdb -U postgres --if-exists quickfix 2 | createdb -U postgres quickfix 3 | psql -U postgres -d quickfix -f postgresql.sql 4 | -------------------------------------------------------------------------------- /_sql/postgresql/event_log_table.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE event_log_sequence; 2 | 3 | CREATE TABLE event_log ( 4 | id INTEGER DEFAULT NEXTVAL('event_log_sequence'), 5 | time TIMESTAMP WITH TIME ZONE NOT NULL, 6 | beginstring CHAR(8) NOT NULL, 7 | sendercompid VARCHAR(64) NOT NULL, 8 | sendersubid VARCHAR(64) NOT NULL, 9 | senderlocid VARCHAR(64) NOT NULL, 10 | targetcompid VARCHAR(64) NOT NULL, 11 | targetsubid VARCHAR(64) NOT NULL, 12 | targetlocid VARCHAR(64) NOT NULL, 13 | session_qualifier VARCHAR(64), 14 | text TEXT NOT NULL, 15 | PRIMARY KEY (id) 16 | ); -------------------------------------------------------------------------------- /_sql/postgresql/messages_log_table.sql: -------------------------------------------------------------------------------- 1 | CREATE SEQUENCE messages_log_sequence; 2 | 3 | CREATE TABLE messages_log ( 4 | id INTEGER DEFAULT NEXTVAL('messages_log_sequence'), 5 | time TIMESTAMP WITH TIME ZONE NOT NULL, 6 | beginstring CHAR(8) NOT NULL, 7 | sendercompid VARCHAR(64) NOT NULL, 8 | sendersubid VARCHAR(64) NOT NULL, 9 | senderlocid VARCHAR(64) NOT NULL, 10 | targetcompid VARCHAR(64) NOT NULL, 11 | targetsubid VARCHAR(64) NOT NULL, 12 | targetlocid VARCHAR(64) NOT NULL, 13 | session_qualifier VARCHAR(64), 14 | text TEXT NOT NULL, 15 | PRIMARY KEY (id) 16 | ); -------------------------------------------------------------------------------- /_sql/postgresql/messages_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE messages ( 2 | beginstring CHAR(8) NOT NULL, 3 | sendercompid VARCHAR(64) NOT NULL, 4 | sendersubid VARCHAR(64) NOT NULL, 5 | senderlocid VARCHAR(64) NOT NULL, 6 | targetcompid VARCHAR(64) NOT NULL, 7 | targetsubid VARCHAR(64) NOT NULL, 8 | targetlocid VARCHAR(64) NOT NULL, 9 | session_qualifier VARCHAR(64) NOT NULL, 10 | msgseqnum INTEGER NOT NULL, 11 | message TEXT NOT NULL, 12 | PRIMARY KEY (beginstring, sendercompid, sendersubid, senderlocid, 13 | targetcompid, targetsubid, targetlocid, session_qualifier, 14 | msgseqnum) 15 | ); -------------------------------------------------------------------------------- /_sql/postgresql/postgresql.sql: -------------------------------------------------------------------------------- 1 | \i sessions_table.sql; 2 | \i messages_table.sql; 3 | \i messages_log_table.sql; 4 | \i event_log_table.sql; -------------------------------------------------------------------------------- /_sql/postgresql/sessions_table.sql: -------------------------------------------------------------------------------- 1 | CREATE TABLE sessions ( 2 | beginstring CHAR(8) NOT NULL, 3 | sendercompid VARCHAR(64) NOT NULL, 4 | sendersubid VARCHAR(64) NOT NULL, 5 | senderlocid VARCHAR(64) NOT NULL, 6 | targetcompid VARCHAR(64) NOT NULL, 7 | targetsubid VARCHAR(64) NOT NULL, 8 | targetlocid VARCHAR(64) NOT NULL, 9 | session_qualifier VARCHAR(64) NOT NULL, 10 | creation_time TIMESTAMP WITH TIME ZONE NOT NULL, 11 | incoming_seqnum INTEGER NOT NULL, 12 | outgoing_seqnum INTEGER NOT NULL, 13 | PRIMARY KEY (beginstring, sendercompid, sendersubid, senderlocid, 14 | targetcompid, targetsubid, targetlocid, session_qualifier) 15 | ); -------------------------------------------------------------------------------- /_sql/sqlite3/event_log_table.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS event_log; 2 | 3 | CREATE TABLE event_log ( 4 | id INTEGER PRIMARY KEY NOT NULL, 5 | time DATETIME NOT NULL, 6 | beginstring CHAR(8) NOT NULL, 7 | sendercompid VARCHAR(64) NOT NULL, 8 | sendersubid VARCHAR(64) NOT NULL, 9 | senderlocid VARCHAR(64) NOT NULL, 10 | targetcompid VARCHAR(64) NOT NULL, 11 | targetsubid VARCHAR(64) NOT NULL, 12 | targetlocid VARCHAR(64) NOT NULL, 13 | session_qualifier VARCHAR(64), 14 | text TEXT NOT NULL 15 | ); 16 | -------------------------------------------------------------------------------- /_sql/sqlite3/messages_log_table.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS messages_log; 2 | 3 | CREATE TABLE messages_log ( 4 | id INTEGER PRIMARY KEY NOT NULL, 5 | time DATETIME NOT NULL, 6 | beginstring CHAR(8) NOT NULL, 7 | sendercompid VARCHAR(64) NOT NULL, 8 | sendersubid VARCHAR(64) NOT NULL, 9 | senderlocid VARCHAR(64) NOT NULL, 10 | targetcompid VARCHAR(64) NOT NULL, 11 | targetsubid VARCHAR(64) NOT NULL, 12 | targetlocid VARCHAR(64) NOT NULL, 13 | session_qualifier VARCHAR(64) NOT NULL, 14 | text TEXT NOT NULL 15 | ); 16 | -------------------------------------------------------------------------------- /_sql/sqlite3/messages_table.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS messages; 2 | 3 | CREATE TABLE messages ( 4 | beginstring CHAR(8) NOT NULL, 5 | sendercompid VARCHAR(64) NOT NULL, 6 | sendersubid VARCHAR(64) NOT NULL, 7 | senderlocid VARCHAR(64) NOT NULL, 8 | targetcompid VARCHAR(64) NOT NULL, 9 | targetsubid VARCHAR(64) NOT NULL, 10 | targetlocid VARCHAR(64) NOT NULL, 11 | session_qualifier VARCHAR(64) NOT NULL, 12 | msgseqnum INT NOT NULL, 13 | message TEXT NOT NULL, 14 | PRIMARY KEY (beginstring, sendercompid, sendersubid, senderlocid, 15 | targetcompid, targetsubid, targetlocid, session_qualifier, 16 | msgseqnum) 17 | ); 18 | -------------------------------------------------------------------------------- /_sql/sqlite3/sessions_table.sql: -------------------------------------------------------------------------------- 1 | DROP TABLE IF EXISTS sessions; 2 | 3 | CREATE TABLE sessions ( 4 | beginstring CHAR(8) NOT NULL, 5 | sendercompid VARCHAR(64) NOT NULL, 6 | sendersubid VARCHAR(64) NOT NULL, 7 | senderlocid VARCHAR(64) NOT NULL, 8 | targetcompid VARCHAR(64) NOT NULL, 9 | targetsubid VARCHAR(64) NOT NULL, 10 | targetlocid VARCHAR(64) NOT NULL, 11 | session_qualifier VARCHAR(64) NOT NULL, 12 | creation_time DATETIME NOT NULL, 13 | incoming_seqnum INT NOT NULL, 14 | outgoing_seqnum INT NOT NULL, 15 | PRIMARY KEY (beginstring, sendercompid, sendersubid, senderlocid, 16 | targetcompid, targetsubid, targetlocid, session_qualifier) 17 | ); 18 | -------------------------------------------------------------------------------- /_test/RunnerTestCase.rb: -------------------------------------------------------------------------------- 1 | require 'Runner' 2 | require 'runit/testcase' 3 | 4 | class RunnerTestCase < RUNIT::TestCase 5 | def test_createProcess 6 | process = createProcess("foo\nbar\niCONNECT\nbaz", "localhost", 39333) 7 | assert process.kind_of?(ReflectorClient) 8 | process = createProcess("iCONNECT\nfoo\nbar\nbaz", "localhost", 39333) 9 | assert process.kind_of?(ReflectorClient) 10 | process = createProcess("foo\nbar\neCONNECT\nbaz", "localhost", 39333) 11 | assert process.kind_of?(ReflectorServer) 12 | process = createProcess("eCONNECT\nfoo\nbar\nbaz", "localhost", 39333) 13 | assert process.kind_of?(ReflectorServer) 14 | process = createProcess("foo\nbar\nbaz", "localhost", 39333) 15 | assert process.nil? 16 | process = createProcess("foo\nbar\nbazeCONNECT", "localhost", 39333) 17 | assert process.nil? 18 | process = createProcess("", "localhost", 39333) 19 | assert process.nil? 20 | end 21 | end 22 | -------------------------------------------------------------------------------- /_test/atfixturerun.rb: -------------------------------------------------------------------------------- 1 | $kidpid = fork; 2 | 3 | if($kidpid == 0) { 4 | chdir(".."); 5 | exec("debug/quickfix -t server -f cfg/at_server_test.cfg"); 6 | } 7 | sleep(6000); 8 | `bash -c "./runall"`; 9 | 10 | kill($kidpid); -------------------------------------------------------------------------------- /_test/cfg/lastseqnumprocessed/fix42.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5003 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.2 10 | DataDictionary=../spec/FIX42.xml 11 | EnableLastMsgSeqNumProcessed=Y -------------------------------------------------------------------------------- /_test/cfg/lastseqnumprocessed/fix43.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5004 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.3 10 | DataDictionary=../spec/FIX43.xml 11 | EnableLastMsgSeqNumProcessed=Y -------------------------------------------------------------------------------- /_test/cfg/lastseqnumprocessed/fix44.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5005 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.4 10 | DataDictionary=../spec/FIX44.xml 11 | EnableLastMsgSeqNumProcessed=Y -------------------------------------------------------------------------------- /_test/cfg/lastseqnumprocessed/fix50.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5006 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50 11 | DefaultApplVerID=FIX.5.0 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50.xml 14 | EnableLastMsgSeqNumProcessed=Y -------------------------------------------------------------------------------- /_test/cfg/lastseqnumprocessed/fix50sp1.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5007 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50SP1 11 | DefaultApplVerID=FIX.5.0SP1 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50SP1.xml 14 | EnableLastMsgSeqNumProcessed=Y -------------------------------------------------------------------------------- /_test/cfg/lastseqnumprocessed/fix50sp2.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5008 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50SP2 11 | DefaultApplVerID=FIX.5.0SP2 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50SP2.xml 14 | EnableLastMsgSeqNumProcessed=Y -------------------------------------------------------------------------------- /_test/cfg/nextexpectedseqnum/fix44.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5005 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | FileLogPath=tmp 6 | 7 | [SESSION] 8 | BeginString=FIX.4.4 9 | DataDictionary=../spec/FIX44.xml 10 | EnableNextExpectedMsgSeqNum=Y 11 | -------------------------------------------------------------------------------- /_test/cfg/nextexpectedseqnum/fix50.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5006 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | FileLogPath=tmp 6 | 7 | [SESSION] 8 | BeginString=FIXT.1.1 9 | DefaultApplVerID=FIX.5.0 10 | TransportDataDictionary=../spec/FIXT11.xml 11 | AppDataDictionary=../spec/FIX50.xml 12 | EnableNextExpectedMsgSeqNum=Y 13 | -------------------------------------------------------------------------------- /_test/cfg/nextexpectedseqnum/fix50sp1.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5007 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | FileLogPath=tmp 6 | 7 | [SESSION] 8 | BeginString=FIXT.1.1 9 | DefaultApplVerID=FIX.5.0SP1 10 | TransportDataDictionary=../spec/FIXT11.xml 11 | AppDataDictionary=../spec/FIX50SP1.xml 12 | EnableNextExpectedMsgSeqNum=Y 13 | -------------------------------------------------------------------------------- /_test/cfg/nextexpectedseqnum/fix50sp2.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5008 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | FileLogPath=tmp 6 | 7 | [SESSION] 8 | BeginString=FIXT.1.1 9 | DefaultApplVerID=FIX.5.0SP2 10 | TransportDataDictionary=../spec/FIXT11.xml 11 | AppDataDictionary=../spec/FIX50SP2.xml 12 | EnableNextExpectedMsgSeqNum=Y 13 | -------------------------------------------------------------------------------- /_test/cfg/resendreqchunksize/fix40.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5001 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.0 10 | DataDictionary=../spec/FIX40.xml 11 | ResendRequestChunkSize=5 -------------------------------------------------------------------------------- /_test/cfg/resendreqchunksize/fix41.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5002 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.1 10 | DataDictionary=../spec/FIX41.xml 11 | ResendRequestChunkSize=5 -------------------------------------------------------------------------------- /_test/cfg/resendreqchunksize/fix42.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5003 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.2 10 | DataDictionary=../spec/FIX42.xml 11 | ResendRequestChunkSize=5 -------------------------------------------------------------------------------- /_test/cfg/resendreqchunksize/fix43.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5004 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.3 10 | DataDictionary=../spec/FIX43.xml 11 | ResendRequestChunkSize=5 -------------------------------------------------------------------------------- /_test/cfg/resendreqchunksize/fix44.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5005 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.4 10 | DataDictionary=../spec/FIX44.xml 11 | ResendRequestChunkSize=5 -------------------------------------------------------------------------------- /_test/cfg/resendreqchunksize/fix50.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5006 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50 11 | DefaultApplVerID=FIX.5.0 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50.xml 14 | ResendRequestChunkSize=5 -------------------------------------------------------------------------------- /_test/cfg/resendreqchunksize/fix50sp1.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5007 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50SP1 11 | DefaultApplVerID=FIX.5.0SP1 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50SP1.xml 14 | ResendRequestChunkSize=5 -------------------------------------------------------------------------------- /_test/cfg/resendreqchunksize/fix50sp2.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5008 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50SP2 11 | DefaultApplVerID=FIX.5.0SP2 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50SP2.xml 14 | ResendRequestChunkSize=5 -------------------------------------------------------------------------------- /_test/cfg/server/fix40.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5001 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.0 10 | DataDictionary=../spec/FIX40.xml 11 | -------------------------------------------------------------------------------- /_test/cfg/server/fix41.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5002 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.1 10 | DataDictionary=../spec/FIX41.xml 11 | -------------------------------------------------------------------------------- /_test/cfg/server/fix42.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5003 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.2 10 | DataDictionary=../spec/FIX42.xml -------------------------------------------------------------------------------- /_test/cfg/server/fix43.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5004 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.3 10 | DataDictionary=../spec/FIX43.xml 11 | -------------------------------------------------------------------------------- /_test/cfg/server/fix44.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5005 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIX.4.4 10 | DataDictionary=../spec/FIX44.xml 11 | -------------------------------------------------------------------------------- /_test/cfg/server/fix50.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5006 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50 11 | DefaultApplVerID=FIX.5.0 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50.xml 14 | -------------------------------------------------------------------------------- /_test/cfg/server/fix50sp1.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5007 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50SP1 11 | DefaultApplVerID=FIX.5.0SP1 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50SP1.xml 14 | -------------------------------------------------------------------------------- /_test/cfg/server/fix50sp2.cfg: -------------------------------------------------------------------------------- 1 | [DEFAULT] 2 | SocketAcceptPort=5008 3 | SenderCompID=ISLD 4 | TargetCompID=TW 5 | ResetOnLogon=Y 6 | FileLogPath=tmp 7 | 8 | [SESSION] 9 | BeginString=FIXT.1.1 10 | SessionQualifier=FIX50SP2 11 | DefaultApplVerID=FIX.5.0SP2 12 | TransportDataDictionary=../spec/FIXT11.xml 13 | AppDataDictionary=../spec/FIX50SP2.xml 14 | -------------------------------------------------------------------------------- /_test/definitions/fields.fmt: -------------------------------------------------------------------------------- 1 | 10=\d{3} 2 | 42=\d{8}-\d{2}:\d{2}:\d{2} 3 | 52=\d{8}-\d{2}:\d{2}:\d{2}|\d{8}-\d{2}:\d{2}:\d{2}[.]\d{3} 4 | 60=\d{8}-\d{2}:\d{2}:\d{2} 5 | 122=\d{8}-\d{2}:\d{2}:\d{2} 6 | -------------------------------------------------------------------------------- /_test/definitions/lastseqnumprocessed/fix42/LastProcessedMsgSeqNum.def: -------------------------------------------------------------------------------- 1 | iCONNECT 2 | 3 | I8=FIX.4.235=A34=149=TW52=