Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit e627dd2

Browse files
committed
Fix pltcl and plpython to support STATEMENT triggers.
Joe Conway
1 parent e8e1d45 commit e627dd2

File tree

2 files changed

+125
-86
lines changed

2 files changed

+125
-86
lines changed

src/pl/plpython/plpython.c

+74-46
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
3030
*
3131
* IDENTIFICATION
32-
* $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.38 2003/08/04 01:57:58 tgl Exp $
32+
* $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.39 2003/08/04 18:40:50 tgl Exp $
3333
*
3434
*********************************************************************
3535
*/
@@ -651,68 +651,96 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure * proc, HeapTuple *
651651
Py_DECREF(pltrelid);
652652
pfree(stroid);
653653

654-
655-
656654
if (TRIGGER_FIRED_BEFORE(tdata->tg_event))
657655
pltwhen = PyString_FromString("BEFORE");
658656
else if (TRIGGER_FIRED_AFTER(tdata->tg_event))
659657
pltwhen = PyString_FromString("AFTER");
660658
else
661-
pltwhen = PyString_FromString("UNKNOWN");
659+
{
660+
elog(ERROR, "unrecognized WHEN tg_event: %u", tdata->tg_event);
661+
pltwhen = NULL; /* keep compiler quiet */
662+
}
662663
PyDict_SetItemString(pltdata, "when", pltwhen);
663664
Py_DECREF(pltwhen);
664665

665666
if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
667+
{
666668
pltlevel = PyString_FromString("ROW");
669+
PyDict_SetItemString(pltdata, "level", pltlevel);
670+
Py_DECREF(pltlevel);
671+
672+
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
673+
{
674+
pltevent = PyString_FromString("INSERT");
675+
676+
PyDict_SetItemString(pltdata, "old", Py_None);
677+
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
678+
tdata->tg_relation->rd_att);
679+
PyDict_SetItemString(pltdata, "new", pytnew);
680+
Py_DECREF(pytnew);
681+
*rv = tdata->tg_trigtuple;
682+
}
683+
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
684+
{
685+
pltevent = PyString_FromString("DELETE");
686+
687+
PyDict_SetItemString(pltdata, "new", Py_None);
688+
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
689+
tdata->tg_relation->rd_att);
690+
PyDict_SetItemString(pltdata, "old", pytold);
691+
Py_DECREF(pytold);
692+
*rv = tdata->tg_trigtuple;
693+
}
694+
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
695+
{
696+
pltevent = PyString_FromString("UPDATE");
697+
698+
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_newtuple,
699+
tdata->tg_relation->rd_att);
700+
PyDict_SetItemString(pltdata, "new", pytnew);
701+
Py_DECREF(pytnew);
702+
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
703+
tdata->tg_relation->rd_att);
704+
PyDict_SetItemString(pltdata, "old", pytold);
705+
Py_DECREF(pytold);
706+
*rv = tdata->tg_newtuple;
707+
}
708+
else
709+
{
710+
elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
711+
pltevent = NULL; /* keep compiler quiet */
712+
}
713+
714+
PyDict_SetItemString(pltdata, "event", pltevent);
715+
Py_DECREF(pltevent);
716+
}
667717
else if (TRIGGER_FIRED_FOR_STATEMENT(tdata->tg_event))
718+
{
668719
pltlevel = PyString_FromString("STATEMENT");
669-
else
670-
pltlevel = PyString_FromString("UNKNOWN");
671-
PyDict_SetItemString(pltdata, "level", pltlevel);
672-
Py_DECREF(pltlevel);
720+
PyDict_SetItemString(pltdata, "level", pltlevel);
721+
Py_DECREF(pltlevel);
673722

674-
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
675-
{
676-
pltevent = PyString_FromString("INSERT");
677723
PyDict_SetItemString(pltdata, "old", Py_None);
678-
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
679-
tdata->tg_relation->rd_att);
680-
PyDict_SetItemString(pltdata, "new", pytnew);
681-
Py_DECREF(pytnew);
682-
*rv = tdata->tg_trigtuple;
683-
}
684-
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
685-
{
686-
pltevent = PyString_FromString("DELETE");
687724
PyDict_SetItemString(pltdata, "new", Py_None);
688-
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
689-
tdata->tg_relation->rd_att);
690-
PyDict_SetItemString(pltdata, "old", pytold);
691-
Py_DECREF(pytold);
692-
*rv = tdata->tg_trigtuple;
693-
}
694-
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
695-
{
696-
pltevent = PyString_FromString("UPDATE");
697-
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_newtuple,
698-
tdata->tg_relation->rd_att);
699-
PyDict_SetItemString(pltdata, "new", pytnew);
700-
Py_DECREF(pytnew);
701-
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
702-
tdata->tg_relation->rd_att);
703-
PyDict_SetItemString(pltdata, "old", pytold);
704-
Py_DECREF(pytold);
705-
*rv = tdata->tg_newtuple;
725+
*rv = (HeapTuple) NULL;
726+
727+
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
728+
pltevent = PyString_FromString("INSERT");
729+
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
730+
pltevent = PyString_FromString("DELETE");
731+
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
732+
pltevent = PyString_FromString("UPDATE");
733+
else
734+
{
735+
elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
736+
pltevent = NULL; /* keep compiler quiet */
737+
}
738+
739+
PyDict_SetItemString(pltdata, "event", pltevent);
740+
Py_DECREF(pltevent);
706741
}
707742
else
708-
{
709-
pltevent = PyString_FromString("UNKNOWN");
710-
PyDict_SetItemString(pltdata, "old", Py_None);
711-
PyDict_SetItemString(pltdata, "new", Py_None);
712-
*rv = tdata->tg_trigtuple;
713-
}
714-
PyDict_SetItemString(pltdata, "event", pltevent);
715-
Py_DECREF(pltevent);
743+
elog(ERROR, "unrecognized LEVEL tg_event: %u", tdata->tg_event);
716744

