Re: understanding Datum -> char * -> Datum conversions

Поиск
Список
Период
Сортировка
От Karel Zak
Тема Re: understanding Datum -> char * -> Datum conversions
Дата
Msg-id Pine.LNX.3.96.1000524181519.7481A-100000@ara.zf.jcu.cz
обсуждение исходный текст
Ответ на understanding Datum -> char * -> Datum conversions  (Louis-David Mitterrand <cunctator@apartia.ch>)
Ответы Re: understanding Datum -> char * -> Datum conversions  (Louis-David Mitterrand <cunctator@apartia.ch>)
Список pgsql-hackers
On Wed, 24 May 2000, Louis-David Mitterrand wrote:

> Hello,
> 
> I am learning to programm triggers in C by using the examples and the
> programmer's manual but it's a steep learning curve for a mere perl
> programmer ;-)
> 
> What I am trying to do for instance is:
> - read a ::text colum with SPI_getbinval(),
> - convert it to a char*,
> - modify it,
> - convert it back to a Datum,
> - reinsert it into the tuple through SPI_modifytuple,
> 
> The conversions involve some pointer magic and casting that I really
> don't grasp.
> 
> Also I am trying to read a timestamp with SPI_getbinval and get the
> number of seconds contained. Using DatumGetInt32 doens't seem to do it.
> 
> Thanks in advance for your insight, cheers,

Examples:
* Add actual time to column "chtime":          Datum   chtime  = PointerGetDatum(timestamp_in("now"));         int
attnum = SPI_fnumber(tupdesc, "chtime");
 
         rettuple = SPI_modifytuple(CurrentTriggerData->tg_relation,                     rettuple, 1, &attnum, &chtime,
NULL);
You can use instead "now" SPI_getvalue() .... etc.


* A small complex example:

HeapTuple xxx_trigger()
{       TupleDesc       tupdesc;       HeapTuple       rettuple        = NULL;int         attnum;char
*value;Datum      newdt;
 
       if (!CurrentTriggerData)               elog(ERROR, "XXX: triggers are not initialized");
       if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event)) {               rettuple =
CurrentTriggerData->tg_newtuple;      else if (TRIGGER_FIRED_BY_INSERT(CurrentTriggerData->tg_event))
rettuple= CurrentTriggerData->tg_trigtuple;       else if (TRIGGER_FIRED_BY_DELETE(CurrentTriggerData->tg_event))
        rettuple = CurrentTriggerData->tg_trigtuple;       tupdesc = CurrentTriggerData->tg_relation->rd_att;
 
if ( SPI_connect() < 0)                               elog(ERROR, "SPI_connect() fail... ");
attnum    = SPI_fnumber(tupdesc, "ColumnName");    value    = SPI_getvalue(rettuple, tupdesc, attnum);    /* --- add
somecode for 'value' ---*/
 
newdt    = PointerGetDatum(value);
    rettuple = SPI_modifytuple(CurrentTriggerData->tg_relation,                rettuple, 1, &attnum, &newdt, NULL);
 SPI_finish();       CurrentTriggerData = NULL;       return(rettuple);
 
}
.......... it must works :-)
                        Karel






В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Help with gram.y (UNDER)
Следующее
От: Tom Ivar Helbekkmo
Дата:
Сообщение: Re: Re: interactive pgsql book