我尝试使用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未定义。 找不到模块名称或入口点。
有人可以告诉我它有什么问题吗?
答案 0 :(得分:0)
FB UDF中有许多方面与通常的C程序/库不同,你必须学习并遵循它们。
__stdcall
指令int
参数 - 错误)ib_util_malloc
代替malloc
,关键字FREE_IT必须为
在数据库中声明UDF时添加。目前你有内存泄漏
因为malloc
分配的内存永远不会被释放。我建议在Interbase 6 dev guide中阅读UDF章节,它相当古老但仍然是实际的。
顺便说一下,FB中有很多内部函数,包括各种子字符串提取。