OSDN Git Service

Fix pltcl and plpython to support STATEMENT triggers.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 4 Aug 2003 18:40:50 +0000 (18:40 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 4 Aug 2003 18:40:50 +0000 (18:40 +0000)
Joe Conway

src/pl/plpython/plpython.c
src/pl/tcl/pltcl.c

index ace8fd9..e7a47e9 100644 (file)
@@ -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");
+               PyDict_SetItemString(pltdata, "level", pltlevel);
+               Py_DECREF(pltlevel);
+
+               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))
+       {
                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))
-       {
-               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;
+               *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)
        {
index 3669036..54f4b56 100644 (file)
@@ -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");
-       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);
+               /* 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");
+               /*
+                * 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, "");
+                       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");
+                       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));
+                       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");
+                       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);
+                       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));
+                       Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_newtup));
+                       Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
 
-               rettup = trigdata->tg_newtuple;
+                       rettup = trigdata->tg_newtuple;
+               }
+               else
+                       elog(ERROR, "unrecognized OP tg_event: %u", trigdata->tg_event);
        }
-       else
+       else if (TRIGGER_FIRED_FOR_STATEMENT(trigdata->tg_event))
        {
-               Tcl_DStringAppendElement(&tcl_cmd, "UNKNOWN");
+               Tcl_DStringAppendElement(&tcl_cmd, "STATEMENT");
+
+               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_DStringValue(&tcl_trigtup));
-               Tcl_DStringAppendElement(&tcl_cmd, Tcl_DStringValue(&tcl_trigtup));
+               Tcl_DStringAppendElement(&tcl_cmd, "");
+               Tcl_DStringAppendElement(&tcl_cmd, "");
 
-               rettup = trigdata->tg_trigtuple;
+               rettup = (HeapTuple) NULL;
        }
+       else
+               elog(ERROR, "unrecognized LEVEL tg_event: %u", trigdata->tg_event);
 
        memcpy(&Warn_restart, &save_restart, sizeof(Warn_restart));
        Tcl_DStringFree(&tcl_trigtup);