我正在为PostgreSQL开发一个C函数,但我遇到了一些问题。下面是一个简化的示例,我尝试通过 SPI 进行连接:
#include "postgres.h"
#include "catalog/pg_type.h"
#include "utils/builtins.h"
#include "utils/numeric.h"
#include "executor/spi.h"
PG_MODULE_MAGIC;
PG_FUNCTION_INFO_V1(add_one);
PGDLLEXPORT Datum add_one(PG_FUNCTION_ARGS);
Datum add_one(PG_FUNCTION_ARGS) {
int32 arg = PG_GETARG_INT32(0);
SPI_connect();
SPI_finish();
PG_RETURN_INT32(arg + 1);
}
我在 Dev-C++ 中创建了一个 DLL 项目,设置了包含路径、库路径并与 postgresql.lib 链接,根据 https://wiki.postgresql.org/wiki/Building_and_Installing_PostgreSQL_Extension_Modules(使用 Visual Studio 项目文件构建)。 然后我编译了它并将DLL放入PostgreSQL库文件夹中。此外,我还能够使用以下命令在我的数据库中创建函数:
CREATE FUNCTION foo(integer) RETURNS integer AS '$libdir/example1', 'add_one' LANGUAGE C STRICT;
到目前为止,一切都很好。但是,当我尝试在 PgAdmin3 中执行选择时(例如SELECT foo(1)
),将显示一条消息,指出与数据库的连接已丢失,并询问"是否要尝试重新连接到数据库? 问题是,当我从代码中删除SPI_connect()
和SPI_finish()
时,它可以工作。
我使用的是带有PostgreSQL v9.2.18 x64的Windows 7 x64。
我该如何解决这个问题?
谢谢!
经过一段时间的努力,我终于解决了它。
根据PostgreSQL文档,我使用的版本可以使用Visual Studio 2005构建到Visual Studio 2012(包括Express版本)。
因此,我已经下载了2012 Express版本,并在获得堆栈跟踪之前遵循了Craig Ringer的这些说明(如Laurenz Albe所建议的那样)。
VS 2012生成的DLL工作正常。显然,这与 Dev-C++ 的构建方法有关。