使用hstore在C语言中使用PostgreSQL UDF

时间:2012-11-09 05:40:30

标签: c postgresql hstore

我正在用C编写PostgreSQL的扩展,我需要在我的UDF中使用hstore。我可以无错误地构建(使用pgxc),但不能在SQL查询中使用任何函数。

我已尝试PG_LIBS=hstore但在加载库时遇到了未定义的引用错误。

接下来的尝试是SHLIB_LINK=-L/usr/lib/postgresql/9.1/lib -lhstore(libhstore.so在系统中不存在,只有hstore.so,所以我尝试过使用sym和硬链接)并得到了

psql:libname.sql:69: ERROR:  could not load library
"/usr/lib/postgresql/9.1/lib/libname.so": libhstore.so: cannot open shared 
object file: No such file or directory

1 个答案:

答案 0 :(得分:5)

从内存中,hstore不会暴露很多C API。您必须通过server programming interface (SPI)使用它,通过C扩展使用其SQL级接口。 UPDATE :或者,as Tom Lane points out on the mailing list,使用fmgr来调用它公开的SQL函数,而不是使用SPI来运行完整的SQL语句。 UPDATE2 :另一种选择是直接load_external_function("extension", "symbol") C函数;见fmgr.h

您尝试在hstore中使用的大多数函数都将被声明为static(因此它们是hstore模块的本地函数),这可能是您获取未定义引用的原因。您只能使用hstore.h中声明的内容作为宏或extern函数。您不能通过直接C链接调用(例如)hstore_io.c中找到的任何函数。

PG_LIBS允许您指定要链接的共享库,但hstore.so不是在编译期间用于链接的典型共享库。它是一个PostgreSQL扩展模块,旨在由服务器dlopen()编写。我不认为真正支持链接到另一个的扩展模块。这意味着你可能甚至无法使用extern函数而不需要进行大量的黑客攻击。

使用SPI,fmgrload_external_function

如果使用load_external_function,您可能需要管理内存上下文和其他调用上下文。试着找一下它的用例。

请参阅: