SPI в функции PostgreSQL C, вызывающей потерю соединения (Windows) - PullRequest
0 голосов
/ 27 октября 2018

Я разрабатываю функцию 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.

Как я могу решить эту проблему?

Спасибо!

1 Ответ

0 голосов
/ 29 октября 2018

Спустя некоторое время, работая над этим, я наконец решил это.

Согласно Документация PostgreSQL , версия, которую я использую, может быть построена с Visual Studio 2005 для Visual Studio 2012 (включаяЭкспресс издания).

Итак, я скачал редакцию 2012 Express и следовал этим инструкциям Крейга Рингера, прежде чем получить трассировку стека (как было предложено Лоренцем Альбе).

DLL сгенерированная VS 2012 работает нормально.Очевидно, что-то связано с методом сборки Dev-C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...