Exemple de fonction de tableau définie par l'utilisateur

#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);
}