Я разрабатываю функцию C для PostgreSQL, но сталкиваюсь с некоторыми проблемами. Вот упрощенный пример, где я пытаюсь подключиться через 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);
}
Я создал проект DLL в Dev-C ++, установил пути включения, путь к библиотеке и связал его с postgresql.lib, в соответствии с https://wiki.postgresql.org/wiki/Building_and_Installing_PostgreSQL_Extension_Modules (Сборка с файлом проекта Visual Studio).
Затем я скомпилировал его и поместил DLL в папку lib PostgreSQL. Также я смог создать функцию в своей базе данных с помощью этой команды:
CREATE FUNCTION foo(integer) RETURNS integer AS '$libdir/example1', 'add_one' LANGUAGE C STRICT;
Пока все хорошо. Однако, когда я пытаюсь выполнить выбор в PgAdmin3 (например, SELECT foo(1)
), появляется сообщение о том, что соединение с базой данных потеряно, и спрашивает «Хотите ли вы попытаться повторно подключиться к базе данных?».
Дело в том, что когда я удаляю SPI_connect()
и SPI_finish()
из своего кода, это работает.
Я использую Windows 7 x64 с PostgreSQL v9.2.18 x64.
Как я могу решить эту проблему?
Спасибо!