Index: trunk/ippTools/src/pstamptool.c
===================================================================
--- trunk/ippTools/src/pstamptool.c	(revision 18526)
+++ trunk/ippTools/src/pstamptool.c	(revision 18531)
@@ -2,5 +2,5 @@
  * pstamptool.c
  *
- * Copyright (C) 2008  Joshua Hoblitt
+ * Copyright (C) 2008
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -39,4 +39,5 @@
 static bool pendingReqMode(pxConfig *config);
 static bool processedReqMode(pxConfig *config);
+static bool revertReqMode(pxConfig *config);
 static bool addJobMode(pxConfig *config);
 static bool listJobMode(pxConfig *config);
@@ -71,4 +72,5 @@
         MODECASE(PSTAMPTOOL_MODE_PENDINGREQ, pendingReqMode);
         MODECASE(PSTAMPTOOL_MODE_PROCESSEDREQ, processedReqMode);
+        MODECASE(PSTAMPTOOL_MODE_REVERTREQ, revertReqMode);
         MODECASE(PSTAMPTOOL_MODE_ADDJOB, addJobMode);
         MODECASE(PSTAMPTOOL_MODE_LISTJOB, listJobMode);
@@ -258,47 +260,4 @@
 }
 
-#define  MAGIC_STR  "$REQ_ID"
-
-// Replace $REQ_ID with the value of the request id if present in the outFileset
-
-static bool
-updateFilesetID(pxConfig *config, psS64 req_id, psString outFileset)
-{
-    char *magic;
-
-    magic = strcasestr(outFileset, MAGIC_STR);
-    if (magic == NULL) {
-        return true;
-    }
-
-    // find part of the string after the magic
-    char *after = magic + strlen(MAGIC_STR);
-
-    if (*after == 0) {
-        after = NULL;
-    }
-
-    psString converted = NULL;
-    if (magic > outFileset) {
-        int len = magic - outFileset;
-        converted = psStringAlloc(len + 1);
-        strncpy(converted, outFileset, len);
-        converted[len] = 0;
-    }
-
-    psStringAppend(&converted, "%" PRId64, req_id);
-    if (after) {
-        psStringAppend(&converted, after);
-    }
-
-    if (!p_psDBRunQuery(config->dbh, "UPDATE pstampRequest set outFileset = '%s' WHERE req_id = %" PRId64,
-            converted, req_id)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
 static bool addReqMode(pxConfig *config)
 {
@@ -316,13 +275,4 @@
         return false;
     }
-    psString outFileset = psMetadataLookupStr(&status, config->args, "-out_fileset");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -out_fileset");
-        return false;
-    }
-    if (!outFileset) {
-        psError(PS_ERR_UNKNOWN, true, "-out_fileset is required");
-        return false;
-    }
 
     // Data Store ID is optional
@@ -337,8 +287,7 @@
 
     char *query ="INSERT INTO pstampRequest"
-                 " (state, uri, ds_id, outFileset, resultsFile)"
-                 " VALUES( 'new', '%s', %s, '%s', 0)";
-
-    if (!p_psDBRunQuery(config->dbh, query, uri, ds_id, outFileset)) {
+                     " (state, uri, ds_id, fault)"
+                     " VALUES( 'new', '%s', %s, 0 )";
+    if (!p_psDBRunQuery(config->dbh, query, uri, ds_id)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
@@ -354,8 +303,4 @@
 
     psS64 req_id = psDBLastInsertID(config->dbh);
-    if (!updateFilesetID(config, req_id, outFileset)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to update fileset id\n");
-        return false;
-    }
 
     printf("%" PRId64 "\n", req_id);
@@ -446,8 +391,9 @@
     }
 
-    psString query = 
+    psString query = NULL;
+    psStringAppend(&query, 
         "SELECT * FROM pstampRequest WHERE state = 'run' AND "
             "(SELECT count(*) FROM pstampJob WHERE pstampJob.req_id = pstampRequest.req_id "
-            " AND pstampJob.state != 'stop') = 0" ;
+            " AND pstampJob.state != 'stop') = 0" );
 
     // treat limit == 0 as "no limit"
@@ -594,16 +540,67 @@
         return false;
     }
-    if (!state) {
-        psError(PS_ERR_UNKNOWN, true, "-state is required");
-        return false;
-    }
-
-    // XXX: check state for a legal value
-
-    char *query ="UPDATE pstampRequest"
-                 " SET state = '%s'"
-                 " WHERE req_id = '%s'";
-
-    if (!p_psDBRunQuery(config->dbh, query, state, req_id)) {
+    psString outProduct = psMetadataLookupStr(&status, config->args, "-outProduct");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -outProduct");
+        return false;
+    }
+    psString fault = psMetadataLookupStr(&status, config->args, "-fault");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fault");
+        return false;
+    }
+
+    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
+        return false;
+    }
+    psString name = psMetadataLookupStr(&status, config->args, "-name");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -name");
+        return false;
+    }
+    psString reqType = psMetadataLookupStr(&status, config->args, "-reqType");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reqType");
+        return false;
+    }
+
+    psString query = NULL;
+    psStringAppend(&query, "UPDATE pstampRequest SET");
+
+    char c = ' ';
+    if (state) {
+        psStringAppend(&query, "%c state = '%s'", c, state);
+        c = ',';
+    }
+    if (outProduct) {
+        psStringAppend(&query, "%c outProduct = '%s'", c, outProduct);
+        c = ',';
+    }
+    if (fault) {
+        psStringAppend(&query, "%c fault = %s", c, fault);
+        c = ',';
+    }
+    if (uri) {
+        psStringAppend(&query, "%c uri = '%s'", c, uri);
+        c = ',';
+    }
+    if (name) {
+        psStringAppend(&query, "%c name = '%s'", c, name);
+        c = ',';
+    }
+    if (reqType) {
+        psStringAppend(&query, "%c reqType = '%s'", c, reqType);
+        c = ',';
+    }
+    if (!state && !outProduct && !fault && !uri && !name && !reqType) {
+        psError(PS_ERR_UNKNOWN, true, "at least one of state, outProduct, fault, uri, name, and reqType must be specified");
+        return false;
+    }
+
+    psStringAppend(&query, " WHERE req_id = '%s'", req_id);
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(query);
@@ -612,5 +609,6 @@
 
     psU64 affected = psDBAffectedRows(config->dbh);
