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