Given a pointer to a user data structure and its corresponding struct descriptors, this API gets all the MQeFields data into the data structure. Processing stops as soon as a descriptor fails or when all descriptors are extracted. This API is similar to MQeFieldsGetByArrayOfFd, as a match is only successful if both the field name and data type match the input descriptor. It differs by constructing the data buffers for the various fields from a single pointer value, as appropriate when extracting fields into a data structure. The platform specific base pointer is not available with this call (treated as NULL).
#include <hmq.h> MQEINT32 MQeFieldsGetByStruct( MQEHSESS hSess, MQEHFIELDS hFlds, MQEVOID * pStruct, (struct MQFieldStructDescriptor_st) pfsd[], MQEINT32 nSds, MQEINT32 * pCompCode, MQEINT32 * pReason)
#include <hmq.h> static MQECHAR const * FieldsType = "com.ibm.mqe.MQeFields"; struct myData_st { MQEINT32 x; /* simple variable */ MQECHAR *name ; /* pointer to name buffer */ MQEINT32 namelen; /* length of name */ MQEBYTE buf[8]; /* fixed buffer in struct */ MQEINT32 fieldlen; /* length of a field, buffer not in struct */ }; MQEINT32 field[10]; /* buffer whose length is in a structure */ /* A possible sample definition of MQEFIELDDESC for myData_st */ static MQEFIELDDESC myDataStruct_fd[] = { {"x", 1, MQE_TYPE_INT, 0, 0, 1}, {"name", 4, MQE_TYPE_ASCII, MQSTRUCT_LEN|MQSTRUCT_DATA, 4, 64}, {"buf", 3, MQE_TYPE_BYTE, 0, 12, 8}, {"field",5, MQE_TYPE_INT, MQSTRUCT_LEN|MQSTRUCT_NODATA, 20, 0} }; static MQECHAR * textBuf = "The Owl and the Pussy Cat went to sea."; static MQEBYTE byteBuf[] = { 0xAB, 0xCD, 0x12, 0x44}; MQEHSESS hSess; MQEINT32 compcode; MQEINT32 reason; MQEHFIELDS hFlds; struct myData_st myData; MQEINT32 int32Val; MQEINT32 rc; for (rc=0; rc<sizeof(field)/sizeof(field[0]); rc++) field[rc]=rc; hSess = MQeInitialize("MyAppsName", &compcode, &reason); hFlds = MQeFieldsAlloc( hSess, FieldsType, &compcode, &reason); /* Put some fields into the fields object. */ int32Val = 0xABABBABA; rc = MQeFieldsPut( hSess, hFlds, "x", MQE_TYPE_INT, &int32Val, 1, &compcode, &reason); rc = MQeFieldsPut( hSess, hFlds, "name", MQE_TYPE_ASCII, textBuf, strlen(textBuf), &compcode, &reason); rc = MQeFieldsPut( hSess, hFlds, "buf", MQE_TYPE_BYTE, byteBuf, 4, &compcode, &reason); rc = MQeFieldsPut( hSess, hFlds, "field", MQE_TYPE_INT, field, 10, &compcode, &reason); /* Retrieve all the fields out at once and populate the user data structure. */ rc = MQeFieldsGetByStruct( hSess, hFlds, &myData, myDataStruct_fd, 4, &compcode, &reason);