#define SQL_TEXT Latin_Text #define SQL_STATE_LENGTH 6 #define ERROR_MESSAGE_LENGTH 257 #include <sqltypes_td.h> #include "phasetrace.h" void trace (char *input_string) { void *argv[1]; int length[1]; argv[0] = input_string; length[0] = strlen(input_string); FNC_Trace_Write_DL(1, argv, length); /* write to trace table. */ } char tbuf[256]; typedef struct { int cnt; } local_ctx; void fnc_phase( INTEGER *in1, VARCHAR_LATIN *in2, INTEGER *out1, // first result attribute VARCHAR_LATIN *out2, int* i_i1, int* i_i2, int* i_o1, int* i_o2, char sqlstate[SQL_STATE_LENGTH], SQL_TEXT fncname[FNC_MAXNAMELEN], SQL_TEXT sfncname[FNC_MAXNAMELEN], SQL_TEXT errormsg[ERROR_MESSAGE_LENGTH]) { FNC_Phase Phase; local_ctx *state_info; /* make sure the function is called in the supported context */ if (FNC_GetPhase(&Phase) != TBL_MODE_VARY) { strcpy(sqlstate, "U0005"); strcpy((char *) errormsg, "Table function being called in unsupported mode."); return; } switch(Phase) { case TBL_PRE_INIT: state_info = FNC_TblAllocCtx(sizeof(local_ctx)); sprintf (tbuf,"\n In Pre Init"); trace(tbuf); break; case TBL_INIT: state_info = FNC_TblGetCtx(); state_info->cnt=1; sprintf (tbuf,"\n In Init"); trace(tbuf); break; case TBL_BUILD: state_info = FNC_TblGetCtx(); if (state_info->cnt == 0 ) { sprintf (tbuf,"\n In Build setting EOF, input 1 is %d",*in1); trace(tbuf); strcpy(sqlstate, "02000"); return; } sprintf (tbuf,"\n In Build, input 1 is %d",*in1); trace(tbuf); *out1 = *in1; strcpy((char*)out2,(char*)in2); state_info->cnt = 0; break; case TBL_FINI: sprintf (tbuf,"\n In Fini"); trace(tbuf); break; case TBL_END: sprintf (tbuf,"\n In END"); trace(tbuf); break; } }