linux上的firebird出现UDF错误(centOS)

时间:2014-03-18 08:46:34

标签: linux firebird

我尝试使用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未定义。     找不到模块名称或入口点。

有人可以告诉我它有什么问题吗?

1 个答案:

答案 0 :(得分:0)

FB UDF中有许多方面与通常的C程序/库不同,你必须学习并遵循它们。

  1. 导出的函数必须具有__stdcall指令
  2. UDF中的所有参数都通过引用传递(int参数 - 错误)
  3. 如果UDF分配内存,则必须使用特殊功能 ib_util_malloc代替malloc,关键字FREE_IT必须为 在数据库中声明UDF时添加。目前你有内存泄漏 因为malloc分配的内存永远不会被释放。
  4. 我建议在Interbase 6 dev guide中阅读UDF章节,它相当古老但仍然是实际的。

    顺便说一下,FB中有很多内部函数,包括各种子字符串提取。