mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
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.
|
* MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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);
|
Py_DECREF(pltrelid);
|
||||||
pfree(stroid);
|
pfree(stroid);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (TRIGGER_FIRED_BEFORE(tdata->tg_event))
|
if (TRIGGER_FIRED_BEFORE(tdata->tg_event))
|
||||||
pltwhen = PyString_FromString("BEFORE");
|
pltwhen = PyString_FromString("BEFORE");
|
||||||
else if (TRIGGER_FIRED_AFTER(tdata->tg_event))
|
else if (TRIGGER_FIRED_AFTER(tdata->tg_event))
|
||||||
pltwhen = PyString_FromString("AFTER");
|
pltwhen = PyString_FromString("AFTER");
|
||||||
else
|
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);
|
PyDict_SetItemString(pltdata, "when", pltwhen);
|
||||||
Py_DECREF(pltwhen);
|
Py_DECREF(pltwhen);
|
||||||
|
|
||||||
if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
|
if (TRIGGER_FIRED_FOR_ROW(tdata->tg_event))
|
||||||
|
{
|
||||||
pltlevel = PyString_FromString("ROW");
|
pltlevel = PyString_FromString("ROW");
|
||||||
else if (TRIGGER_FIRED_FOR_STATEMENT(tdata->tg_event))
|
PyDict_SetItemString(pltdata, "level", pltlevel);
|
||||||
pltlevel = PyString_FromString("STATEMENT");
|
Py_DECREF(pltlevel);
|
||||||
else
|
|
||||||
pltlevel = PyString_FromString("UNKNOWN");
|
|
||||||
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);
|
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);
|
PyDict_SetItemString(pltdata, "new", Py_None);
|
||||||
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
|
*rv = (HeapTuple) NULL;
|
||||||
tdata->tg_relation->rd_att);
|
|
||||||
PyDict_SetItemString(pltdata, "old", pytold);
|
if (TRIGGER_FIRED_BY_INSERT(tdata->tg_event))
|
||||||
Py_DECREF(pytold);
|
pltevent = PyString_FromString("INSERT");
|
||||||
*rv = tdata->tg_trigtuple;
|
else if (TRIGGER_FIRED_BY_DELETE(tdata->tg_event))
|
||||||
}
|
pltevent = PyString_FromString("DELETE");
|
||||||
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
|
else if (TRIGGER_FIRED_BY_UPDATE(tdata->tg_event))
|
||||||
{
|
pltevent = PyString_FromString("UPDATE");
|
||||||
pltevent = PyString_FromString("UPDATE");
|
else
|
||||||
pytnew = PLyDict_FromTuple(&(proc->result), tdata->tg_newtuple,
|
{
|
||||||
tdata->tg_relation->rd_att);
|
elog(ERROR, "unrecognized OP tg_event: %u", tdata->tg_event);
|
||||||
PyDict_SetItemString(pltdata, "new", pytnew);
|
pltevent = NULL; /* keep compiler quiet */
|
||||||
Py_DECREF(pytnew);
|
}
|
||||||
pytold = PLyDict_FromTuple(&(proc->result), tdata->tg_trigtuple,
|
|
||||||
tdata->tg_relation->rd_att);
|
PyDict_SetItemString(pltdata, "event", pltevent);
|
||||||
PyDict_SetItemString(pltdata, "old", pytold);
|
Py_DECREF(pltevent);
|
||||||
Py_DECREF(pytold);
|
|
||||||
*rv = tdata->tg_newtuple;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
elog(ERROR, "unrecognized LEVEL tg_event: %u", tdata->tg_event);
|
||||||
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);
|
|
||||||
|
|
||||||
if (tdata->tg_trigger->tgnargs)
|
if (tdata->tg_trigger->tgnargs)
|
||||||
{
|
{
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
* ENHANCEMENTS, OR MODIFICATIONS.
|
* ENHANCEMENTS, OR MODIFICATIONS.
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* 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))
|
else if (TRIGGER_FIRED_AFTER(trigdata->tg_event))
|
||||||
Tcl_DStringAppendElement(&tcl_cmd, "AFTER");
|
Tcl_DStringAppendElement(&tcl_cmd, "AFTER");
|
||||||
else
|
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 */
|
/* The level part of the event for TG_level */
|
||||||
if (TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))
|
if (TRIGGER_FIRED_FOR_ROW(trigdata->tg_event))
|
||||||
|
{
|
||||||
Tcl_DStringAppendElement(&tcl_cmd, "ROW");
|
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))
|
else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event))
|
||||||
|
{
|
||||||
Tcl_DStringAppendElement(&tcl_cmd, "STATEMENT");
|
Tcl_DStringAppendElement(&tcl_cmd, "STATEMENT");
|
||||||
else
|
|
||||||
Tcl_DStringAppendElement(&tcl_cmd, "UNKNOWN");
|
|
||||||
|
|
||||||
/* Build the data list for the trigtuple */
|
if (TRIGGER_FIRED_BY_INSERT(trigdata->tg_event))
|
||||||
pltcl_build_tuple_argument(trigdata->tg_trigtuple,
|
Tcl_DStringAppendElement(&tcl_cmd, "INSERT");
|
||||||
tupdesc, &tcl_trigtup);
|
else if (TRIGGER_FIRED_BY_DELETE(trigdata->tg_event))
|
||||||
|
Tcl_DStringAppendElement(&tcl_cmd, "DELETE");
|
||||||
/*
|
else if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
|
||||||
* Now the command part of the event for TG_op and data for NEW and
|
Tcl_DStringAppendElement(&tcl_cmd, "UPDATE");
|
||||||
* OLD
|
else
|
||||||
*/
|
elog(ERROR, "unrecognized OP tg_event: %u", trigdata->tg_event);
|
||||||
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_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
|
Tcl_DStringAppendElement(&tcl_cmd, "");
|
||||||
|
|
||||||
rettup = trigdata->tg_trigtuple;
|
rettup = (HeapTuple) NULL;
|
||||||
}
|
|
||||||
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
|
else
|
||||||
{
|
elog(ERROR, "unrecognized LEVEL tg_event: %u", trigdata->tg_event);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
|
memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
|
||||||
Tcl_DStringFree(&tcl_trigtup);
|
Tcl_DStringFree(&tcl_trigtup);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user