Index: branches/tap_branches/ippTools/src/pxtools.c
===================================================================
--- branches/tap_branches/ippTools/src/pxtools.c	(revision 25900)
+++ branches/tap_branches/ippTools/src/pxtools.c	(revision 27838)
@@ -61,5 +61,5 @@
         if (!state) {
             psError(PS_ERR_PROGRAMMING, false, "%s not found in row %ld of table %s",
-		    columnName, i, tableName);
+                    columnName, i, tableName);
             return false;
         }
@@ -70,5 +70,5 @@
             // if state isn't cleaned or full we can't set it to cleaned
             psError(PS_ERR_PROGRAMMING, true, "%s with state %s may not be exported cleaned",
-		    tableName, state);
+                    tableName, state);
             return false;
         }
@@ -90,19 +90,19 @@
     psAssert (entry, "%s should at least have a place-holder", name);
     if (entry->data.str) {
-	psListIterator *iter = psListIteratorAlloc (item->data.list, PS_LIST_HEAD, true);
-	psMetadataItem *item = NULL;
-	while ((item = psListGetAndIncrement(iter))) {
-	    // need to change the name and comment
-	    psFree (item->name);
-	    item->name = psStringCopy (field);
-	    psFree (item->comment);
-	    item->comment = psStringCopy (op);
-	    if (!psMetadataAddItem(where, item, PS_LIST_TAIL, PS_META_DUPLICATE_OK)) {
-		psError(PS_ERR_UNKNOWN, false, "failed to add item %s", field);
-		psFree(where);
-		return false;
-	    }
-	}
-	psFree (iter);
+        psListIterator *iter = psListIteratorAlloc (item->data.list, PS_LIST_HEAD, true);
+        psMetadataItem *item = NULL;
+        while ((item = psListGetAndIncrement(iter))) {
+            // need to change the name and comment
+            psFree (item->name);
+            item->name = psStringCopy (field);
+            psFree (item->comment);
+            item->comment = psStringCopy (op);
+            if (!psMetadataAddItem(where, item, PS_LIST_TAIL, PS_META_DUPLICATE_OK)) {
+                psError(PS_ERR_UNKNOWN, false, "failed to add item %s", field);
+                psFree(where);
+                return false;
+            }
+        }
+        psFree (iter);
     }
     return true;
@@ -110,5 +110,5 @@
 
 // shared code for updating the various strings for a Run
-bool pxUpdateRun(pxConfig *config, psMetadata *where, psString *pQuery, psString table, bool has_dist_group)
+bool pxUpdateRun(pxConfig *config, psMetadata *where, psString *pQuery, psString runTable, psString idColumn, psString fileTable, bool has_dist_group)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -116,9 +116,12 @@
     PS_ASSERT_PTR_NON_NULL(pQuery, false);
     PS_ASSERT_PTR_NON_NULL(*pQuery, false);
+    PS_ASSERT_PTR_NON_NULL(runTable, false);
+    PS_ASSERT_PTR_NON_NULL(idColumn, false);
+    PS_ASSERT_PTR_NON_NULL(fileTable, false);
 
     // make sure that -state is not the only selection parameter
     PXOPT_LOOKUP_STR(where_state, config->args, "-state", false, false);
     if (where_state && (psListLength(where->list) < 2)) {
-        psError(PXTOOLS_ERR_DATA, true, "selection by -state alone is not allowed");
+        psError(PXTOOLS_ERR_CONFIG, true, "selection by -state alone is not allowed");
         return false;
     }
@@ -136,10 +139,10 @@
 
     if ((!state) && (!label) && (!data_group) && (has_dist_group && !dist_group) && !(note)) {
-        psError(PXTOOLS_ERR_DATA, false, "parameters are required");
+        psError(PXTOOLS_ERR_CONFIG, false, "parameters are required");
         return false;
     }
 
     if (state && ! pxIsValidState(state)) {
-        psError(PXTOOLS_ERR_DATA, false, "pxIsValidState failed");
+        psError(PXTOOLS_ERR_CONFIG, false, "pxIsValidState failed");
         return false;
     }
@@ -158,17 +161,34 @@
         } while (0)
 
-    addColumn(table, state);
-    addColumn(table, data_group);
+    addColumn(runTable, state);
+    addColumn(runTable, data_group);
     if (has_dist_group) {
-        addColumn(table, dist_group);
-    }
-    addColumn(table, note);
-    addColumn(table, label);
+        addColumn(runTable, dist_group);
+    }
+    addColumn(runTable, note);
+    addColumn(runTable, label);
+
+    psString joinHook = psStringCopy("");
+    psString fileWhere = NULL;
+    if (state && !strcmp(state, "update")) {
+        psStringAppend(&joinHook, "\n JOIN %s USING(%s)", fileTable, idColumn);
+        psStringAppend(pQuery, ", %s.data_state = 'update'", fileTable);
+        psStringAppend(&fileWhere, "AND %s.data_state = 'cleaned'", fileTable);
+    }
 
     psString whereClause =  psDBGenerateWhereSQL(where, NULL);
     psStringAppend(pQuery, " %s", whereClause);
     psFree(whereClause);
-
-    if (!p_psDBRunQuery(config->dbh, *pQuery)) {
+    if (fileWhere) {
+        psStringAppend(pQuery, "%s", fileWhere);
+    }
+
+    bool mdok;                          // Status of MD lookup
+    if (psMetadataLookupBool(&mdok, config->args, "-pretend")) {
+        psLogMsg("pxtools", PS_LOG_INFO, "Query to run: %s\n", *pQuery);
+        return true;
+    }
+
+    if (!p_psDBRunQueryF(config->dbh, *pQuery, joinHook)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
@@ -198,5 +218,5 @@
     }
     if (psArrayLength(output) > 1) {
-        psError(PS_ERR_UNKNOWN, true, "unexpected number of rows found in dbversion: %" PRId64,
+        psError(PS_ERR_UNKNOWN, true, "unexpected number of rows found in dbversion: %ld",
                 psArrayLength(output));
         return false;
@@ -221,5 +241,5 @@
         return NULL;
     }
-    
+
     psString version = psMetadataLookupStr(NULL, md, "schema_version");
 
@@ -257,5 +277,5 @@
         return false;
     }
-    
+
     psMetadataItem *dbversion = psListGet(multi_item->data.list, 0);
     if (!dbversion) {
@@ -272,5 +292,5 @@
             return false;
         }
-        
+
         psString import_version = psMetadataLookupStr(NULL, md, "schema_version");
         if (import_version && strcmp(import_version, schema_version)) {
