Index: branches/tap_branches/ippTools/src/regtool.c
===================================================================
--- branches/tap_branches/ippTools/src/regtool.c	(revision 25900)
+++ branches/tap_branches/ippTools/src/regtool.c	(revision 27838)
@@ -37,4 +37,5 @@
 static bool revertprocessedimfileMode(pxConfig *config);
 static bool updateprocessedimfileMode(pxConfig *config);
+static bool pendingcompressimfileMode(pxConfig *config);
 // exp
 static bool pendingexpMode(pxConfig *config);
@@ -44,4 +45,8 @@
 static bool updateprocessedexpMode(pxConfig *config);
 static bool cleardupexpMode(pxConfig *config);
+static bool finishcompressexpMode(pxConfig *config);
+
+static bool updatebyqueryMode(pxConfig *config);
+
 static bool exportrunMode(pxConfig *config);
 static bool importrunMode(pxConfig *config);
@@ -77,4 +82,7 @@
         MODECASE(REGTOOL_MODE_REVERTPROCESSEDEXP,    revertprocessedexpMode);
         MODECASE(REGTOOL_MODE_UPDATEPROCESSEDEXP,    updateprocessedexpMode);
+        MODECASE(REGTOOL_MODE_UPDATEBYQUERY,         updatebyqueryMode);
+        MODECASE(REGTOOL_MODE_PENDINGCOMPRESSIMFILE, pendingcompressimfileMode);
+        MODECASE(REGTOOL_MODE_FINISHCOMPRESSEXP,     finishcompressexpMode);
         MODECASE(REGTOOL_MODE_CLEARDUPEXP,           cleardupexpMode);
         MODECASE(REGTOOL_MODE_EXPORTRUN,             exportrunMode);
