[Quickfix-developers] Patch: Reporting the "Conditionally Required Field Missing" number in Busines
Brought to you by:
orenmnero
|
From: Vladimir A. <Vla...@FF...> - 2006-07-27 18:54:01
|
Hello,
I have created a simple patch for a very annoying feature: whenever your
FIX application tries to read a missing field and you don't process the
exception, QuickFIX sends a BusinessReject message with reason code =3D
CONDITIONALLY_REQUIRED_FIELD_MISSING, but it will not tell anyone the
*actual* number of the missing field. You have to analyse the FIX
message manually, trying to guess which field is actually missing. This
is a waste of time and effort since QuickFIX *knows* the field number.
It just wouldn't tell. Until now.
Quick FIX currently logs this in the *.event file:
20060628-11:47:41 : Message 925 Rejected: Conditionally Required Field
Missing
20060628-11:49:12 : Message 939 Rejected: Conditionally Required Field
Missing
20060628-11:50:33 : Message 942 Rejected: Conditionally Required Field
Missing
With this patch, the log will look like this:
20060628-12:17:50 : Message 1118 Rejected: Conditionally Required Field
Missing: 453
20060628-12:24:51 : Message 1135 Rejected: Conditionally Required Field
Missing: 453
Bingo! You can start immediately looking at the problem why field 453 is
missing and/or who is not checking if it is set.
The same rejection reason description is also automatically sent in the
BusinessReject's Text field, so the counterparty may analyse the problem
easily too now.
The patch was developed in QuickFIX 1.10.2, but it should work the same
in newer releases too.
Cheers,
Vladimir Arnost
-------------------------------------------------------------
Index: src/C++/Session.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- src/C++/Session.h (revision 12870)
+++ src/C++/Session.h (revision 12871)
@@ -197,7 +197,7 @@
void generateTestRequest( const std::string& );
void generateReject( const Message&, int err, int field =3D 0 );
void generateReject( const Message&, const std::string& );
- void generateBusinessReject( const Message&, int err );
+ void generateBusinessReject( const Message&, int err, int field =3D 0
);
void generateLogout( const std::string& text =3D "" );
=20
void populateRejectReason( Message&, int field, const std::string& );
Index: src/C++/Session.cpp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- src/C++/Session.cpp (revision 12870)
+++ src/C++/Session.cpp (revision 12871)
@@ -826,7 +826,7 @@
QF_STACK_POP
}
=20
-void Session::generateBusinessReject( const Message& message, int err )
+void Session::generateBusinessReject( const Message& message, int err,
int field )
{ QF_STACK_PUSH(Session::generateBusinessReject)
=20
Message reject;
@@ -841,7 +841,7 @@
reject.setField( BusinessRejectReason( err ) );
m_state.incrNextTargetMsgSeqNum();
=20
- const char* reason =3D 0;
+ std::string reason;
switch ( err )
{
case BusinessRejectReason_OTHER:
@@ -861,6 +861,11 @@
break;
case BusinessRejectReason_CONDITIONALLY_REQUIRED_FIELD_MISSING:
reason =3D
BusinessRejectReason_CONDITIONALLY_REQUIRED_FIELD_MISSING_TEXT;
+ if (field)
+ {
+ reason +=3D ": ";
+ reason +=3D IntConvertor::convert(field);
+ }
break;
case BusinessRejectReason_NOT_AUTHORIZED:
reason =3D BusinessRejectReason_NOT_AUTHORIZED_TEXT;
@@ -1248,7 +1253,7 @@
{
if( beginString >=3D FIX::BeginString_FIX42 && message.isApp() )
{
- LOGEX( generateBusinessReject( message, 5 ) );
+ LOGEX( generateBusinessReject( message, 5, e.field ) );
}
else
{
|