コントラクト関数でFNC_TblOpGetUDTMetadataとFNC_TblOpGetStructuredAttributeInfoを使用する方法を以下に示します。
int tblopudt_contract(
INTEGER *Result,
int *indicator_Result,
char sqlstate[6],
SQL_TEXT extname[129],
SQL_TEXT specific_name[129],
SQL_TEXT error_message[257])
{
FNC_TblOpColumnDef_t *oCols;
FNC_TblOpColumnDef_t *iCols;
UDT_BaseInfo_t *udtBaseInfo;
Stream_Fmt_en format;
InputInfo_t *icolinfo;
int incount, outcount , ocolcount;
int i,j, totalcols;
char mycontract[] = "this is my contract... this is my contract... this is my contract...";
char msg[500];
FNC_TblOpGetStreamCount(&incount, &outcount);
if(incount == 0)
{
SetError("U0003", "mift1 requires number of input streams to be > 0.");
return -1;
}
icolinfo = FNC_malloc (incount * sizeof(InputInfo_t));
totalcols = 0;
for(i=0; i < incount; i++)
{
icolinfo[i].colcount = FNC_TblOpGetColCount(i, ISINPUT);
totalcols += icolinfo[i].colcount;
icolinfo[i].iCols = FNC_malloc(TblOpSIZECOLDEF(icolinfo[i].colcount));
TblOpINITCOLDEF(icolinfo[i].iCols, icolinfo[i].colcount);
FNC_TblOpGetColDef(i, ISINPUT, icolinfo[i].iCols);
/* Retreive UDT metadata info for each column and write to trace table */
iCols = icolinfo[i].iCols;
icolinfo[i].baseColInfo = FNC_malloc(sizeof(UDT_BaseInfo_t) * iCols->num_columns);
FNC_TblOpGetUDTMetadata(i,ISINPUT,-1,
sizeof(UDT_BaseInfo_t) * iCols->num_columns,
&(icolinfo[i].baseColInfo[0]));
for(j=0; j < iCols->num_columns; j++)
{
UDT_BaseInfo_t* udtbaseinfo;
int bufferSize = 0;
attribute_info_eon_t * attrInfo = NULL;
char udtname[100];
udtbaseinfo = &(icolinfo[i].baseColInfo[j]);
int k;
if(udtbaseinfo->udt_indicator == 2) // Structured UDT
{
bufferSize = udtbaseinfo->struct_num_attributes * sizeof(attribute_info_eon_t);
attrInfo = FNC_malloc(bufferSize);
memset(attrInfo,0,bufferSize);
FNC_TblOpGetStructuredAttributeInfo(udtbaseinfo->udt_name,
bufferSize,attrInfo);
FNC_free(attrInfo);
}
}
}
/* Allocate space for columns. */
oCols = (FNC_TblOpColumnDef_t *)FNC_malloc( TblOpSIZECOLDEF(totalcols) );
memset(oCols, 0 , TblOpSIZECOLDEF(totalcols) );
oCols->num_columns = totalcols;
oCols->length = TblOpSIZECOLDEF(totalcols) - (2 * sizeof(int)) ;
TblOpINITCOLDEF(oCols, totalcols);
ocolcount = 0;
/* Copy input columns to output columns. */
for(j=0; j < incount; j++)
{
iCols = icolinfo[j].iCols;
for(i=0;i < iCols->num_columns;i++)
{
switch (iCols->column_types[i].datatype)
{
case DECIMAL1_DT:
case DECIMAL4_DT:
case DECIMAL8_DT:
oCols->column_types[ocolcount].size.range.totaldigit = iCols->column_types[i].size.range.totaldigit;
oCols->column_types[ocolcount].size.range.fracdigit = iCols->column_types[i].size.range.fracdigit;
break;
case DECIMAL2_DT:
oCols->column_types[ocolcount].size.range.totaldigit = 5;
oCols->column_types[ocolcount].size.range.fracdigit = iCols->column_types[i].size.range.fracdigit;
break;
case TIME_DT:
case TIMESTAMP_DT:
case PERIOD_DT:
oCols->column_types[ocolcount].size.precision = iCols->column_types[i].size.precision;
break;
case INTERVAL_YEAR_DT:
case INTERVAL_YTM_DT:
case INTERVAL_MONTH_DT:
case INTERVAL_DAY_DT:
case INTERVAL_DTH_DT:
case INTERVAL_DTM_DT:
case INTERVAL_DTS_DT:
case INTERVAL_HOUR_DT:
case INTERVAL_HTM_DT:
case INTERVAL_HTS_DT:
case INTERVAL_MINUTE_DT:
case INTERVAL_MTS_DT:
case INTERVAL_SECOND_DT:
oCols->column_types[ocolcount].size.intervalrange = iCols->column_types[i].size.intervalrange;
break;
case ARRAY_DT:
case UDT_DT:
case MBB_DT:
case MBR_DT:
strcpy(oCols->column_types[ocolcount].udt_type,iCols->column_types[i].udt_type);
oCols->column_types[ocolcount].size.length = iCols->column_types[i].size.length;
break;
default:
oCols->column_types[ocolcount].size.length = iCols->column_types[i].size.length;
break;
}
oCols->column_types[ocolcount].datatype = iCols->column_types[i].datatype;
oCols->column_types[ocolcount].charset = iCols->column_types[i].charset;
oCols->column_types[ocolcount].period_et = iCols->column_types[i].period_et;
oCols->column_types[ocolcount].bytesize = iCols->column_types[i].bytesize;
oCols->column_types[ocolcount].JSONStorageFormat = iCols->column_types[i].JSONStorageFormat;
ocolcount++;
}
}
FNC_TblOpSetContractDef(mycontract, strlen(mycontract)+1);
/* Define output columns. */
FNC_TblOpSetOutputColDef(0, oCols);
format = INDICFMT1;
FNC_TblOpSetFormat("RECFMT", 0, ISINPUT, &format, sizeof(format));
FNC_TblOpSetFormat("RECFMT", 0, ISOUTPUT, &format, sizeof(format));
FNC_free(oCols);
for(i=0; i < incount; i++)
{
FNC_free(icolinfo[i].iCols);
FNC_free(icolinfo[i].baseColInfo);
}
FNC_free(icolinfo);
*Result = 1;
}