@@ -117,5 +125,5 @@
     psString query = pxDataGet("regtool_pendingimfile.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -189,4 +197,5 @@
     PXOPT_LOOKUP_STR(obs_mode, config->args, "-obs_mode", false, false);
     PXOPT_LOOKUP_STR(obs_group, config->args, "-obs_group", false, false);
+    PXOPT_LOOKUP_STR(data_state, config->args, "-data_state", false, false);
 
     PXOPT_LOOKUP_F32(airmass, config->args, "-airmass", false, false);
@@ -255,4 +264,5 @@
         class_id,
         uri,
+        data_state,
         exp_type,
         filelevel,
@@ -333,11 +343,15 @@
     PXOPT_COPY_TIME(config->args, where, "-dateobs_begin", "dateobs",  ">=");
     PXOPT_COPY_TIME(config->args, where, "-dateobs_end",   "dateobs",  "<=");
-    PXOPT_COPY_STR(config->args, where,  "-filter",        "filter", "==");
+    PXOPT_COPY_STR(config->args, where,  "-filter",        "filter", "LIKE");
     PXOPT_COPY_STR(config->args, where,  "-exp_type",      "exp_type", "==");
     PXOPT_COPY_STR(config->args, where,  "-obs_mode",      "obs_mode", "==");
-    PXOPT_COPY_S64(config->args, where,  "-magicked",      "magicked", "==");
+    PXOPT_COPY_STR(config->args, where,  "-data_state",    "data_state", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
+    PXOPT_LOOKUP_BOOL(allfiles, config->args, "-allfiles", false);
+    if (allfiles) {
+        faulted = false;
+    }
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
@@ -347,9 +361,9 @@
     psString where2 = NULL;
     if (!pxmagicAddWhere(config, &where2, "rawImfile")) {
-        psError(PXTOOLS_ERR_DATA, false, "pxSpaceAddWhere failed");
+        psError(psErrorCodeLast(), false, "pxmagicAddWhere failed");
         return false;
     }
     if (!pxspaceAddWhere(config, &where2, "rawImfile")) {
-        psError(PXTOOLS_ERR_DATA, false, "pxSpaceAddWhere failed");
+        psError(psErrorCodeLast(), false, "pxspaceAddWhere failed");
         return false;
     }
@@ -357,5 +371,5 @@
     psString query = pxDataGet("regtool_processedimfile.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         psFree(where);
         return false;
@@ -367,5 +381,5 @@
         psFree(whereClause);
     } else if (!all && !where2) {
-        psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
+        psError(PXTOOLS_ERR_CONFIG, false, "search parameters are required");
         return false;
     }
@@ -379,5 +393,5 @@
         // list only faulted rows
         psStringAppend(&query, " %s", "AND rawImfile.fault != 0");
-    } else {
+    } else if (!allfiles) {
         // don't list faulted rows
         psStringAppend(&query, " %s", "AND rawImfile.fault = 0");
@@ -452,5 +466,5 @@
     psString query = pxDataGet("regtool_revertprocessedimfile.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         psFree(where);
         return false;
@@ -463,5 +477,5 @@
     } else {
         psFree(where);
-        psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
+        psError(PXTOOLS_ERR_CONFIG, false, "search parameters are required");
         return false;
     }
@@ -491,12 +505,14 @@
 
     PXOPT_LOOKUP_S16(fault, config->args, "-fault",   false, false);
-/*     PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false); */
     PXOPT_LOOKUP_S16(burntool_state, config->args, "-burntool_state", false, false);
-    
-    if ((fault == INT16_MAX) && !isfinite(burntool_state)) { 
-        psError(PS_ERR_UNKNOWN, false, "one of -fault or -burntool_state must be selected");
-        return false;
-    }
-    if ((fault != INT16_MAX) && isfinite(burntool_state)) { 
+    PXOPT_LOOKUP_S32(set_bytes, config->args, "-set_bytes", false, false);
+    PXOPT_LOOKUP_STR(set_md5sum, config->args, "-set_md5sum", false, false);
+    PXOPT_LOOKUP_STR(set_state, config->args, "-set_state", false, false);
+
+    if ((fault == INT16_MAX) && !isfinite(burntool_state) && !(set_state)) {
+        psError(PS_ERR_UNKNOWN, false, "one of -fault or -burntool_state or -set_state must be selected");
+        return false;
+    }
+    if ((fault != INT16_MAX) && isfinite(burntool_state)) {
         psError(PS_ERR_UNKNOWN, false, "only one of -fault or -burntool_state must be selected");
         return false;
@@ -508,29 +524,141 @@
 
     if (fault != INT16_MAX) {
-	// this is fairly dangerous : can set all if the where is not set...
-	if (!pxSetFaultCode(config->dbh, "rawImfile", where, fault)) {
-	    psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
-	    psFree (where);
-	    return false;
-	}
-    }
-
-    if (isfinite(burntool_state)) {
-	psString query = pxDataGet("regtool_updateprocessedimfile.sql");
-	if (!query) {
-	    psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-	    return false;
-	}
-
-	if (!p_psDBRunQueryF(config->dbh, query, burntool_state, exp_id, class_id)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	    psFree(query);
-	    return false;
-	}
-	psFree(query);
+        // this is fairly dangerous : can set all if the where is not set...
+        if (!pxSetFaultCode(config->dbh, "rawImfile", where, fault)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
+            psFree (where);
+            return false;
+        }
+        psFree (where);
+        return(true);
     }
     psFree (where);
 
+    psString setvalues = NULL;
+    if (burntool_state != INT16_MAX) {
+      psStringAppend(&setvalues,"rawImfile.burntool_state = %d",burntool_state);
+    }
+    if (set_bytes != INT32_MAX) {
+      if (setvalues) {
+        psStringAppend(&setvalues,",");
+      }
+      psStringAppend(&setvalues,"rawImfile.bytes = %d",set_bytes);
+    }
+    if (set_md5sum) {
+      if (setvalues) {
+        psStringAppend(&setvalues,",");
+      }
+      psStringAppend(&setvalues,"rawImfile.md5sum = '%s'",set_md5sum);
+    }
+    if (set_state) {
+      if (setvalues) {
+        psStringAppend(&setvalues,",");
+      }
+      psStringAppend(&setvalues,"rawImfile.data_state = '%s'",set_state);
+    }
+
+    psString query = pxDataGet("regtool_updateprocessedimfile.sql");
+    if (!query) {
+      psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+      return false;
+    }
+
+    //    printf(query,setvalues,exp_id,class_id);
+    if (!p_psDBRunQueryF(config->dbh, query, setvalues, exp_id,class_id)) {
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      psFree(query);
+      psFree(setvalues);
+      return false;
+    }
+    psFree(setvalues);
+    psFree(query);
+
     return true;
+}
+
+static bool pendingcompressimfileMode(pxConfig *config) {
+  PS_ASSERT_PTR_NON_NULL(config, false);
+
+  psMetadata *where = psMetadataAlloc();
+  PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
+  PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
+
+  psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+  if (whereClause) {
+    psStringPrepend(&whereClause, "\n AND ");
+  }
+  PXOPT_LOOKUP_BOOL(compress, config->args, "-compress", false);
+  PXOPT_LOOKUP_BOOL(clean,    config->args, "-clean", false);
+
+  if ((compress && clean) || (!compress && !clean)) {
+      psStringAppend(&whereClause, "\n AND ((data_state = 'goto_compressed' AND state = 'goto_compressed')\n  OR (data_state = 'goto_lossy' AND state = 'goto_lossy')) ");
+  }
+  else if (compress) {
+    psStringAppend(&whereClause, "\n AND ((data_state = 'goto_compressed' AND state = 'goto_compressed')) ");
+  }
+  else if (clean) {
+    psStringAppend(&whereClause, "\n AND ((data_state = 'goto_lossy' AND state = 'goto_lossy')) ");
+  }
+  else {
+    psStringAppend(&whereClause, "\n AND ((data_state = 'goto_compressed' AND state = 'goto_compressed')\n  OR (data_state = 'goto_lossy' AND state = 'goto_lossy')) ");
+  }
+
+  PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+  PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+  psString query = pxDataGet("regtool_pendingcompressimfile.sql");
+  if (!query) {
+    psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+    return(false);
+  }
+  psString limitString = NULL;
+  if (limit) {
+    limitString = psDBGenerateLimitSQL(limit);
+    psStringPrepend(&limitString, "\n");
+  }
+  //  printf(query,whereClause,limitString);
+  if (!p_psDBRunQueryF(config->dbh, query, whereClause, limitString ? limitString : "")) {
+    psError(PXTOOLS_ERR_PROG, false, "database error");
+    psFree(limitString);
+    psFree(query);
+    psFree(whereClause);
+    psFree(where);
+    return(false);
+  }
+  psFree(limitString);
+  psFree(query);
+  psFree(whereClause);
+  psFree(where);
+
+  psArray *output = p_psDBFetchResult(config->dbh);
+  if (!output) {
+    psErrorCode err = psErrorCodeLast();
+    switch (err) {
+    case PS_ERR_DB_CLIENT:
+      psError(PXTOOLS_ERR_SYS, false, "database error");
+    case PS_ERR_DB_SERVER:
+      psError(PXTOOLS_ERR_PROG, false, "database error");
+    default:
+      psError(PXTOOLS_ERR_PROG, false, "unknown error");
+    }
+
+    return false;
+  }
+  if (!psArrayLength(output)) {
+    psTrace("regtool", PS_LOG_INFO, "no rows found");
+    psFree(output);
+    return true;
+  }
+
+  // negate simple so the default is true
+  if (!ippdbPrintMetadatas(stdout, output, "regPendingCompressImfile", !simple)) {
+    psError(PXTOOLS_ERR_PROG, false, "failed to print array");
+    psFree(output);
+    return false;
+  }
+
+  psFree(output);
+
+  return true;
 }
 
@@ -549,5 +677,5 @@
     psString query = pxDataGet("regtool_pendingexp.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -626,4 +754,5 @@
     PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
     PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", false, false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", false, false);
     PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", false, false);
@@ -687,5 +816,5 @@
     psString query = pxDataGet("regtool_pendingexp.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -787,4 +916,5 @@
         filelevel,
         workdir,
+        state,
         reduction,
         dvodb,
@@ -920,5 +1050,5 @@
     psString query = pxDataGet("regtool_processedexp.sql");
     if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -930,11 +1060,12 @@
     PXOPT_COPY_STR(config->args,   where,  "-inst", "camera", "==");
     PXOPT_COPY_STR(config->args,   where,  "-telescope", "telescope", "==");
-    PXOPT_COPY_TIME(config->args,  where, "-dateobs_begin", "dateobs", ">=");
-    PXOPT_COPY_TIME(config->args,  where, "-dateobs_end", "dateobs", "<=");
+    PXOPT_COPY_TIME(config->args,  where,  "-dateobs_begin", "dateobs", ">=");
+    PXOPT_COPY_TIME(config->args,  where,  "-dateobs_end", "dateobs", "<=");
+    PXOPT_COPY_STR(config->args,   where,  "-state", "state", "==");
     PXOPT_COPY_STR(config->args,   where,  "-exp_tag", "exp_tag", "==");
     PXOPT_COPY_STR(config->args,   where,  "-exp_type", "exp_type", "==");
     PXOPT_COPY_STR(config->args,   where,  "-filelevel", "filelevel", "==");
     PXOPT_COPY_STR(config->args,   where,  "-reduction", "reduction", "==");
-    PXOPT_COPY_STR(config->args,   where,  "-filter", "filter", "==");
+    PXOPT_COPY_STR(config->args,   where,  "-filter", "filter", "LIKE");
     PXOPT_COPY_F32(config->args,   where,  "-airmass_min", "airmass", ">=");
     PXOPT_COPY_F32(config->args,   where,  "-airmass_max", "airmass", "<");
@@ -965,4 +1096,14 @@
     PXOPT_COPY_F32(config->args,   where,  "-sun_angle_max", "sun_angle", "<");
 
+    psString where2 = NULL;
+    if (!pxmagicAddWhere(config, &where2, "rawExp")) {
+        psError(psErrorCodeLast(), false, "pxmagicAddWhere failed");
+        return false;
+    }
+    if (!pxspaceAddWhere(config, &where2, "rawExp")) {
+        psError(psErrorCodeLast(), false, "pxSpaceAddWhere failed");
+        return false;
+    }
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -970,28 +1111,33 @@
 
     if (psListLength(where->list)) {
-        psString whereClause = psDBGenerateWhereConditionSQL(where, "rawExp");
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
+      psString whereClause = psDBGenerateWhereConditionSQL(where, "rawExp");
+      psStringAppend(&query, " AND %s", whereClause);
+      psFree(whereClause);
     }
     psFree(where);
 
+    if (where2) {
+        psStringAppend(&query, " %s ", where2);
+        psFree(where2);
+    }
+
     if (faulted) {
-        // list only faulted rows
-        psStringAppend(&query, " %s", "AND rawExp.fault != 0");
+      // list only faulted rows
+      psStringAppend(&query, " %s", "AND rawExp.fault != 0");
     } else {
-        // don't list faulted rows
-        psStringAppend(&query, " %s", "AND rawExp.fault = 0");
+      // don't list faulted rows
+      psStringAppend(&query, " %s", "AND rawExp.fault = 0");
     }
 
     // treat limit == 0 as "no limit"
     if (limit) {
-        psString limitString = psDBGenerateLimitSQL(limit);
-        psStringAppend(&query, " %s", limitString);
-        psFree(limitString);
+      psString limitString = psDBGenerateLimitSQL(limit);
+      psStringAppend(&query, " %s", limitString);
+      psFree(limitString);
     }
 
     if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return false;
     }
     psFree(query);
@@ -999,29 +1145,29 @@
     psArray *output = p_psDBFetchResult(config->dbh);
     if (!output) {
-        psErrorCode err = psErrorCodeLast();
-        switch (err) {
-            case PS_ERR_DB_CLIENT:
-                psError(PXTOOLS_ERR_SYS, false, "database error");
-            case PS_ERR_DB_SERVER:
-                psError(PXTOOLS_ERR_PROG, false, "database error");
-            default:
-                psError(PXTOOLS_ERR_PROG, false, "unknown error");
-        }
-
-        return false;
+      psErrorCode err = psErrorCodeLast();
+      switch (err) {
+      case PS_ERR_DB_CLIENT:
+        psError(PXTOOLS_ERR_SYS, false, "database error");
+      case PS_ERR_DB_SERVER:
+        psError(PXTOOLS_ERR_PROG, false, "database error");
+      default:
+        psError(PXTOOLS_ERR_PROG, false, "unknown error");
+      }
+
+      return false;
     }
     if (!psArrayLength(output)) {
-        psTrace("regtool", PS_LOG_INFO, "no rows found");
+      psTrace("regtool", PS_LOG_INFO, "no rows found");
+      psFree(output);
+      return true;
+    }
+
+    if (psArrayLength(output)) {
+      // negative simple so the default is true
+      if (!ippdbPrintMetadatas(stdout, output, "rawExp", !simple)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print array");
         psFree(output);
-        return true;
-    }
-
-    if (psArrayLength(output)) {
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "rawExp", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
+        return false;
+      }
     }
 
@@ -1033,42 +1179,42 @@
 static bool revertprocessedexpMode(pxConfig *config)
 {
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psMetadata *where = psMetadataAlloc();
-    PXOPT_COPY_S64(config->args, where,  "-exp_id",       "exp_id", "==");
-    PXOPT_COPY_S16(config->args, where,  "-fault",         "fault", "==");
-    PXOPT_COPY_S64(config->args, where,  "-exp_id_begin", "exp_id", ">=");
-    PXOPT_COPY_S64(config->args, where,  "-exp_id_end", "exp_id", "<=");
-
-    psString query = pxDataGet("regtool_revertprocessedexp.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        psFree(where);
-        return false;
-    }
-
-    if (psListLength(where->list)) {
-        psString whereClause = psDBGenerateWhereConditionSQL(where, "rawExp");
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    } else {
-        psFree(where);
-        psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
-        return false;
-    }
+  PS_ASSERT_PTR_NON_NULL(config, false);
+
+  psMetadata *where = psMetadataAlloc();
+  PXOPT_COPY_S64(config->args, where,  "-exp_id",       "exp_id", "==");
+  PXOPT_COPY_S16(config->args, where,  "-fault",         "fault", "==");
+  PXOPT_COPY_S64(config->args, where,  "-exp_id_begin", "exp_id", ">=");
+  PXOPT_COPY_S64(config->args, where,  "-exp_id_end", "exp_id", "<=");
+
+  psString query = pxDataGet("regtool_revertprocessedexp.sql");
+  if (!query) {
+    psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
     psFree(where);
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
+    return false;
+  }
+
+  if (psListLength(where->list)) {
+    psString whereClause = psDBGenerateWhereConditionSQL(where, "rawExp");
+    psStringAppend(&query, " AND %s", whereClause);
+    psFree(whereClause);
+  } else {
+    psFree(where);
+    psError(PXTOOLS_ERR_CONFIG, false, "search parameters are required");
+    return false;
+  }
+  psFree(where);
+
+  if (!p_psDBRunQuery(config->dbh, query)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
     psFree(query);
-
-    int numUpdated = psDBAffectedRows(config->dbh);
-
-    psLogMsg("regtool", PS_LOG_INFO, "Updated %d rawExp", numUpdated);
-
-    return true;
+    return false;
+  }
+  psFree(query);
+
+  int numUpdated = psDBAffectedRows(config->dbh);
+
+  psLogMsg("regtool", PS_LOG_INFO, "Updated %d rawExp", numUpdated);
+
+  return true;
 }
 
@@ -1076,20 +1222,207 @@
 static bool updateprocessedexpMode(pxConfig *config)
 {
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psMetadata *where = psMetadataAlloc();
-    PXOPT_COPY_S64(config->args, where,  "-exp_id",       "exp_id", "==");
-
-    PXOPT_LOOKUP_S16(fault, config->args, "-fault", true, false);
-
-    if (!pxSetFaultCode(config->dbh, "rawExp", where, fault)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
-        psFree(where);
-        return false;
-    }
+  PS_ASSERT_PTR_NON_NULL(config, false);
+
+  psMetadata *where = psMetadataAlloc();
+  PXOPT_COPY_S64(config->args, where,  "-exp_id",       "exp_id", "==");
+
+  PXOPT_LOOKUP_S16(fault, config->args, "-fault", true, false);
+
+  if (!pxSetFaultCode(config->dbh, "rawExp", where, fault)) {
+    psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
     psFree(where);
-
-    return true;
-}
+    return false;
+  }
+  psFree(where);
+
+  return true;
+}
+
+
+static bool finishcompressexpMode(pxConfig *config) {
+
+  PS_ASSERT_PTR_NON_NULL(config, false);
+
+  PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+
+  psMetadata *where = psMetadataAlloc();
+  PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
+
+  PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+  psString query = pxDataGet("regtool_finishcompressexp.sql");
+  if (!query) {
+    psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+    return(false);
+  }
+  if (where && psListLength(where->list)) {
+    psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+    psStringAppend(&query, " %s ", whereClause);
+    psFree(whereClause);
+  }
+  psFree(where);
+
+  if (limit) {
+    psString limitString = psDBGenerateLimitSQL(limit);
+    psStringAppend(&query, " %s ", limitString);
+    psFree(limitString);
+  }
+  //  printf(query);
+  //  return(false);
+  if (!p_psDBRunQuery(config->dbh, query)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+    psFree(query);
+    return(false);
+  }
+  psFree(query);
+
+  psArray *output = p_psDBFetchResult(config->dbh);
+  if (!output) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+    return(false);
+  }
+  if (!psArrayLength(output)) {
+    psTrace("chiptool", PS_LOG_INFO, "no rows found");
+    psFree(output);
+    return(true);
+  }
+
+  for (long i = 0; i < psArrayLength(output); i++) {
+    psMetadata *md = output->data[i];
+
+    rawExpRow *row = rawExpObjectFromMetadata(md);
+    if (!psDBTransaction(config->dbh)) {
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return(false);
+    }
+
+    if (strcmp(row->state,"goto_compressed") == 0) {
+      if (!pxrawExpSetState(config,row->exp_id, "compressed")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to set rawExp.state for exp_id: %" PRId64, row->exp_id);
+        psFree(row);
+        psFree(output);
+        return(false);
+      }
+    }
+    else if (strcmp(row->state,"goto_lossy") == 0) {
+      if (!pxrawExpSetState(config,row->exp_id, "lossy")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to set rawExp.state for exp_id: %" PRId64, row->exp_id);
+        psFree(row);
+        psFree(output);
+        return(false);
+      }
+    }
+    if (!psDBCommit(config->dbh)) {
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      return false;
+    }
+    psFree(row);
+  }
+
+  psFree(output);
+  return(true);
+}
+
+static bool updatebyqueryMode(pxConfig *config) {
+  PS_ASSERT_PTR_NON_NULL(config, false);
+
+  PXOPT_LOOKUP_STR(set_state, config->args, "-set_state", true, false);
+
+  // XX test this out; need to make this consistent with the list in regtoolConfig.c
+  psMetadata *where = psMetadataAlloc();
+  PXOPT_COPY_S64(config->args,   where,  "-exp_id", "rawExp.exp_id", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-exp_name", "rawExp.exp_name", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-inst", "rawExp.camera", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-telescope", "rawExp.telescope", "==");
+  PXOPT_COPY_TIME(config->args,  where, "-dateobs_begin", "rawExp.dateobs", ">=");
+  PXOPT_COPY_TIME(config->args,  where, "-dateobs_end", "rawExp.dateobs", "<=");
+  PXOPT_COPY_STR(config->args,   where,  "-exp_tag", "rawExp.exp_tag", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-exp_type", "rawExp.exp_type", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-filelevel", "rawExp.filelevel", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-state",     "rawExp.state", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-reduction", "rawExp.reduction", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-filter", "rawExp.filter", "==");
+  PXOPT_COPY_F32(config->args,   where,  "-airmass_min", "rawExp.airmass", ">=");
+  PXOPT_COPY_F32(config->args,   where,  "-airmass_max", "rawExp.airmass", "<");
+  PXOPT_COPY_RADEC(config->args, where,  "-ra_min", "rawExp.ra", ">=");
+  PXOPT_COPY_RADEC(config->args, where,  "-ra_max", "rawExp.ra", "<");
+  PXOPT_COPY_RADEC(config->args, where,  "-decl_min", "rawExp.decl", ">=");
+  PXOPT_COPY_RADEC(config->args, where,  "-decl_max", "rawExp.decl", "<");
+  PXOPT_COPY_F32(config->args,   where,  "-exp_time_min", "rawExp.exp_time", ">=");
+  PXOPT_COPY_F32(config->args,   where,  "-exp_time_max", "rawExp.exp_time", "<");
+  PXOPT_COPY_F32(config->args,   where,  "-sat_pixel_frac_min", "rawExp.sat_pixel_frac", ">=");
+  PXOPT_COPY_F32(config->args,   where,  "-sat_pixel_frac_max", "rawExp.sat_pixel_frac", "<");
+  PXOPT_COPY_F64(config->args,   where,  "-bg_min", "rawExp.bg", ">=");
+  PXOPT_COPY_F64(config->args,   where,  "-bg_max", "rawExp.bg", "<");
+  PXOPT_COPY_F64(config->args,   where,  "-bg_stdev_min", "rawExp.bg_stdev", ">=");
+  PXOPT_COPY_F64(config->args,   where,  "-bg_stdev_max", "rawExp.bg_stdev", "<");
+  PXOPT_COPY_F64(config->args,   where,  "-bg_mean_stdev_min", "rawExp.bg_mean_stdev", ">=");
+  PXOPT_COPY_F64(config->args,   where,  "-bg_mean_stdev_max", "rawExp.bg_mean_stdev", "<");
+  PXOPT_COPY_F64(config->args,   where,  "-alt_min", "rawExp.alt", ">=");
+  PXOPT_COPY_F64(config->args,   where,  "-alt_max", "rawExp.alt", "<");
+  PXOPT_COPY_F64(config->args,   where,  "-az_min", "rawExp.az", ">=");
+  PXOPT_COPY_F64(config->args,   where,  "-az_max", "rawExp.az", "<");
+  PXOPT_COPY_F64(config->args,   where,  "-ccd_temp_min", "rawExp.ccd_temp", ">=");
+  PXOPT_COPY_F64(config->args,   where,  "-ccd_temp_max", "rawExp.ccd_temp", "<");
+  PXOPT_COPY_F64(config->args,   where,  "-posang_min", "rawExp.posang", ">=");
+  PXOPT_COPY_F64(config->args,   where,  "-posang_max", "rawExp.posang", "<");
+  PXOPT_COPY_F32(config->args,   where,  "-sun_angle_min", "rawExp.sun_angle", ">=");
+  PXOPT_COPY_F32(config->args,   where,  "-sun_angle_max", "rawExp.sun_angle", "<");
+  PXOPT_COPY_STR(config->args,   where,  "-object", "rawExp.object", "==");
+  PXOPT_COPY_STR(config->args,   where,  "-comment", "rawExp.comment", "LIKE");
+  PXOPT_COPY_STR(config->args,   where,  "-obs_mode", "rawExp.obs_mode", "LIKE");
+
+
+  psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+  psStringPrepend(&whereClause,"\n AND ");
+  PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+  PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+  psString limitString = NULL;
+  if (limit) {
+    limitString = psDBGenerateLimitSQL(limit);
+    psStringPrepend(&limitString, "\n");
+  }
+  // Update the imfiles first, because if you select by state, you'll clobber things
+  psString query = pxDataGet("regtool_updatebyqueryimfile.sql");
+  if (!query) {
+    psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+    return(false);
+  }
+
+  //  printf(query,set_state,whereClause,limitString);
+  if (!p_psDBRunQueryF(config->dbh, query, set_state, whereClause, limitString ? limitString : "")) {
+    psError(PXTOOLS_ERR_PROG, false, "database error");
+    psFree(limitString);
+    psFree(query);
+    psFree(whereClause);
+    psFree(where);
+    return(false);
+  }
+
+  psFree(query);
+  // Now up date the exposure.
+  query = pxDataGet("regtool_updatebyquery.sql");
+  if (!query) {
+    psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+    return(false);
+  }
+  if (!p_psDBRunQueryF(config->dbh, query, set_state,whereClause, limitString ? limitString : "")) {
+    psError(PXTOOLS_ERR_PROG, false, "database error");
+    psFree(limitString);
+    psFree(query);
+    psFree(whereClause);
+    psFree(where);
+    return(false);
+  }
+
+  psFree(limitString);
+  psFree(query);
+  psFree(whereClause);
+  psFree(where);
+
+  return true;
+}
+
 
 
@@ -1111,5 +1444,5 @@
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -1137,5 +1470,5 @@
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
         return false;
     }
@@ -1218,4 +1551,9 @@
   }
 
+  if (!pxExportVersion(config, f)) {
+    psError(PS_ERR_UNKNOWN, false, "failed to write dbversion to output file");
+    return false;
+  }
+
   psMetadata *where = psMetadataAlloc();
   PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
@@ -1229,5 +1567,5 @@
     psString query = pxDataGet(tables[i].sqlFilename);
     if (!query) {
-      psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+      psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
       return false;
     }
@@ -1287,4 +1625,10 @@
 
   psMetadata *input = psMetadataConfigRead (NULL, &nFail, infile, false);
+
+  if (!pxCheckImportVersion(config, input)) {
+    psError(PS_ERR_UNKNOWN, false, "pxCheckImportVersion failed");
+    return false;
+  }
+
 
   fprintf (stdout, "---- input ----\n");
