diff options
author | Tom Lane | 2000-05-29 01:59:17 +0000 |
---|---|---|
committer | Tom Lane | 2000-05-29 01:59:17 +0000 |
commit | 18952f67446da73f938d213b5225b99e95657837 (patch) | |
tree | 7ad26843000b8a17e798dafacbd29baf2d390fa1 /contrib/spi/autoinc.c | |
parent | 147ccf5c8045c79a9c8194044359e140c9074ed7 (diff) |
Second round of fmgr changes: triggers are now invoked in new style,
CurrentTriggerData is history.
Diffstat (limited to 'contrib/spi/autoinc.c')
-rw-r--r-- | contrib/spi/autoinc.c | 32 |
1 files changed, 15 insertions, 17 deletions
diff --git a/contrib/spi/autoinc.c b/contrib/spi/autoinc.c index c7caf3c842c..33cce457236 100644 --- a/contrib/spi/autoinc.c +++ b/contrib/spi/autoinc.c @@ -2,13 +2,13 @@ #include "executor/spi.h" /* this is what you need to work with SPI */ #include "commands/trigger.h" /* -"- and triggers */ -HeapTuple autoinc(void); - +extern Datum autoinc(PG_FUNCTION_ARGS); extern int4 nextval(struct varlena * seqin); -HeapTuple -autoinc() +Datum +autoinc(PG_FUNCTION_ARGS) { + TriggerData *trigdata = (TriggerData *) fcinfo->context; Trigger *trigger; /* to get trigger name */ int nargs; /* # of arguments */ int *chattrs; /* attnums of attributes to change */ @@ -22,24 +22,24 @@ autoinc() bool isnull; int i; - if (!CurrentTriggerData) - elog(ERROR, "autoinc: triggers are not initialized"); - if (TRIGGER_FIRED_FOR_STATEMENT(CurrentTriggerData->tg_event)) + if (!CALLED_AS_TRIGGER(fcinfo)) + elog(ERROR, "autoinc: not fired by trigger manager"); + if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event)) elog(ERROR, "autoinc: can't process STATEMENT events"); - if (TRIGGER_FIRED_AFTER(CurrentTriggerData->tg_event)) + if (TRIGGER_FIRED_AFTER(trigdata->tg_event)) elog(ERROR, "autoinc: must be fired before event"); - if (TRIGGER_FIRED_BY_INSERT(CurrentTriggerData->tg_event)) - rettuple = CurrentTriggerData->tg_trigtuple; - else if (TRIGGER_FIRED_BY_UPDATE(CurrentTriggerData->tg_event)) - rettuple = CurrentTriggerData->tg_newtuple; + if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event)) + rettuple = trigdata->tg_trigtuple; + else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event)) + rettuple = trigdata->tg_newtuple; else elog(ERROR, "autoinc: can't process DELETE events"); - rel = CurrentTriggerData->tg_relation; + rel = trigdata->tg_relation; relname = SPI_getrelname(rel); - trigger = CurrentTriggerData->tg_trigger; + trigger = trigdata->tg_trigger; nargs = trigger->tgnargs; if (nargs <= 0 || nargs % 2 != 0) @@ -48,8 +48,6 @@ autoinc() args = trigger->tgargs; tupdesc = rel->rd_att; - CurrentTriggerData = NULL; - chattrs = (int *) palloc(nargs / 2 * sizeof(int)); newvals = (Datum *) palloc(nargs / 2 * sizeof(Datum)); @@ -96,5 +94,5 @@ autoinc() pfree(chattrs); pfree(newvals); - return (rettuple); + return PointerGetDatum(rettuple); } |