Глюк с хранимкой на С

Изображение Loki

Имеется хранимка (триггерная функция) на С :

#include <postgres.h>
#include <executor/spi.h>
#include <commands/trigger.h>
#include <libpq-fe.h>
 
PG_MODULE_MAGIC;
 
int func(char *s0, char *s1);
extern Datum tf_func(PG_FUNCTION_ARGS);
 
PG_FUNCTION_INFO_V1(tf_func);
 
Datum tf_func(PG_FUNCTION_ARGS) {
	TriggerData *trigdata = (TriggerData *) fcinfo->context;
	Relation    rel;
	TupleDesc   tupdesc;
 
	/* часть кода опущенна */
 
	if (!CALLED_AS_TRIGGER(fcinfo)) elog(ERROR, "function trgf_upd_user is not called by trigger manager");
	if (!TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) elog(ERROR, "function trgf_upd_user is not fired by update");
	rel = trigdata->tg_relation;
	tupdesc = rel->rd_att;
	SPI_connect();
 
	/* часть кода опущенна */
	func(s0, s1);
	/* часть кода опущенна */
 
	SPI_exec(query, 0);
	SPI_finish();
	return PointerGetDatum(trigdata->tg_newtuple);
}
 
int func(char *s0, char *s1) {
	const char	*conninfo;
	char	query[255];
	PGconn	*conn;
	PGresult	*res;
	conninfo = "user=user dbname=dbname";
	conn = PQconnectdb(conninfo);
	if (PQstatus(conn) != CONNECTION_OK) {
		elog(ERROR, "Connection to database failed: %s", PQerrorMessage(conn));
		PQfinish(conn);
		return 1;
	}
 
	/* часть кода опущенна */
 
	res = PQexec(conn, query);
	if (PQresultStatus(res) != PGRES_COMMAND_OK) {
		elog(ERROR, "query failed: %s", PQerrorMessage(conn));
		PQclear(res);
		PQfinish(conn);
		return 1;
	}
	PQclear(res);
	PQfinish(conn);
	return 0;
}

Всё это на ура компилируется и кладётся в нужную папку. Далее следует попытка добавить сие творчество в качестве триггера:

CREATE OR REPLACE FUNCTION tf_func()
returns TRIGGER AS '$libdir/file.so'
LANGUAGE c;

... и неожиданно заканчивается :
postgres@localhost /home/user/work $ psql ts -f tf_func.sql
psql:/home/user/work/tf_func.sql:3: ERROR: incompatible library "/usr/lib64/postgresql-8.4/lib64/file.so": missing magic block
ПОДСКАЗКА: Extension libraries are required to use the PG_MODULE_MAGIC macro.

Эта функция работала ранее на постгресе версии 8.1 под управлением linux на i686-й архитектуре.
Сейчас я мучаю эту функцию вместе с постгресом версии 8.4.2 под управлением linux нв архитектуре amd64.
Может кто-нибудь с таким сталкивался?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Обычно ошибка в magic block

Обычно ошибка в magic block возникает из-за не соответсвия динамических библиотек версии сервера, судя по вопросу сервер ругается на то, что данный блок вообще отсутствует, т.е. его необходимо включить в процедуру. Для этого надо добавить в заголовок ссылку на fmgr.h со следующим содержанием:

#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif

и почитать тут http://www.postgresql.org/docs/8.3/interactive/xfunc-c.html

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023