-    if (affected != 1) {
+    // note zero is not an error
+    if (affected > 1) {
         psError(PS_ERR_UNKNOWN, false, "should have affected one row but %" 
                                         PRIu64 " rows were modified", affected);
@@ -620,4 +618,37 @@
     return true;
 }
+
+static bool revertReqMode(pxConfig *config)
+{
+    bool    status;
+
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psS64 req_id = psMetadataLookupS64(&status, config->args, "-req_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -req_id");
+        return false;
+    }
+    if (!req_id) {
+        psError(PS_ERR_UNKNOWN, true, "-req_id is required");
+        return false;
+    }
+        
+
+    printf("Revert request %" PRId64 "\n", req_id);
+    
+    if (!p_psDBRunQuery(config->dbh, "DELETE FROM pstampJob where req_id = %" PRId64, req_id)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+    if (!p_psDBRunQuery(config->dbh, 
+        "UPDATE pstampRequest set state ='new', fault=0 where req_id = %" PRId64, req_id)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
+}
+
 static bool addJobMode(pxConfig *config)
 {
@@ -646,4 +677,13 @@
     }
 
+    psString rownum = psMetadataLookupStr(&status, config->args, "-rownum");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -rownum");
+        return false;
+    }
+    if (!rownum) {
+        psError(PS_ERR_UNKNOWN, true, "-rownum is required");
+        return false;
+    }
     psString uri = psMetadataLookupStr(&status, config->args, "-uri");
     if (!status) {
@@ -696,11 +736,11 @@
         stateString = "run";
     }
-    psString result = psMetadataLookupStr(&status, config->args, "-result");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -result");
-        return false;
-    }
-    if (!result) {
-        result = "0";
+    psString fault = psMetadataLookupStr(&status, config->args, "-fault");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fault");
+        return false;
+    }
+    if (!fault) {
+        fault = "0";
     }
 
@@ -709,13 +749,13 @@
     if (stampJob) {
         query ="INSERT INTO pstampJob"
-                 " (req_id, state, jobType, uri, outputBase, result, args)"
-                 " VALUES( %s, '%s', '%s', '%s', '%s', %s, '%s')";
+                 " (req_id, rownum, state, jobType, uri, outputBase, fault, args)"
+                 " VALUES( %s, '%s', '%s', '%s', '%s', '%s', %s, '%s')";
     } else {
         query ="INSERT INTO pstampJob"
-                 " (req_id, state, jobType, uri, outputBase, result)"
-                 " VALUES( %s, '%s', '%s', '%s', '%s', %s)";
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query, req_id, stateString, job_type, uri, outputBase, result, argString)) {
+                 " (req_id, rownum, state, jobType, uri, outputBase, fault)"
+                 " VALUES( %s, '%s', '%s', '%s', '%s', '%s', %s)";
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query, req_id, rownum, stateString, job_type, uri, outputBase, fault, argString)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
@@ -915,30 +955,27 @@
         return false;
     }
