Fix pltcl and plpython to support STATEMENT triggers.
authorTom Lane
Mon, 4 Aug 2003 18:40:50 +0000 (18:40 +0000)
committerTom Lane
Mon, 4 Aug 2003 18:40:50 +0000 (18:40 +0000)
Joe Conway

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

index ace8fd98c9ae9556c0fde1a6846d03ab00732d4d..e7a47e9ef4e3e09073cdcd25678a967ffafecfce 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 366903618b22c9cd16b6c4deb2e8943af5324002..54f4b561117120287996189f2a2ee7003636b7c7 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);