PostgreSQL C 函数中的 SPI 导致连接丢失 (Windows)



我正在为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++ 的构建方法有关。

最新更新