#define SQL_TEXT Latin_Text
#include <sqltypes_td.h>
#include <string.h>
void add_int (UDT_HANDLE *dynUDT,
INTEGER *result,
int *indicator_udt,
int *indicator_result,
char sqlstate[6],
SQL_TEXT extname[129],
SQL_TEXT specific_name[129],
SQL_TEXT error_message[257])
{
int Indicator=0;
int length = 0;
int sumValue=0;
int AttributeIntValue = 0;
char AttributeVCBuf[41];
int AttributeVCInt=0;
char AttributeLobBuf[41];
int AttributeLobInt=0;
LOB_LOCATOR AttributeLob;
FNC_LobLength_t StartLobLength;
FNC_LobLength_t MaxLobLength;
FNC_LobLength_t ActualLobLength;
LOB_CONTEXT_ID LobCtx;
UDT_HANDLE *UDT;
int Attribute_count=0;
int i;
attribute_info_t dyn_attrinfo;
strcpy((char *)sqlstate, "00000");
memset(&(error_message[0]), 0, sizeof(error_message));
/* This function takes a single Dynamic UDT parameter which is */
/* permitted to have an arbitrary number of expressions passed */
/* into it. Each expression is required to be one of: */
/* - BYTEINT, SHORTINT, INTEGER value. */
/* - CHAR() string representing an integer value. */
/* - VARCHAR() string representing an integer value. */
/* - CLOB() string representing an integer value. */
/* Determine number of expressions passed into */
/* NEW VARIANT_TYPE Dynamic UDT constructor */
FNC_GetStructuredAttributeCount(*dynUDT, &Attribute_count);
for(i=0; i<Attribute_count; i++)
{
/* Get data type information about the attribute being processed */
FNC_GetStructuredAttributeInfo(*dynUDT, i,
sizeof(attribute_info_t), &dyn_attrinfo);
/* Process the value based upon the data type */
switch(dyn_attrinfo.data_type)
{
case BYTEINT_DT:
case SMALLINT_DT:
case INTEGER_DT:
AttributeIntValue = 0;
Indicator =0;
/* Acquire the attribute value */
FNC_GetStructuredAttribute(*dynUDT,
&(dyn_attrinfo.attribute_name[0]), &AttributeIntValue,
sizeof(INTEGER), &Indicator, &length);
if (Indicator != 0) // If NULL
AttributeIntValue = 0;
/* Process the value */
sumValue = sumValue + AttributeIntValue;
break;
case VARCHAR_DT:
case CHAR_DT:
memset(&(AttributeVCBuf[0]), 0, sizeof(AttributeVCBuf));
AttributeVCInt = 0;
Indicator = 0;
FNC_GetStructuredAttribute(*dynUDT,
&(dyn_attrinfo.attribute_name[0]), &(AttributeVCBuf[0]),
sizeof(AttributeVCBuf), &Indicator, &length);
if (Indicator != 0) // If NULL
AttributeVCInt = 0;
else
AttributeVCInt = atoi(&(AttributeVCBuf[0]));
/* Process the value */
sumValue = sumValue + AttributeVCInt;
break;
case CLOB_REFERENCE_DT:
memset(&(AttributeLobBuf[0]), 0, sizeof(AttributeLobBuf));
AttributeLobInt = 0;
Indicator = 0;
FNC_GetStructuredInputLobAttribute(*dynUDT,
&(dyn_attrinfo.attribute_name[0]),
&Indicator, &AttributeLob );
if (Indicator != 0) // If NULL
AttributeLobInt = 0;
else
{
MaxLobLength = 41;
StartLobLength = 0;
FNC_LobOpen(AttributeLob, &LobCtx, StartLobLength,
MaxLobLength);
FNC_LobRead(LobCtx, &(AttributeLobBuf[0]), MaxLobLength,
&ActualLobLength);
FNC_LobClose(LobCtx);
AttributeLobInt = atoi(&(AttributeLobBuf[0]));
}
sumValue = sumValue + AttributeLobInt;
break;
default:
/* Invalid data type */
strcpy((char *)sqlstate, "00023");
sprintf(error_message,
"\nBad data type passed in to Dynamic UDT");
return;
break;
} /* end of the switch statement */
} /* end boundary for the for-attribute-processing-loop */
*indicator_result = 0;
*result = sumValue;
return;
}