Как я могу получить данные из строки, вставляемой в триггер C? - PullRequest
1 голос
/ 10 января 2012

Postgresql 9.1.0.ОС Ubuntu 11.10.Компилятор gcc 4.6.1

Вот моя таблица:

CREATE TABLE ttest
(
  x integer,
  str text
 )
 WITH (
 OIDS=FALSE
);
ALTER TABLE ttest OWNER TO postgres;

CREATE TRIGGER tb
BEFORE INSERT
ON ttest
FOR EACH ROW
EXECUTE PROCEDURE out_trig();

out_trig - функция C.

Теперь я пытаюсь получить данные из каждой вставляемой строки.Вот код:

if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
{
    rettuple = trigdata->tg_trigtuple;
    bool isnull = false;
    uint32 x=rettuple->t_len;
    int64 f;
        f = (int64) GetAttributeByNum(rettuple->t_data, 1, &isnull);//error here
    elog(INFO,"len of tuple: %d",x);
    elog(INFO,"first column being inserted x: %d",f);
 }

Я получил ОШИБКУ: тип записи не зарегистрирован

Состояние SQL: 42809

Что я делаю неправильно и как это сделатьправильно?

1 Ответ

1 голос
/ 12 января 2012

GetAttributeByNum (или GetAttributeByName) работает только с датумами, а не с кортежами на диске, вместо этого используйте heap_getattr.

Вы объявили x как целое число, но пытаетесь прочитать его как int64 (PostgreSQL использует int4 для целочисленных типов, если вы явно не укажете свой столбец как int8).

И последнее, но не менее важное: используйте макросы DatumGet [YourType] при вызове функций, возвращающих данные, преобразование значения непосредственно в требуемый тип нарушает переносимость.

Длинно и коротко, код должен выглядеть примерно так:

if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
{
    HeapTuple rettuple = trigdata->tg_trigtuple;
    TupleDesc tupdesc = trigdata->tg_relation->rd_att;
    bool isnull = false;
    uint32 x=rettuple->t_len;
    int32 att = DatumGetInt32(heap_getattr(rettuple, 1, tupdesc, &isnull));
    elog(INFO,"len of tuple: %d",x);
    if (!isnull)
        elog(INFO,"first column being inserted x: %d",att);
    else
        elog(INFO,"first column being inserted x: NULL"); 
 }

Возможно, вы также захотите взглянуть на интерфейс SPI, который упрощает доступ к базе данных из пользовательских функций C: http://www.postgresql.org/docs/current/interactive/spi.html

...