2016-05-19 16 views
1

Ich kompiliere eine UDF auf IBM Netezza mit C++ wie in der Dokumentation here. Mein Code kompiliert ohne ProblemeC++ Regex-Header nicht für Netezza UDF

#include <stdarg.h> 
#include <string.h> 
#include <regex.h> 
#include "udxinc.h" 
#include "udxhelpers.h" 

using namespace nz::udx_ver2; 

class Dateconvert: public Udf 
{ 
public: 
    Dateconvert(UdxInit *pInit) : Udf(pInit){} 
    ~Dateconvert(){} 

    static Udf* instantiate(UdxInit *pInit); 
    virtual ReturnValue evaluate() 
    { 

     StringReturn* ret = stringReturnInfo(); 
     StringArg *str; 
     str = stringArg(0); 
     int lengths = str->length; 
     char *datas = str->data; 
     char retval[100]; 
     strcpy(retval,"99991231"); 

     ret->size = sizeof(retval); 
     memcpy(ret->data, retval, sizeof(retval)); 

     NZ_UDX_RETURN_STRING(ret); 
    } 
}; 

Udf* Dateconvert::instantiate(UdxInit *pInit) 
{ 
     return new Dateconvert(pInit); 
} 

Ich brauche Regex zu verwenden, um das String-Argument mit einiger regulären Ausdruck Logik zu verarbeiten. Aber wenn ich versuche, in

#include <regex> 

oder

#include <regex.h> 

und der Code regex-spezifischen Code hinzuzufügen:

string int_num= "some pattern" 
string test= "test" 
regex pattern(int_num); 
if(regex_match(test, pattern) { do something}; 

ich folgende Fehler:

/nz/kit.7.2.0.7-P1/sys/cc/bin/i686-rhel5-linux-gnu-g++ -o 
/export/home/nz/DateConvert.o_x86 -fPIC -shared -Wa,--32 -march=prescott 
-mfpmath=sse -D__STDC_CONSTANT_MACROS -DGENCODE -DNZDEBUG=0 -DNZ_UDX_COMPILE 
-I/nz/kit.7.2.0.7-P1/sys/include -I/nz/kit.7.2.0.7-P1/sys/include/pg/include 
-DLINUX /export/home/nz/DateConvert.cpp 
/export/home/nz/DateConvert.cpp:3:17: error: regex: No such file or directory 
/export/home/nz/DateConvert.cpp: In member function 'virtual nz::udx::ReturnValue Dateconvert::evaluate()': 
/export/home/nz/DateConvert.cpp:27: error: 'regex' was not declared in this scope 
/export/home/nz/DateConvert.cpp:27: error: expected `;' before 'pattern' 
/export/home/nz/DateConvert.cpp:45: error: 'pattern' was not declared in this scope 
/export/home/nz/DateConvert.cpp:45: error: 'regex_match' was not declared in this scope 

Jedes Online-Beispiel verwendet diese beiden Heade rs für Regex in C++. Warum registriert es sich nicht beim Kompilieren?

Dies ist der Kompilierungsbefehl durch die Art und Weise:

nzudxcompile /export/home/nz/dateconvert.cpp -o dateconvert.o 
--sig "Dateconvert(VARCHAR(200))" --version 2 --return "VARCHAR(200)" 
--class Dateconvert --user user1 --pw pw1 --db db1 
+0

'using std :: regex;'. –

+0

Bedeutet das, dass "std :: regex" an einen regulären Code angehängt wird oder "namespace std :: regex" an den Anfang des Codes gesetzt wird? @AlanStokes – Danzo

+0

Sie können die Zeile hinzufügen, die ich am Anfang des Codes angegeben habe ('regex' ist ein Name, kein Namespace). Oder setzen Sie explizit 'std ::' vor 'regex'. –

Antwort

1

Das ist Know-how nicht mein Gebiet, aber es scheint mir, als ob die mitgelieferte regex.h für Netezza UDX Entwicklung aus der Bibliothek GNU C das würde regcomp und regexec anstelle von regex_match verwenden.

Der Header hat einen ifdef-Block für cpp-Unterstützung.

Es gibt ein paar Netezza-UDF-Stichproben, die diese Funktionen verwenden here.