Fix pltcl and plpython to support STATEMENT triggers.
Joe Conway
This commit is contained in:
parent
e8e1d4553c
commit
e627dd2db9
@ -29,7 +29,7 @@
|
||||
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.38 2003/08/04 01:57:58 tgl Exp $
|
||||
* $Header: /cvsroot/pgsql/src/pl/plpython/plpython.c,v 1.39 2003/08/04 18:40:50 tgl Exp $
|
||||
*
|
||||
*********************************************************************
|
||||
*/
|
||||
@ -651,68 +651,96 @@ PLy_trigger_build_args(FunctionCallInfo fcinfo, PLyProcedure * proc, HeapTuple *
|
||||
Py_DECREF(pltrelid);
|
||||
pfree(stroid);
|
||||
|
||||
|
||||
|
||||
if (TRIGGER_FIRED_BEFORE(tdata->tg_event))
|
||||
pltwhen = PyString_FromString("BEFORE");
|
||||
else if (TRIGGER_FIRED_AFTER(tdata->tg_event))
|
||||
pltwhen = PyString_FromString("AFTER");
|
||||
else
|
||||
pltwhen = PyString_FromString("UNKNOWN");
|
||||
{
|
||||
elog(ERROR, "unrecognized WHEN tg_event: %u", tdata->tg_event);
|
||||
pltwhen = NULL; /* keep compiler quiet */
|
||||
}
|
||||
PyDict_SetItemString(pltdata, "when", pltwhen);
|
||||
Py_DECREF(pltwhen);
|
||||
|
||||
if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
|
||||
{
|
||||
pltlevel = PyString_FromString("ROW");
|
||||
else if (TRIGGER_FIRED_FOR_STATEMENT(tdata->tg_event))
|
||||
pltlevel = PyString_FromString("STATEMENT");
|
||||
else
|
||||
pltlevel = PyString_FromString("UNKNOWN");
|
||||
PyDict_SetItemString(pltdata, "level", pltlevel);
|
||||
Py_DECREF(pltlevel);
|
||||
PyDict_SetItemString(pltdata, "level", pltlevel);
|
||||
Py_DECREF(pltlevel);
|
||||
|
||||
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
|
||||
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
|
||||
{
|
||||
pltevent = PyString_FromString("INSERT");
|
||||
|
||||
PyDict_SetItemString(pltdata, "old", Py_None);
|
||||
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
|
||||
tdata->tg_relation->rd_att);
|
||||
PyDict_SetItemString(pltdata, "new", pytnew);
|
||||
Py_DECREF(pytnew);
|
||||
*rv = tdata->tg_trigtuple;
|
||||
}
|
||||
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
|
||||
{
|
||||
pltevent = PyString_FromString("DELETE");
|
||||
|
||||
PyDict_SetItemString(pltdata, "new", Py_None);
|
||||
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
|
||||
tdata->tg_relation->rd_att);
|
||||
PyDict_SetItemString(pltdata, "old", pytold);
|
||||
Py_DECREF(pytold);
|
||||
*rv = tdata->tg_trigtuple;
|
||||
}
|
||||
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
|
||||
{
|
||||
pltevent = PyString_FromString("UPDATE");
|
||||
|
||||
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_newtuple,
|
||||
tdata->tg_relation->rd_att);
|
||||
PyDict_SetItemString(pltdata, "new", pytnew);
|
||||
Py_DECREF(pytnew);
|
||||
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
|
||||
tdata->tg_relation->rd_att);
|
||||
PyDict_SetItemString(pltdata, "old", pytold);
|
||||
Py_DECREF(pytold);
|
||||
*rv = tdata->tg_newtuple;
|
||||
}
|
||||
else
|
||||
{
|
||||
elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
|
||||
pltevent = NULL; /* keep compiler quiet */
|
||||
}
|
||||
|
||||
PyDict_SetItemString(pltdata, "event", pltevent);
|
||||
Py_DECREF(pltevent);
|
||||
}
|
||||
else if (TRIGGER_FIRED_FOR_STATEMENT(tdata->tg_event))
|
||||
{
|
||||
pltevent = PyString_FromString("INSERT");
|
||||
pltlevel = PyString_FromString("STATEMENT");
|
||||
PyDict_SetItemString(pltdata, "level", pltlevel);
|
||||
Py_DECREF(pltlevel);
|
||||
|
||||
PyDict_SetItemString(pltdata, "old", Py_None);
|
||||
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
|
||||
tdata->tg_relation->rd_att);
|
||||
PyDict_SetItemString(pltdata, "new", pytnew);
|
||||
Py_DECREF(pytnew);
|
||||
*rv = tdata->tg_trigtuple;
|
||||
}
|
||||
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
|
||||
{
|
||||
pltevent = PyString_FromString("DELETE");
|
||||
PyDict_SetItemString(pltdata, "new", Py_None);
|
||||
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
|
||||
tdata->tg_relation->rd_att);
|
||||
PyDict_SetItemString(pltdata, "old", pytold);
|
||||
Py_DECREF(pytold);
|
||||
*rv = tdata->tg_trigtuple;
|
||||
}
|
||||
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
|
||||
{
|
||||
pltevent = PyString_FromString("UPDATE");
|
||||
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_newtuple,
|
||||
tdata->tg_relation->rd_att);
|
||||
PyDict_SetItemString(pltdata, "new", pytnew);
|
||||
Py_DECREF(pytnew);
|
||||
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
|
||||
tdata->tg_relation->rd_att);
|
||||
PyDict_SetItemString(pltdata, "old", pytold);
|
||||
Py_DECREF(pytold);
|
||||
*rv = tdata->tg_newtuple;
|
||||
*rv = (HeapTuple) NULL;
|
||||
|
||||
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
|
||||
pltevent = PyString_FromString("INSERT");
|
||||
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
|
||||
pltevent = PyString_FromString("DELETE");
|
||||
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
|
||||
pltevent = PyString_FromString("UPDATE");
|
||||
else
|
||||
{
|
||||
elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
|
||||
pltevent = NULL; /* keep compiler quiet */
|
||||
}
|
||||
|
||||
PyDict_SetItemString(pltdata, "event", pltevent);
|
||||
Py_DECREF(pltevent);
|
||||
}
|
||||
else
|
||||
{
|
||||
pltevent = PyString_FromString("UNKNOWN");
|
||||
PyDict_SetItemString(pltdata, "old", Py_None);
|
||||
PyDict_SetItemString(pltdata, "new", Py_None);
|
||||
*rv = tdata->tg_trigtuple;
|
||||
}
|
||||
PyDict_SetItemString(pltdata, "event", pltevent);
|
||||
Py_DECREF(pltevent);
|
||||
elog(ERROR, "unrecognized LEVEL tg_event: %u", tdata->tg_event);
|
||||
|
||||
if (tdata->tg_trigger->tgnargs)
|
||||
{
|
||||
|
@ -31,7 +31,7 @@
|
||||
* ENHANCEMENTS, OR MODIFICATIONS.
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.74 2003/08/04 00:43:33 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/pl/tcl/pltcl.c,v 1.75 2003/08/04 18:40:50 tgl Exp $
|
||||
*
|
||||
**********************************************************************/
|
||||
|
||||
@ -708,63 +708,74 @@ pltcl_trigger_handler(PG_FUNCTION_ARGS)
|
||||
else if (TRIGGER_FIRED_AFTER(trigdata->tg_event))
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "AFTER");
|
||||
else
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "UNKNOWN");
|
||||
elog(ERROR, "unrecognized WHEN tg_event: %u", trigdata->tg_event);
|
||||
|
||||
/* The level part of the event for TG_level */
|
||||
if (TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "ROW");
|
||||
|
||||
/* Build the data list for the trigtuple */
|
||||
pltcl_build_tuple_argument(trigdata->tg_trigtuple,
|
||||
tupdesc, &tcl_trigtup);
|
||||
|
||||
/*
|
||||
* Now the command part of the event for TG_op and data for NEW and
|
||||
* OLD
|
||||
*/
|
||||
if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "INSERT");
|
||||
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "");
|
||||
|
||||
rettup = trigdata->tg_trigtuple;
|
||||
}
|
||||
else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "DELETE");
|
||||
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "");
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
||||
|
||||
rettup = trigdata->tg_trigtuple;
|
||||
}
|
||||
else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "UPDATE");
|
||||
|
||||
pltcl_build_tuple_argument(trigdata->tg_newtuple,
|
||||
tupdesc, &tcl_newtup);
|
||||
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_newtup));
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
||||
|
||||
rettup = trigdata->tg_newtuple;
|
||||
}
|
||||
else
|
||||
elog(ERROR, "unrecognized OP tg_event: %u", trigdata->tg_event);
|
||||
}
|
||||
else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event))
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "STATEMENT");
|
||||
else
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "UNKNOWN");
|
||||
|
||||
/* Build the data list for the trigtuple */
|
||||
pltcl_build_tuple_argument(trigdata->tg_trigtuple,
|
||||
tupdesc, &tcl_trigtup);
|
||||
|
||||
/*
|
||||
* Now the command part of the event for TG_op and data for NEW and
|
||||
* OLD
|
||||
*/
|
||||
if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "INSERT");
|
||||
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "");
|
||||
|
||||
rettup = trigdata->tg_trigtuple;
|
||||
}
|
||||
else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "DELETE");
|
||||
if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "INSERT");
|
||||
else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "DELETE");
|
||||
else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "UPDATE");
|
||||
else
|
||||
elog(ERROR, "unrecognized OP tg_event: %u", trigdata->tg_event);
|
||||
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "");
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "");
|
||||
|
||||
rettup = trigdata->tg_trigtuple;
|
||||
}
|
||||
else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "UPDATE");
|
||||
|
||||
pltcl_build_tuple_argument(trigdata->tg_newtuple,
|
||||
tupdesc, &tcl_newtup);
|
||||
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_newtup));
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
||||
|
||||
rettup = trigdata->tg_newtuple;
|
||||
rettup = (HeapTuple) NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
Tcl_DStringAppendElement(&tcl_cmd, "UNKNOWN");
|
||||
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
||||
Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
||||
|
||||
rettup = trigdata->tg_trigtuple;
|
||||
}
|
||||
elog(ERROR, "unrecognized LEVEL tg_event: %u", trigdata->tg_event);
|
||||
|
||||
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
|
||||
Tcl_DStringFree(&tcl_trigtup);
|
||||
|
Loading…
x
Reference in New Issue
Block a user