You are viewing a plain text version of this content. The canonical link for it is here.
Posted to rivet-dev@tcl.apache.org by ka...@apache.org on 2009/05/05 20:38:43 UTC

svn commit: r771956 - in /tcl/rivet/trunk: ChangeLog src/TclWeb.h src/apache-2/rivetCore.c

Author: karl
Date: Tue May  5 18:38:42 2009
New Revision: 771956

URL: http://svn.apache.org/viewvc?rev=771956&view=rev
Log:
* Add new Rivet Tcl command,apache_table, which can query, get and set
  values in the Apache "notes", "headers_in", "headers_out",
  "err_headers_out" and "subprocess_env" tables.

* Add new "upload" option "tempname" that'll return the name of the
  temporary file containing the upload.

Modified:
    tcl/rivet/trunk/ChangeLog
    tcl/rivet/trunk/src/TclWeb.h
    tcl/rivet/trunk/src/apache-2/rivetCore.c

Modified: tcl/rivet/trunk/ChangeLog
URL: http://svn.apache.org/viewvc/tcl/rivet/trunk/ChangeLog?rev=771956&r1=771955&r2=771956&view=diff
==============================================================================
--- tcl/rivet/trunk/ChangeLog (original)
+++ tcl/rivet/trunk/ChangeLog Tue May  5 18:38:42 2009
@@ -1,3 +1,11 @@
+2009-05-05 Karl Lehenbauer <ka...@apache.org>
+    * Add new Rivet Tcl command,apache_table, which can query, get and set
+      values in the Apache "notes", "headers_in", "headers_out",
+      "err_headers_out" and "subprocess_env" tables.
+
+    * Add new "upload" option "tempname" that'll return the name of the
+      temporary file containing the upload.
+
 2009-05-01 Karl Lehenbauer <ka...@apache.org>
     * Rename global request rec pointer from globalrr to 
       rivet_panic_request_rec, add rivet_panic_pool and

Modified: tcl/rivet/trunk/src/TclWeb.h
URL: http://svn.apache.org/viewvc/tcl/rivet/trunk/src/TclWeb.h?rev=771956&r1=771955&r2=771956&view=diff
==============================================================================
--- tcl/rivet/trunk/src/TclWeb.h (original)
+++ tcl/rivet/trunk/src/TclWeb.h Tue May  5 18:38:42 2009
@@ -223,6 +223,22 @@
 /*
  *-----------------------------------------------------------------------------
  *
+ * TclWeb_UploadTempname --
+ *
+ * Get the name of the temp file the uploaded data was stored in.
+ *
+ * Results:
+ *
+ * Stores the temp name in 'tempname'.
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+int TclWeb_UploadTempname(Tcl_Obj *tempname, TclWebRequest *req);
+
+/*
+ *-----------------------------------------------------------------------------
+ *
  * TclWeb_UploadNames --
  *
  * Fetch names of all the uploaded variables.

Modified: tcl/rivet/trunk/src/apache-2/rivetCore.c
URL: http://svn.apache.org/viewvc/tcl/rivet/trunk/src/apache-2/rivetCore.c?rev=771956&r1=771955&r2=771956&view=diff
==============================================================================
--- tcl/rivet/trunk/src/apache-2/rivetCore.c (original)
+++ tcl/rivet/trunk/src/apache-2/rivetCore.c Tue May  5 18:38:42 2009
@@ -540,6 +540,251 @@
 /*
 */
 
