【发布时间】:2014-03-18 08:46:34
【问题描述】:
我尝试使用 C 在 linux 上为 firebird 创建一个 UDF 文件。 函数是从字符串中获取左字符。
我使用这个代码:
#include <stdlib.h>
#include<string.h>
#include <stdio.h>
char EXPORT *substr(const char *str, int start, int n);
char EXPORT *leftstr(const char *nama, int jumlah);
char* substr(const char *str, int start, int n)
{
char *pnew = (char*) malloc(n+1);
start--;
strncpy(pnew, str + start ,n);
pnew[n] = '\0';
return pnew;
}
char* leftstr(const char *nama, int jumlah)
{
char *hasil = substr(nama,1,jumlah);
return hasil;
}
然后我用这个编译它:
gcc -c -O -fpic left.c
ld -G left.o -lm -lc -o LeftUDF.so
cp LeftUDF.so /opt/firebird/udf
并声明它:
DECLARE EXTERNAL FUNCTION UDF_LEFTSTR_NEW
CHAR(255) CHARACTER SET NONE,
SMALLINT
RETURNS CHAR(255) CHARACTER SET NONE
ENTRY_POINT 'leftstr' MODULE_NAME 'LeftUDF';
但是当我尝试使用它时,我总是得到错误: 令牌无效。 偏移量 63 处的请求 BLR 无效。 未定义函数 UDF_LEFTSTR_NEW。 找不到模块名称或入口点。
谁能告诉我这是怎么回事?
【问题讨论】:
-
您是否将所有者设置为文件 LeftUDF.so 的火鸟?
-
我做了另一个简单的UDF,我在互联网上找到了,我可以使用这个功能。我不知道为什么这个函数出错了。而且我没有设置任何所有者。
-
我的意思是 firebird 无法读取您的文件。只需尝试更改文件的所有者。
chown firebird:firebird /opt/firebird/UDF/LeftUDF.so -
我试了下还是解决不了..
-
/opt/firebird/udf是否在Firebird.config中列入白名单?int在您的平台上是 16 位吗?否则声明应该使用INTEGER而不是SMALLINT。