-    psString jobResult = psMetadataLookupStr(&status, config->args, "-result");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -result");
-        return false;
-    }
-
-    psString resultStr = NULL;
-    if (!jobResult) {
-        resultStr = psStringCopy("");
+    psString fault = psMetadataLookupStr(&status, config->args, "-fault");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fault");
+        return false;
+    }
+
+    psString faultStr = NULL;
+    if (!fault) {
+        faultStr = psStringCopy("");
     } else {
-        psStringAppend(&resultStr, ", result = '%s'", jobResult);
+        psStringAppend(&faultStr, ", fault = '%s'", fault);
     }
         
-
-    // XXX: check state for a legal value
-
     char *query ="UPDATE pstampJob"
                  " SET state = '%s' %s"
                  " WHERE job_id = '%s'";
 
-    if (!p_psDBRunQuery(config->dbh, query, state, resultStr, job_id)) {
+    if (!p_psDBRunQuery(config->dbh, query, state, faultStr, job_id)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(query);
         return false;
     }
-    psFree(resultStr);
+    psFree(faultStr);
 
     psU64 affected = psDBAffectedRows(config->dbh);
Index: trunk/ippTools/src/pstamptool.h
===================================================================
--- trunk/ippTools/src/pstamptool.h	(revision 18526)
+++ trunk/ippTools/src/pstamptool.h	(revision 18531)
@@ -33,4 +33,5 @@
     PSTAMPTOOL_MODE_PENDINGREQ,
     PSTAMPTOOL_MODE_PROCESSEDREQ,
+    PSTAMPTOOL_MODE_REVERTREQ,
     PSTAMPTOOL_MODE_ADDJOB,
     PSTAMPTOOL_MODE_LISTJOB,
Index: trunk/ippTools/src/pstamptoolConfig.c
===================================================================
--- trunk/ippTools/src/pstamptoolConfig.c	(revision 18526)
+++ trunk/ippTools/src/pstamptoolConfig.c	(revision 18531)
@@ -79,6 +79,4 @@
     psMetadataAddStr(addreqArgs, PS_LIST_TAIL, "-ds_id", 0,
             "define request ds_id", NULL); 
-    psMetadataAddStr(addreqArgs, PS_LIST_TAIL, "-out_fileset", 0,
-            "define request output_fileset", NULL); 
 
     // -pendingreq
@@ -113,4 +111,19 @@
     psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-state", 0,
             "new state", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-outProduct", 0,
+            "define request outProduct", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-fault", 0,
+            "define request fault code", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-uri", 0,
+            "define the uri", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-name", 0,
+            "define the name", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-reqType", 0,
+            "define the reqType", NULL); 
+
+    // -revertreq
+    psMetadata *revertreqArgs = psMetadataAlloc();
+    psMetadataAddS64(revertreqArgs, PS_LIST_TAIL, "-req_id", 0,
+            "req_id for which to revert", 0); 
 
     // -addjob
@@ -120,4 +133,6 @@
     psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-req_id", 0,
             "define job req_id", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-rownum", 0,
+            "define job rownum", NULL); 
     psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-job_type", 0,
             "define job job_type", NULL); 
@@ -128,5 +143,5 @@
     psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-state", 0,
             "new state", NULL); 
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-result", 0,
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-fault", 0,
             "new result", NULL); 
 
@@ -157,5 +172,5 @@
     psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-state", 0,
             "new state", NULL); 
-    psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-result", 0,
+    psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-fault", 0,
             "new result", NULL); 
 
@@ -187,4 +202,5 @@
     PXOPT_ADD_MODE("-listreq",         "", PSTAMPTOOL_MODE_LISTREQ,      listreqArgs);
     PXOPT_ADD_MODE("-completedreq",    "", PSTAMPTOOL_MODE_COMPLETEDREQ, completedreqArgs);
+    PXOPT_ADD_MODE("-revertreq",       "", PSTAMPTOOL_MODE_REVERTREQ,    revertreqArgs);
 
     PXOPT_ADD_MODE("-addjob",          "", PSTAMPTOOL_MODE_ADDJOB,       addjobArgs);
