【问题标题】:UDF error with firebird on linux (centOS)linux(centOS)上firebird的UDF错误
【发布时间】: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

标签: linux firebird


【解决方案1】:

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

  1. 导出的函数必须有__stdcall 指令
  2. UDF 中的所有参数都是通过引用传递的(int 参数 - 错误)
  3. 如果UDF分配内存,它必须使用特殊函数 ib_util_malloc 而不是 malloc 并且关键字 FREE_IT 必须是 在数据库中声明 UDF 时添加。目前你有内存泄漏 因为malloc 分配的内存永远不会被释放。

我推荐阅读 Interbase 6 dev guide 中的 UDF 章节,它相当古老,但仍然很实用。

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

【讨论】:

    猜你喜欢
    • 2013-03-14
    • 2010-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多