Próbuję utworzyć prosty UDF dla firebirda w Linuksie (w C skompilowany z GCC). Problem polega na tym, że gdy ustawię "Mechanizm powrotny" na "odniesienie", to po wywołaniu funkcji serwer ulega awarii. Gdy jest "według wartości", nie ma problemu.UDF Firebirda w Linuksie powoduje awarię serwera po ustawieniu na powrót przez odniesienie
Oto funkcje Staram się pisać w C:
Ten działa:
double round(double *);
double round(val)
double *val;
{
*val = *val * 100;
*val = (*val>= 0) ? (long)(*val + 0.5) : (long)(*val - 0.5);
*val = *val/100;
return *val;
}
Ale ten ulega awarii serwera, gdy o nazwie:
char * proper_case(str)
char * str;
{
return str;
}
Oto DDLs :
DECLARE EXTERNAL FUNCTION "ROUND"
DOUBLE PRECISION
RETURNS DOUBLE PRECISION BY VALUE
ENTRY_POINT 'round' MODULE_NAME 'my_udfs.so';
DECLARE EXTERNAL FUNCTION PROPCASE
CSTRING(10000)
RETURNS CSTRING(10000) FREE_IT
ENTRY_POINT 'proper_case' MODULE_NAME 'my_udfs.so';
Wzywam Drugą funkcją z:
select propcase('abrakadabra') from rdb$database;
Firebird awarii serwera, a jedynie komunikat o błędzie mam to:
Statement failed, SQLSTATE = -902
Error reading data from the connection.
Może ktoś doradzić? Każda pomoc zostanie doceniona!
Jedynym informacji zapomniałem dostarczenie jest droga ja kompilacji plik .so (może być kluczem jest tutaj):
gcc -c -O -fpic my_udf.c
ld -G my_udf.o -lm -lc -o my_udf.so
cp my_udf.so /usr/lib/firebird/2.1/UDF/my_udfs.so
Proponuję sprawdzić Rozdział 6 Interbase 6.0 Przewodnik dla programistów (dostępny na http://www.firebirdsql.org/en/reference-manuals/), jeszcze nie napisałem UDF, ale myślę, że przydzielasz pamięć w niewłaściwy sposób. –
Spojrzenie na kod niektórych UDF dostarczanych z Firebirdem może być również pomocne: http://svn.code.sf.net/p/firebird/code/firebird/trunk/src/extlib/ib_udf.cpp –
@MarkRotteveel - Skopiowałem następujące funkcje z Firebird SVN: pChar EXPORT IB_UDF_lower (const char * s) - a wynik jest taki sam. Jedyną zmianą, którą otrzymałem, jest to, że usunąłem słowo EXPORT, ponieważ GCC go nie rozpoznaje. –