+static int append_key_callback (void *data, const char *key, const char *val)
+{
+    Tcl_Obj *list = data;
+
+    Tcl_ListObjAppendElement (NULL, list, Tcl_NewStringObj (key, -1));
+    return 1;
+}
+
+static int
+append_key_value_callback (void *data, const char *key, const char *val)
+{
+    Tcl_Obj *list = data;
+
+    Tcl_ListObjAppendElement (NULL, list, Tcl_NewStringObj (key, -1));
+    Tcl_ListObjAppendElement (NULL, list, Tcl_NewStringObj (val, -1));
+    return 1;
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *
+ * Rivet_ApacheTable --
+ *
+ * 	Deals with Rivet key-value tables in the request structure
+ *
+ *	apache_table get tablename key
+ *      apache_table set tablename key value
+ *      apache_table exists tablename key
+ *      apache_table unset tablename key
+ *      apache_table list tablename
+ *
+ * Results:
+ *	A standard Tcl result.
+ *
+ * Side Effects:
+ *
+ *-----------------------------------------------------------------------------
+ */
+
+TCL_CMD_HEADER( Rivet_ApacheTable )
+{
+    apr_table_t *table;
+    int subcommandindex;
+
+    static CONST84 char *SubCommand[] = {
+	"get",
+	"set",
+	"exists",
+	"unset",
+	"names",
+	"array_get",
+	"clear",
+	NULL
+    };
+
+    enum subcommand {
+	SUB_GET,
+	SUB_SET,
+	SUB_EXISTS,
+	SUB_UNSET,
+	SUB_NAMES,
+	SUB_ARRAY_GET,
+	SUB_CLEAR
+    };
+
+    static CONST84 char *tableNames[] = {
+	"notes",
+	"headers_in",
+	"headers_out",
+	"err_headers_out",
+	"subprocess_env",
+	NULL
+    };
+
+    int tableindex;
+
+    enum tablename {
+	TABLE_NOTES,
+	TABLE_HEADERS_IN,
+	TABLE_HEADERS_OUT,
+	TABLE_ERR_HEADERS_OUT,
+	TABLE_SUBPROCESS_ENV
+    };
+
+    rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL);
+
+    if ((objc < 3) || (objc > 5)) {
+	Tcl_WrongNumArgs(interp, 1, objv, "option tablename ?args?");
+	return TCL_ERROR;
+    }
+
+    if (Tcl_GetIndexFromObj(interp, objv[1], SubCommand,
+			"get|set|unset|list",
+			0, &subcommandindex) == TCL_ERROR) {
+	return TCL_ERROR;
+    }
+
+    if (Tcl_GetIndexFromObj (interp, objv[2], tableNames,
+			"notes|headers_in|headers_out|err_header_out|subprocess_env",
+			0, &tableindex) == TCL_ERROR) {
+	return TCL_ERROR;
+    }
+
+    switch ((enum tablename)tableindex)
+    {
+	case TABLE_NOTES: {
+	    table = globals->r->notes;
+	    break;
+	}
+
+	case TABLE_HEADERS_IN: {
+	    table = globals->r->headers_in;
+	    break;
+	}
+
+	case TABLE_HEADERS_OUT: {
+	    table = globals->r->headers_out;
+	    break;
+	}
+
+	case TABLE_ERR_HEADERS_OUT: {
+	    table = globals->r->err_headers_out;
+	    break;
+	}
+
+	case TABLE_SUBPROCESS_ENV: {
+	    table = globals->r->subprocess_env;
+	    break;
+	}
+    }
+
+    switch ((enum subcommand)subcommandindex)
+    {
+	case SUB_GET: {
+	    const char *key;
+	    const char *value;
+
+	    if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "tablename key");
+		return TCL_ERROR;
+	    }
+
+	    key = Tcl_GetString (objv[3]);
+	    value = apr_table_get (table, key);
+
+	    if (value != NULL) {
+		Tcl_SetObjResult (interp, Tcl_NewStringObj (value, -1));
+	    }
+	    break;
+	}
+
+	case SUB_EXISTS: {
+	    const char *key;
+	    const char *value;
+
+	    if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "tablename key");
+		return TCL_ERROR;
+	    }
+
+	    key = Tcl_GetString (objv[3]);
+	    value = apr_table_get (table, key);
+
+	    Tcl_SetObjResult (interp, Tcl_NewBooleanObj (value != NULL));
+	    break;
+	}
+
+
+	case SUB_SET: {
+	    int i;
+	    char *key;
+	    char *value;
+
+	    if (objc == 4) {
+		int listObjc;
+		Tcl_Obj **listObjv;
+
+		if (Tcl_ListObjGetElements (interp, objv[3], &listObjc, &listObjv) == TCL_ERROR) {
+		    return TCL_ERROR;
+		}
+
+		if (listObjc % 2 == 1) {
+		    Tcl_SetObjResult (interp, Tcl_NewStringObj ("list must have even number of elements", -1));
+		    return TCL_ERROR;
+		}
+
+		for (i = 0; i < listObjc; i += 2) {
+		    apr_table_set (table, Tcl_GetString (listObjv[i]), Tcl_GetString (listObjv[i+1]));
+		}
+
+		break;
+	    }
+
+	    if (objc != 5) {
+		Tcl_WrongNumArgs(interp, 2, objv, "tablename key value");
+		return TCL_ERROR;
+	    }
+
+	    key = Tcl_GetString (objv[3]);
+	    value = Tcl_GetString (objv[4]);
+
+	    apr_table_set (table, key, value);
+	    break;
+	}
+
+	case SUB_UNSET: {
+	    char *key;
+
+	    if (objc != 4) {
+		Tcl_WrongNumArgs(interp, 2, objv, "tablename key");
+		return TCL_ERROR;
+	    }
+
+	    key = Tcl_GetString (objv[3]);
+	    apr_table_unset (table, key);
+	    break;
+	}
+
+	case SUB_NAMES: {
+            Tcl_Obj *list = Tcl_NewObj ();
+
+	    apr_table_do(append_key_callback, (void*)list, table, NULL);
+
+	    Tcl_SetObjResult (interp, list);
+	    break;
+	}
+
+	case SUB_ARRAY_GET: {
+            Tcl_Obj *list = Tcl_NewObj ();
+
+	    apr_table_do(append_key_value_callback, (void*)list, table, NULL);
+
+	    Tcl_SetObjResult (interp, list);
+	    break;
+	}
+
+	case SUB_CLEAR: {
+	    apr_table_clear (table);
+	}
+    }
+
+    return TCL_OK;
+}
+
+
 /*
  *-----------------------------------------------------------------------------
  *
@@ -583,6 +828,7 @@
 	"size",
 	"type",
 	"filename",
+	"tempname",
 	"names",
 	"tempname",
 	NULL
@@ -602,9 +848,12 @@
 
     rivet_interp_globals *globals = Tcl_GetAssocData(interp, "rivet", NULL);
     command = Tcl_GetString(objv[1]);
-    Tcl_GetIndexFromObj(interp, objv[1], SubCommand,
-			"channel|save|data|exists|size|type|filename|names|tempname",
-			0, &subcommandindex);
+    if (Tcl_GetIndexFromObj(interp, objv[1], SubCommand,
+			"channel|save|data|exists|size|type|filename|names|tempname"
+			"|tempname|names",
+			0, &subcommandindex) == TCL_ERROR) {
+	return TCL_ERROR;
+    }
 
     /* If it's any of these, we need to find a specific name. */
 
@@ -958,6 +1207,11 @@
 			 NULL,
 			 (Tcl_CmdDeleteProc *)NULL);
     Tcl_CreateObjCommand(interp,
+			 "apache_table",
+			 Rivet_ApacheTable,
+			 NULL,
+			 (Tcl_CmdDeleteProc *)NULL);
+    Tcl_CreateObjCommand(interp,
 			 "var_qs",
 			 Rivet_Var,
 			 NULL,



---------------------------------------------------------------------
To unsubscribe, e-mail: rivet-cvs-unsubscribe@tcl.apache.org
For additional commands, e-mail: rivet-cvs-help@tcl.apache.org