#include "udxinc.h"
#include <string.h>
using namespace nz::udx_ver2;
class SimpleUdtf : public nz::udx_ver2::Udtf
{
public:
SimpleUdtf(UdxInit *pInit) : Udtf(pInit) {
m_first = false;
}
static nz::udx_ver2::Udtf* instantiate(UdxInit *pInit);
bool m_new;
bool m_first;
virtual DataAvailable nextEoiOutputRow()
{
if (!m_first) {
m_first = true;
m_new = true;
}
return nextOutputRow();
}
virtual DataAvailable nextOutputRow()
{
//return Done;
if (!m_new)
return Done;
m_new = false;
int val;
for (int i=0; i < numReturnColumns(); i++) {
setReturnColumnNull(i, false);
val = i+1;
char temp[100];
switch (returnTypeColumn(i))
{
case UDX_FIXED:
case UDX_VARIABLE:
case UDX_NATIONAL_FIXED:
case UDX_NATIONAL_VARIABLE:
{
StringReturn *ret = stringReturnColumn(i);
if (ret->size)
memset(ret->data, ' ', ret->size);
sprintf(temp, "%d", val);
ret->size = strlen(temp);
memcpy(ret->data, temp, strlen(temp));
break;
}
case UDX_BOOL:
*boolReturnColumn(i) = true;
break;
case UDX_DATE:
*dateReturnColumn(i) = val;
break;
case UDX_TIME:
*timeReturnColumn(i) = val;
break;
case UDX_TIMETZ:
{
TimeTzADT *ret = timetzReturnColumn(i);
ret->time = val;
ret->zone = 0;
break;
}
case UDX_NUMERIC32:
{
Numeric32Val *ret = numeric32ReturnColumn(i);
*ret->value = val;
break;
}
case UDX_NUMERIC64:
{
Numeric64Val *ret = numeric64ReturnColumn(i);
*ret->value = val;
break;
}
case UDX_NUMERIC128:
{
Numeric128Val *ret = numeric128ReturnColumn(i);
*ret->value = val;
break;
}
case UDX_FLOAT:
*floatReturnColumn(i) = val * 1.0;
break;
case UDX_DOUBLE:
*doubleReturnColumn(i) = val * 1.0;
break;
case UDX_INTERVAL:
{
struct Interval *ret = intervalReturnColumn(i);
ret->time = val;
ret->month = 0;
break;
}
case UDX_INT8:
*int8ReturnColumn(i) = val % sizeof(char);
break;
case UDX_INT16:
*int16ReturnColumn(i) = val;
break;
case UDX_INT32:
*int32ReturnColumn(i) = val;
break;
case UDX_INT64:
*int64ReturnColumn(i) = val;
break;
case UDX_TIMESTAMP:
*timestampReturnColumn(i) = val;
break;
default:
throwError(NZ_ERROR_ILLVAL, "Unknown type",
returnTypeColumn(i));
}
}
return MoreData;
}
virtual void newInputRow()
{
m_new = true;
}
}
;
nz::udx_ver2::Udtf* SimpleUdtf::instantiate(UdxInit *pInit)
{
return new SimpleUdtf(pInit);
}