717745
if (tdata->tg_trigger->tgnargs)
718746
{

src/pl/tcl/pltcl.c

+51-40
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
* ENHANCEMENTS, OR MODIFICATIONS.
3232
*
3333
* IDENTIFICATION
34-
* $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.74 2003/08/04 00:43:33 momjian Exp $
34+
* $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.75 2003/08/04 18:40:50 tgl Exp $
3535
*
3636
**********************************************************************/
3737

@@ -708,63 +708,74 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
708708
else if (TRIGGER_FIRED_AFTER(trigdata->tg_event))
709709
Tcl_DStringAppendElement(&tcl_cmd, "AFTER");
710710
else
711-
Tcl_DStringAppendElement(&tcl_cmd, "UNKNOWN");
711+
elog(ERROR, "unrecognized WHEN tg_event: %u", trigdata->tg_event);
712712

713713
/* The level part of the event for TG_level */
714714
if (TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))
715+
{
715716
Tcl_DStringAppendElement(&tcl_cmd, "ROW");
716-
else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event))
717-
Tcl_DStringAppendElement(&tcl_cmd, "STATEMENT");
718-
else
719-
Tcl_DStringAppendElement(&tcl_cmd, "UNKNOWN");
720717

721-
/* Build the data list for the trigtuple */
722-
pltcl_build_tuple_argument(trigdata->tg_trigtuple,
723-
tupdesc, &tcl_trigtup);
718+
/* Build the data list for the trigtuple */
719+
pltcl_build_tuple_argument(trigdata->tg_trigtuple,
720+
tupdesc, &tcl_trigtup);
724721

725-
/*
726-
* Now the command part of the event for TG_op and data for NEW and
727-
* OLD
728-
*/
729-
if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
730-
{
731-
Tcl_DStringAppendElement(&tcl_cmd, "INSERT");
722+
/*
723+
* Now the command part of the event for TG_op and data for NEW and
724+
* OLD
725+
*/
726+
if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
727+
{
728+
Tcl_DStringAppendElement(&tcl_cmd, "INSERT");
732729

733-
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
734-
Tcl_DStringAppendElement(&tcl_cmd, "");
730+
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
731+
Tcl_DStringAppendElement(&tcl_cmd, "");
735732

736-
rettup = trigdata->tg_trigtuple;
737-
}
738-
else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
739-
{
740-
Tcl_DStringAppendElement(&tcl_cmd, "DELETE");
733+
rettup = trigdata->tg_trigtuple;
734+
}
735+
else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
736+
{
737+
Tcl_DStringAppendElement(&tcl_cmd, "DELETE");
741738

742-
Tcl_DStringAppendElement(&tcl_cmd, "");
743-
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
739+
Tcl_DStringAppendElement(&tcl_cmd, "");
740+
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
744741

745-
rettup = trigdata->tg_trigtuple;
746-
}
747-
else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
748-
{
749-
Tcl_DStringAppendElement(&tcl_cmd, "UPDATE");
742+
rettup = trigdata->tg_trigtuple;
743+
}
744+
else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
745+
{
746+
Tcl_DStringAppendElement(&tcl_cmd, "UPDATE");
750747

751-
pltcl_build_tuple_argument(trigdata->tg_newtuple,
752-
tupdesc, &tcl_newtup);
748+
pltcl_build_tuple_argument(trigdata->tg_newtuple,
749+
tupdesc, &tcl_newtup);
753750

754-
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_newtup));
755-
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
751+
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_newtup));
752+
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
756753

757-
rettup = trigdata->tg_newtuple;
754+
rettup = trigdata->tg_newtuple;
755+
}
756+
else
757+
elog(ERROR, "unrecognized OP tg_event: %u", trigdata->tg_event);
758758
}
759-
else
759+
else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event))
760760
{
761-
Tcl_DStringAppendElement(&tcl_cmd, "UNKNOWN");
761+
Tcl_DStringAppendElement(&tcl_cmd, "STATEMENT");
762+
763+
if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
764+
Tcl_DStringAppendElement(&tcl_cmd, "INSERT");
765+
else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
766+
Tcl_DStringAppendElement(&tcl_cmd, "DELETE");
767+
else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
768+
Tcl_DStringAppendElement(&tcl_cmd, "UPDATE");
769+
else
770+
elog(ERROR, "unrecognized OP tg_event: %u", trigdata->tg_event);
762771

763-
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
764-
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
772+
Tcl_DStringAppendElement(&tcl_cmd, "");
773+
Tcl_DStringAppendElement(&tcl_cmd, "");
765774

766-
rettup = trigdata->tg_trigtuple;
775+
rettup = (HeapTuple) NULL;
767776
}
777+
else
778+
elog(ERROR, "unrecognized LEVEL tg_event: %u", trigdata->tg_event);
768779

769780
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
770781
Tcl_DStringFree(&tcl_trigtup);

0 commit comments

Comments
 (0)