Имеется хранимка (триггерная функция) на С :
#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;
Эта функция работала ранее на постгресе версии 8.1 под управлением linux на i686-й архитектуре.
Сейчас я мучаю эту функцию вместе с постгресом версии 8.4.2 под управлением linux нв архитектуре amd64.
Может кто-нибудь с таким сталкивался?
Обычно ошибка в magic block
Обычно ошибка в magic block возникает из-за не соответсвия динамических библиотек версии сервера, судя по вопросу сервер ругается на то, что данный блок вообще отсутствует, т.е. его необходимо включить в процедуру. Для этого надо добавить в заголовок ссылку на fmgr.h со следующим содержанием:
и почитать тут http://www.postgresql.org/docs/8.3/interactive/xfunc-c.html