Index: /branches/cleanup/ippTools/scripts/regtest.sh
===================================================================
--- /branches/cleanup/ippTools/scripts/regtest.sh	(revision 18356)
+++ /branches/cleanup/ippTools/scripts/regtest.sh	(revision 18357)
@@ -9,4 +9,6 @@
 
 exp_id1=`$inject -newExp -tmp_exp_name t10 -tmp_inst gpc -tmp_telescope ps1 -workdir file::///some/path -reduction batman -simple` || exit 1
+
+echo $exp_id1
 
 for ID in `seq 0 3`; do
@@ -34,4 +36,5 @@
 
 $regtool -addprocessedexp -exp_id $exp_id1 -exp_name t10 -inst gpc -telescope ps1 -exp_tag batman.t10 -filelevel OTA -filter r -airmass 10 -ra 1 -decl 2 -exp_type object -exp_time 0 -bg 10 -bg_stdev 1 -bg_mean_stdev 10 -alt 10 -az 10 -ccd_temp 45 -posang 10 -object dog -dateobs "2006-10-20T10:10:10Z" -label foobar -tess_id moldyshoe $* || exit 1
+# use BIAS or OBJECT? $regtool -addprocessedexp -exp_id $exp_id1 -exp_name t10 -inst gpc -telescope ps1 -exp_tag batman.t10 -filelevel OTA -filter r -airmass 10 -ra 1 -decl 2 -exp_type bias -exp_time 0 -bg 10 -bg_stdev 1 -bg_mean_stdev 10 -alt 10 -az 10 -ccd_temp 45 -posang 10 -object dog -dateobs "2006-10-20T10:10:10Z" -label foobar -tess_id moldyshoe $* || exit 1
 
 $regtool -pendingimfile || exit 1
@@ -44,2 +47,3 @@
 
 $regtool -addprocessedexp -exp_id $exp_id2 -exp_name t11 -inst gpc -telescope ps1 -exp_tag batman.t11 -filelevel OTA -filter r -airmass 11 -ra 1 -decl 2 -exp_type object -exp_time 0 -bg 11 -bg_stdev 1 -bg_mean_stdev 11 -alt 11 -az 11 -ccd_temp 45 -posang 11 -object dog -dateobs 2006-10-20T10:10:10Z -label foobar -tess_id moldyshoe $* || exit 1
+# BIAS or OBJECT? $regtool -addprocessedexp -exp_id $exp_id2 -exp_name t11 -inst gpc -telescope ps1 -exp_tag batman.t11 -filelevel OTA -filter r -airmass 11 -ra 1 -decl 2 -exp_type bias -exp_time 0 -bg 11 -bg_stdev 1 -bg_mean_stdev 11 -alt 11 -az 11 -ccd_temp 45 -posang 11 -object dog -dateobs 2006-10-20T10:10:10Z -label foobar -tess_id moldyshoe $* || exit 1
Index: /branches/cleanup/ippTools/share/Makefile.am
===================================================================
--- /branches/cleanup/ippTools/share/Makefile.am	(revision 18356)
+++ /branches/cleanup/ippTools/share/Makefile.am	(revision 18357)
@@ -74,6 +74,10 @@
 	pztool_pendingimfile.sql \
 	pztool_revertcopied.sql \
+	pztool_revert_downloadimfile_faults.sql \
+	pztool_revert_fileset_faults.sql \
+	regtool_create_dup_table.sql \
 	regtool_pendingexp.sql \
 	regtool_pendingimfile.sql \
+	regtool_populate_dup_table.sql \
 	regtool_processedexp.sql \
 	regtool_processedimfile.sql \
Index: /branches/cleanup/ippTools/share/chiptool_pendingcleanuprun.sql
===================================================================
--- /branches/cleanup/ippTools/share/chiptool_pendingcleanuprun.sql	(revision 18356)
+++ /branches/cleanup/ippTools/share/chiptool_pendingcleanuprun.sql	(revision 18357)
@@ -1,5 +1,9 @@
 SELECT
-    chipRun.*
+    chipRun.chip_id,
+    rawExp.camera,
+    chipRun.state
 FROM chipRun
+JOIN rawExp 
+USING (exp_id)
 WHERE
     chipRun.state = 'goto_cleaned'
Index: /branches/cleanup/ippTools/share/pztool_pendingimfile.sql
===================================================================
--- /branches/cleanup/ippTools/share/pztool_pendingimfile.sql	(revision 18356)
+++ /branches/cleanup/ippTools/share/pztool_pendingimfile.sql	(revision 18357)
@@ -18,5 +18,3 @@
         AND pzDownloadImfile.class IS NULL
         AND pzDownloadImfile.class_id IS NULL
-    ORDER BY
-        summitExp.dateobs
 ) as Foo
Index: /branches/cleanup/ippTools/share/pztool_revert_downloadimfile_faults.sql
===================================================================
--- /branches/cleanup/ippTools/share/pztool_revert_downloadimfile_faults.sql	(revision 18357)
+++ /branches/cleanup/ippTools/share/pztool_revert_downloadimfile_faults.sql	(revision 18357)
@@ -0,0 +1,17 @@
+DELETE FROM pzDownloadImfile
+WHERE
+    fault != 0
+    -- fault was logged in the last 3 days
+    AND ABS(TIMESTAMPDIFF(SECOND, epoch, NOW())) < 86400 * 3
+    AND (
+        -- HTTP 503: try again
+        fault = 203
+        -- HTTP 500: timeout
+        OR fault = 200
+        -- HTTP 404: unknown datastore internal problem
+        OR fault = 104
+        -- ipptool errors
+        OR fault < 100
+        -- perl untrapped die()
+        OR fault = 255
+    )
Index: /branches/cleanup/ippTools/share/pztool_revert_fileset_faults.sql
===================================================================
--- /branches/cleanup/ippTools/share/pztool_revert_fileset_faults.sql	(revision 18357)
+++ /branches/cleanup/ippTools/share/pztool_revert_fileset_faults.sql	(revision 18357)
@@ -0,0 +1,15 @@
+UPDATE summitExp SET fault = 0
+WHERE
+    fault != 0
+    -- fault was logged in the last 3 days
+    AND ABS(TIMESTAMPDIFF(SECOND, epoch, NOW())) < 86400 * 3
+    AND (
+        -- HTTP 500: timeout
+        fault = 200
+        -- HTTP 404: unknown datastore internal problem
+        OR fault = 104
+        -- ipptool errors
+        OR fault < 100
+        -- perl untrapped die()
+        OR fault = 255
+    )
Index: /branches/cleanup/ippTools/share/regtool_create_dup_table.sql
===================================================================
--- /branches/cleanup/ippTools/share/regtool_create_dup_table.sql	(revision 18357)
+++ /branches/cleanup/ippTools/share/regtool_create_dup_table.sql	(revision 18357)
@@ -0,0 +1,2 @@
+CREATE TEMPORARY TABLE duplicate (exp_id BIGINT, PRIMARY KEY(exp_id))
+ENGINE=MEMORY
Index: /branches/cleanup/ippTools/share/regtool_populate_dup_table.sql
===================================================================
--- /branches/cleanup/ippTools/share/regtool_populate_dup_table.sql	(revision 18357)
+++ /branches/cleanup/ippTools/share/regtool_populate_dup_table.sql	(revision 18357)
@@ -0,0 +1,13 @@
+INSERT INTO duplicate
+SELECT exp_id FROM
+    (
+        SELECT
+        MAX(exp_id) AS exp_id,
+--            tmp_exp_name,
+--            tmp_camera,
+--            tmp_telescope,
+        count(exp_id) AS count
+        FROM newExp
+        GROUP BY tmp_exp_name, tmp_camera, tmp_telescope
+        HAVING count > 1
+    ) as Foo
Index: /branches/cleanup/ippTools/src/Makefile.am
===================================================================
--- /branches/cleanup/ippTools/src/Makefile.am	(revision 18356)
+++ /branches/cleanup/ippTools/src/Makefile.am	(revision 18357)
@@ -30,5 +30,4 @@
 	pxdata.h \
 	pxfake.h \
-	pxio.h \
 	pxregister.h \
 	pxtag.h \
@@ -70,5 +69,4 @@
 	pxfake.c \
 	pxfault.c \
-	pxio.c \
 	pxregister.c \
 	pxtag.c \
Index: /branches/cleanup/ippTools/src/caltool.c
===================================================================
--- /branches/cleanup/ippTools/src/caltool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/caltool.c	(revision 18357)
@@ -152,10 +152,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "calDB", !simple)) {
@@ -247,10 +241,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "calRun", !simple)) {
Index: /branches/cleanup/ippTools/src/caltoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/caltoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/caltoolConfig.c	(revision 18357)
@@ -159,5 +159,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/camtool.c
===================================================================
--- /branches/cleanup/ippTools/src/camtool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/camtool.c	(revision 18357)
@@ -97,26 +97,7 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-
     psMetadata *where = psMetadataAlloc();
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -165,11 +146,11 @@
     }
 
-    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", true, false);
-    PXOPT_LOOKUP_STR(label, config->args, "-set_label", true, false);
-    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", true, false);
-    PXOPT_LOOKUP_STR(expgroup, config->args, "-set_expgroup", true, false);
-    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", true, false);
-    PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", true, false);
-    PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", true, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
+    PXOPT_LOOKUP_STR(expgroup, config->args, "-set_expgroup", false, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", false, false);
+    PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
+    PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", false, false);
 
     // find the exp_id of all the exposures that we want to queue up.
@@ -182,6 +163,6 @@
 
     if (where && psListLength(where->list)) {
-        psString whereClause = psDBGenerateWhereConditionSQL(where, "");
-        psStringAppend(&query, " AND %s", whereClause);
+        psString whereClause = psDBGenerateWhereSQL(where, NULL);
+        psStringAppend(&query, "%s", whereClause);
         psFree(whereClause);
     }
@@ -236,5 +217,5 @@
                     workdir     ? workdir   : row->workdir,
                     label       ? label     : row->label,
-                    reduction      ? reduction    : row->reduction,
+                    reduction   ? reduction : row->reduction,
                     expgroup    ? expgroup  : row->expgroup,
                     dvodb       ? dvodb     : row->dvodb,
@@ -268,36 +249,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(cam_id, config->args, "-cam_id", false, false);
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-
     psMetadata *where = psMetadataAlloc();
-    // convert cam_id into a psS64
-    if (cam_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "cam_id", 0, "==", (psS64)atoll(cam_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-cam_id", "cam_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -421,10 +374,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negate simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "camPendingExp", !simple)) {
@@ -475,10 +422,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negate simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "chipProcessedImfile", !simple)) {
@@ -498,5 +439,5 @@
 
     // required
-    PXOPT_LOOKUP_STR(cam_id, config->args, "-cam_id", true, false);
+    PXOPT_LOOKUP_S64(cam_id, config->args, "-cam_id", true, false);
     PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
@@ -554,5 +495,5 @@
         psMetadata *where = psMetadataAlloc();
         if (cam_id) {
-            if (!psMetadataAddS64(where, PS_LIST_TAIL, "cam_id", 0, "==", (psS64)atoll(cam_id))) {
+            if (!psMetadataAddS64(where, PS_LIST_TAIL, "cam_id", 0, "==", cam_id)) {
                 psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
                 psFree(where);
@@ -746,10 +687,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negate simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "camProcessedExp", !simple)) {
@@ -769,36 +704,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(cam_id, config->args, "-cam_id", false, false);
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-
     psMetadata *where = psMetadataAlloc();
-    // convert cam_id into a psS64
-    if (cam_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "cam_id", 0, "==", (psS64)atoll(cam_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-cam_id", "cam_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -977,10 +884,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "camMask", !simple)) {
Index: /branches/cleanup/ippTools/src/camtoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/camtoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/camtoolConfig.c	(revision 18357)
@@ -49,9 +49,9 @@
     psMetadata *definebydefinebyqueryArgs = psMetadataAlloc();
     // XXX need to allow multiple chip_ids
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", NULL);
+    psMetadataAddS64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-chip_id",  0,
+            "search by chip_id", 0);
     // XXX need to allow multiple exp_ids
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
+    psMetadataAddS64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", 0);
     psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_name",  0,
             "search by exp_name", NULL);
@@ -148,12 +148,12 @@
     psMetadata *updaterunArgs = psMetadataAlloc();
     // XXX need to allow multiple cam_ids
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-cam_id",  0,
-            "search by cam_id", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-cam_id",  0,
+            "search by cam_id", 0);
     // XXX need to allow multiple chip_ids
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-chip_id",  0,
+            "search by chip_id", 0);
     // XXX need to allow multiple exp_ids
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", 0);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_name",  0,
             "search by exp_name", NULL);
@@ -241,8 +241,8 @@
     // -pendingexp
     psMetadata *pendingexpArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", NULL);
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-chip_id", 0,
-            "search by chiptool ID", NULL);
+    psMetadataAddS64(pendingexpArgs, PS_LIST_TAIL, "-cam_id", 0,
+            "search by camtool ID", 0);
+    psMetadataAddS64(pendingexpArgs, PS_LIST_TAIL, "-chip_id", 0,
+            "search by chiptool ID", 0);
     psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -253,8 +253,8 @@
     // -pendingimfile
     psMetadata *pendingimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", NULL);
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-chip_id", 0,
-            "search by chiptool ID", NULL);
+    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-cam_id", 0,
+            "search by camtool ID", 0);
+    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-chip_id", 0,
+            "search by chiptool ID", 0);
     psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-class", 0,
             "search by class", NULL);
@@ -267,6 +267,6 @@
     // -addprocessedexp
     psMetadata *addprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "define camtool ID (required)", NULL);
+    psMetadataAddS64(addprocessedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
+            "define camtool ID (required)", 0);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-uri", 0,
             "define URI (required)", NULL);
@@ -328,8 +328,8 @@
     // -processedexp
     psMetadata *processedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(processedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", NULL);
-    psMetadataAddStr(processedexpArgs, PS_LIST_TAIL, "-chip_id", 0,
-            "search by chiptool ID", NULL);
+    psMetadataAddS64(processedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
+            "search by camtool ID", 0);
+    psMetadataAddS64(processedexpArgs, PS_LIST_TAIL, "-chip_id", 0,
+            "search by chiptool ID", 0);
     psMetadataAddU64(processedexpArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -342,12 +342,12 @@
     psMetadata *revertprocessedexpArgs = psMetadataAlloc();
     // XXX need to allow multiple cam_ids
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-cam_id",  0,
-            "search by cam_id", NULL);
+    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-cam_id",  0,
+            "search by cam_id", 0);
     // XXX need to allow multiple chip_ids
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", NULL);
+    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-chip_id",  0,
+            "search by chip_id", 0);
     // XXX need to allow multiple exp_ids
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
+    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", 0);
     psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_name",  0,
             "search by exp_name", NULL);
@@ -433,8 +433,8 @@
     // -updateprocessedexp
     psMetadata *updateprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(updateprocessedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", NULL);
-    psMetadataAddStr(updateprocessedexpArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chiptool ID", NULL);
+    psMetadataAddS64(updateprocessedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
+            "search by camtool ID", 0);
+    psMetadataAddS64(updateprocessedexpArgs, PS_LIST_TAIL, "-chip_id",  0,
+            "search by chiptool ID", 0);
     psMetadataAddStr(updateprocessedexpArgs, PS_LIST_TAIL, "-class",  0,
             "search by class", NULL);
@@ -574,5 +574,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/chiptool.c
===================================================================
--- /branches/cleanup/ippTools/src/chiptool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/chiptool.c	(revision 18357)
@@ -110,16 +110,8 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
+    PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", false, false);
 
     psMetadata *where = psMetadataAlloc();
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -158,4 +150,5 @@
     PXOPT_COPY_F32(config->args, where, "-solang_min", "solang", ">=");
     PXOPT_COPY_F32(config->args, where, "-solang_max", "solang", "<");
+    PXOPT_COPY_STR(config->args, where, "-comment", "comment", "LIKE");
 
     if (!psListLength(where->list)
@@ -266,26 +259,6 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_COPY_STR(config->args,  where, "-chip_id", "chip_id", "==");
-    PXOPT_COPY_STR(config->args,  where, "-exp_id", "exp_id", "==");
+    PXOPT_COPY_S64(config->args,  where, "-chip_id", "chip_id", "==");
+    PXOPT_COPY_S64(config->args,  where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args,  where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args,  where, "-inst", "camera", "==");
@@ -374,24 +347,6 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chipRun.chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "rawExp.exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chipRun.chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "rawExp.exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-class_id", "rawImfile.class_id", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "rawExp.telescope", "==");
@@ -436,10 +391,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "chipPendingImfile", !simple)) {
@@ -460,6 +409,6 @@
 
     // chip_id, ext_tag, class_id are required
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", true, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_S64(chip_id, config->args, "-chip_id", true, false);
+    PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", true, false);
     PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
 
@@ -501,6 +450,6 @@
 
     if (!chipProcessedImfileInsert(config->dbh,
-                                   (psS64)atoll(chip_id),
-                                   (psS64)atoll(exp_id),
+                                   chip_id,
+                                   exp_id,
                                    class_id,
                                    uri,
@@ -572,24 +521,6 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chipRun.chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "rawExp.exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chipRun.chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "rawExp.chip_id", "==");
     PXOPT_COPY_STR(config->args, where, "-class_id", "rawImfile.class_id", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "rawExp.telescope", "==");
@@ -642,10 +573,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "chipProcessedImfile", !simple)) {
@@ -665,24 +590,6 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -835,10 +742,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "chipMask", !simple)) {
@@ -908,10 +809,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "chipUnmask", !simple)) {
@@ -992,10 +887,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "chipPendingCleanupRun", !simple)) {
@@ -1063,10 +952,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "chipPendingCleanupImfile", !simple)) {
@@ -1130,10 +1013,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "chipDoneCleanup", !simple)) {
@@ -1203,10 +1080,4 @@
         psFree(output);
         return true;
-    }
-
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
     }
 
Index: /branches/cleanup/ippTools/src/chiptoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/chiptoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/chiptoolConfig.c	(revision 18357)
@@ -2,5 +2,5 @@
  * chiptoolConfig.c
  *
- * Copyright (C) 2006  Joshua Hoblitt
+ * Copyright (C) 2006-2008  Joshua Hoblitt
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -47,5 +47,5 @@
     psMetadata *definebyqueryArgs = psMetadataAlloc();
     // XXX need to allow multiple exp_ids
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp_id", NULL);
+    psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp_id", 0);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-exp_name",  0,            "search by exp_name", NULL);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-inst",  0,            "search for camera", NULL);
@@ -85,4 +85,6 @@
     psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-solang_min",  0,            "define min solar angle", NAN);
     psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-solang_max",  0,            "define max solar angle", NAN);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-comment",     0,        "search by comment field (LIKE comparison)", NULL);
+
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_workdir",  0,            "define workdir", NULL);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_label",  0,            "define label", NULL);
@@ -95,9 +97,8 @@
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
 
-
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-chip_id",              0,            "search by chip ID", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_id",                 0,            "search by exp_id", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-chip_id",              0,            "search by chip ID", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-exp_id",                 0,            "search by exp_id", 0);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_name",             0,            "search by exp_name", NULL);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-inst",                 0,            "search for camera", NULL);
@@ -146,6 +147,6 @@
     // -pendingimfile
     psMetadata *pendingimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-chip_id",  0,            "search by chip ID", NULL);
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", NULL);
+    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-chip_id",  0,            "search by chip ID", 0);
+    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", 0);
     psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search by class ID", NULL);
     psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-inst",  0,            "search by camera of interest", NULL);
@@ -156,6 +157,6 @@
     // -addprocessedimfile
     psMetadata *addprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-chip_id",  0,            "define chip ID (required)", NULL);
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "define exposure ID (required)", NULL);
+    psMetadataAddS64(addprocessedimfileArgs, PS_LIST_TAIL, "-chip_id",  0,            "define chip ID (required)", 0);
+    psMetadataAddS64(addprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "define exposure ID (required)", 0);
     psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "define class ID (required)", NULL);
     psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-uri",  0,            "define URL", NULL);
@@ -190,6 +191,6 @@
     // -processedimfile
     psMetadata *processedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-chip_id",  0,            "define chip ID", NULL);
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "define exposure ID", NULL);
+    psMetadataAddS64(processedimfileArgs, PS_LIST_TAIL, "-chip_id",  0,            "define chip ID", 0);
+    psMetadataAddS64(processedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "define exposure ID", 0);
     psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "define class ID", NULL);
     psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-inst",  0,            "define camera of interest", NULL);
@@ -201,6 +202,6 @@
     // -updateprocessedimfile
     psMetadata *updateprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(updateprocessedimfileArgs, PS_LIST_TAIL, "-chip_id",  0,            "search by chip ID", NULL);
-    psMetadataAddStr(updateprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", NULL);
+    psMetadataAddS64(updateprocessedimfileArgs, PS_LIST_TAIL, "-chip_id",  0,            "search by chip ID", 0);
+    psMetadataAddS64(updateprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", 0);
     psMetadataAddStr(updateprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search by class ID", NULL);
     psMetadataAddS16(updateprocessedimfileArgs, PS_LIST_TAIL, "-code",  0,            "set fault code (required)", 0);
@@ -208,6 +209,6 @@
     // -revertprocessedimfile
     psMetadata *revertprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-chip_id", 0,            "search by chip ID", NULL);
-    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp_id", NULL);
+    psMetadataAddS64(revertprocessedimfileArgs, PS_LIST_TAIL, "-chip_id", 0,            "search by chip ID", 0);
+    psMetadataAddS64(revertprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp_id", 0);
     psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-exp_name",  0,            "search by exp_name", NULL);
     psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-inst",  0,            "search for camera", NULL);
@@ -282,5 +283,5 @@
     psMetadataAddS64(pendingcleanupimfileArgs, PS_LIST_TAIL, "-chip_id", 0,
         "search by chip ID", 0);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_id",                 0,            "search by exp_id", NULL);
+    psMetadataAddStr(pendingcleanupimfileArgs, PS_LIST_TAIL, "-exp_id",                 0,            "search by exp_id", NULL);
     psMetadataAddBool(pendingcleanupimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
     psMetadataAddU64(pendingcleanupimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
@@ -345,5 +346,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/detselect.h
===================================================================
--- /branches/cleanup/ippTools/src/detselect.h	(revision 18356)
+++ /branches/cleanup/ippTools/src/detselect.h	(revision 18357)
@@ -31,3 +31,98 @@
 pxConfig *detselectConfig(pxConfig *config, int argc, char **argv);
 
+#define addWhereStr(name) \
+{ \
+    psString str = NULL; \
+    bool status = false; \
+    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define addWhereStrAlias(name,realname) \
+{ \
+    psString str = NULL; \
+    bool status = false; \
+    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #realname, 0, "==", str)) {\
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define addWhereS32(name) \
+{ \
+    psS32 s32 = 0; \
+    bool status = false; \
+    if ((s32= psMetadataLookupS32(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, #name, 0, "==", s32)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define addWhereF32(name) \
+{ \
+    psF32 var = 0; \
+    bool status = false; \
+    if ((var = psMetadataLookupF32(&status, config->args, "-" #name))) { \
+        if (!isnan(var)) { \
+            if (!psMetadataAddF32(config->where, PS_LIST_TAIL, #name, 0, "==", var)) { \
+                psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+                psFree(config); \
+                return NULL; \
+            } \
+        } \
+    } \
+}
+
+#define addWhereF64(name) \
+{ \
+    psF64 var = 0; \
+    bool status = false; \
+    if ((var = psMetadataLookupF64(&status, config->args, "-" #name))) { \
+        if (!isnan(var))  { \
+            if (!psMetadataAddF64(config->where, PS_LIST_TAIL, #name, 0, "==", var)) { \
+                psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+                psFree(config); \
+                return NULL; \
+            } \
+        } \
+    } \
+}
+
+#define addWhereTimeStr(name) \
+{ \
+    psString str = NULL; \
+    bool status = false; \
+    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
+        psTime *time = psTimeFromISO(str, PS_TIME_UTC); \
+        if (!time) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to convert " #name " into a psTime object"); \
+            psFree(config); \
+            return NULL; \
+        } \
+        psMetadataItem *item = psMetadataLookup(config->args, "-" #name); \
+        if (item) { \
+            str = item->comment; \
+        } else { \
+            str = NULL; \
+        } \
+        if (!psMetadataAddTime(config->where, PS_LIST_TAIL, #name, 0, str, time)) {\
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+        psFree(time); \
+    } \
+}
+
 #endif // DETSELECT_H
Index: /branches/cleanup/ippTools/src/detselectConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/detselectConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/detselectConfig.c	(revision 18357)
@@ -47,36 +47,38 @@
     psMetadata *searchArgs = psMetadataAlloc();
     psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-inst", 0,
-            "search by camera", NULL);
+                     "search by camera", NULL);
     psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-telescope", 0,
-            "search by telescope", NULL);
+                     "search by telescope", NULL);
     psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-det_type", 0,
-            "search by detrend type", NULL);
+                     "search by detrend type", NULL);
+    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-type", 0,
+                     "search by detrend type (alias for -det_type)", NULL);
     psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-filter", 0,
-            "search by filter", NULL);
+                     "search by filter", NULL);
     psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-airmass", 0,
-            "define airmass", NAN);
+                     "define airmass", NAN);
     psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-exp_time", 0,
-            "search by exposure time", NAN);
+                     "search by exposure time", NAN);
     psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-ccd_temp", 0,
-            "search by ccd tempature", NAN);
+                     "search by ccd tempature", NAN);
     psMetadataAddF64(searchArgs, PS_LIST_TAIL, "-posang", 0,
-            "search by rotator position angle", NAN);
+                     "search by rotator position angle", NAN);
     psMetadataAddTime(searchArgs, PS_LIST_TAIL, "-time", 0,
-            "define time for desired detrend data", NULL);
+                      "define time for desired detrend data", NULL);
     psMetadataAddBool(searchArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+                      "use the simple output format", false);
     psMetadataAddBool(searchArgs, PS_LIST_TAIL, "-unlimit",  0,
-            "list all possible detruns, not just the best match", false);
+                      "list all possible detruns, not just the best match", false);
  
     // -select
     psMetadata *selectArgs = psMetadataAlloc();
     psMetadataAddStr(selectArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search by detrend ID", NULL);
+                     "search by detrend ID", NULL);
     psMetadataAddS32(selectArgs, PS_LIST_TAIL, "-iteration", 0,
-            "search by iteration number", 0);
+                     "search by iteration number", 0);
     psMetadataAddStr(selectArgs, PS_LIST_TAIL, "-class_id", 0,
-            "search by class ID", NULL);
+                     "search by class ID", NULL);
     psMetadataAddBool(selectArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+                      "use the simple output format", false);
     
     psMetadata *argSets = psMetadataAlloc();
@@ -98,86 +100,4 @@
 
     // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereS32(name) \
-{ \
-    psS32 s32 = 0; \
-    bool status = false; \
-    if ((s32= psMetadataLookupS32(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, #name, 0, "==", s32)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereF32(name) \
-{ \
-    psF32 var = 0; \
-    bool status = false; \
-    if ((var = psMetadataLookupF32(&status, config->args, "-" #name))) { \
-        if (!isnan(var)) { \
-            if (!psMetadataAddF32(config->where, PS_LIST_TAIL, #name, 0, "==", var)) { \
-                psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-                psFree(config); \
-                return NULL; \
-            } \
-        } \
-    } \
-}
-
-#define addWhereF64(name) \
-{ \
-    psF64 var = 0; \
-    bool status = false; \
-    if ((var = psMetadataLookupF64(&status, config->args, "-" #name))) { \
-        if (!isnan(var))  { \
-            if (!psMetadataAddF64(config->where, PS_LIST_TAIL, #name, 0, "==", var)) { \
-                psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-                psFree(config); \
-                return NULL; \
-            } \
-        } \
-    } \
-}
-
-#define addWhereTimeStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        psTime *time = psTimeFromISO(str, PS_TIME_UTC); \
-        if (!time) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to convert " #name " into a psTime object"); \
-            psFree(config); \
-            return NULL; \
-        } \
-        psMetadataItem *item = psMetadataLookup(config->args, "-" #name); \
-        if (item) { \
-            str = item->comment; \
-        } else { \
-            str = NULL; \
-        } \
-        if (!psMetadataAddTime(config->where, PS_LIST_TAIL, #name, 0, str, time)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-        psFree(time); \
-    } \
-}
-
     // generate SQL where clause
     config->where = psMetadataAlloc();
@@ -186,18 +106,10 @@
     addWhereS32(iteration);
     addWhereStr(exp_id);
-    // convert '-inst' to 'camera'
-    {
-        psString str = NULL; 
-        bool status = false;
-        if ((str = psMetadataLookupStr(&status, config->args, "-inst"))) {
-            if (!psMetadataAddStr(config->where, PS_LIST_TAIL, "camera", 0, "==", str)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
+    addWhereStrAlias(inst,camera);
+
     addWhereStr(telescope);
     addWhereStr(det_type);
+    addWhereStrAlias(type,det_type);
+
     addWhereStr(exp_type);
     addWhereS32(imfiles);
@@ -205,9 +117,10 @@
     addWhereStr(class_id);
     addWhereStr(filter);
-//    addWhereF32(exp_time);
-//    addWhereF64(ccd_temp);
-//    addWhereF32(airmass);
-//    addWhereTimeStr(use_begin);
-//    addWhereTimeStr(use_end);
+
+    //    addWhereF32(exp_time);
+    //    addWhereF64(ccd_temp);
+    //    addWhereF32(airmass);
+    //    addWhereTimeStr(use_begin);
+    //    addWhereTimeStr(use_end);
 
     if (config->where->list->n < 1) {
@@ -218,5 +131,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/dettool.c
===================================================================
--- /branches/cleanup/ippTools/src/dettool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/dettool.c	(revision 18357)
@@ -87,4 +87,6 @@
 static bool detrunsummaryMode(pxConfig *config);
 static bool revertdetrunsummaryMode(pxConfig *config);
+static bool updatedetrunsummaryMode(pxConfig *config);
+// run
 static bool updatedetrunMode(pxConfig *config);
 static bool rerunMode(pxConfig *config);
@@ -179,4 +181,5 @@
         MODECASE(DETTOOL_MODE_DETRUNSUMMARY,    detrunsummaryMode);
         MODECASE(DETTOOL_MODE_REVERTDETRUNSUMMARY, revertdetrunsummaryMode);
+        MODECASE(DETTOOL_MODE_UPDATEDETRUNSUMMARY, updatedetrunsummaryMode);
         MODECASE(DETTOOL_MODE_UPDATEDETRUN,     updatedetrunMode);
         MODECASE(DETTOOL_MODE_RERUN,            rerunMode);
@@ -456,10 +459,4 @@
     }
 
-    if (!convertIdToStr(detRuns)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(detRuns);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, detRuns, "detRun", !simple)) {
@@ -719,11 +716,4 @@
     }
 
-    // convert det_id to a string externaly
-    if (!convertIdToStr(detRuns)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert det_id to a string");
-        psFree(detRuns);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, detRuns, "detRun", !simple)) {
@@ -1012,11 +1002,4 @@
     }
 
-    // convert det_id to a string externaly
-    if (!convertIdToStr(detRuns)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(detRuns);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, newDetRuns, "detRun", !simple)) {
@@ -1111,11 +1094,4 @@
         psFree(runs);
         return true;
-    }
-
-    // convert det_id to a string externaly
-    if (!convertIdToStr(runs)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(runs);
-        return false;
     }
 
@@ -1180,11 +1156,4 @@
         psFree(output);
         return true;
-    }
-
-    // convert det_id to a string externaly
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
     }
 
@@ -3851,4 +3820,34 @@
 
 
+static bool updatedetrunsummaryMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+
+    PXOPT_LOOKUP_BOOL(accept, config->args, "-accept", false);
+    PXOPT_LOOKUP_BOOL(reject, config->args, "-reject", false);
+
+    if (accept && reject) {
+        psError(PS_ERR_UNKNOWN, true, "-accept and -reject are exclusive");
+        return false;
+    }
+
+    if (!(accept || reject)) {
+        psError(PS_ERR_UNKNOWN, true, "either -accept or -reject is required");
+        return false;
+    }
+
+    char *query = "UPDATE detRunSummary SET accept = %d WHERE det_id = %"PRId64; 
+    if (!p_psDBRunQuery(config->dbh, query, accept, (psS64)atoll(det_id))) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
+}
+
+
 static bool updatedetrunMode(pxConfig *config)
 {
@@ -4252,10 +4251,4 @@
     }
 
-    if (!convertIdToStr(detRuns)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(detRuns);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, detRuns, "detRun", !simple)) {
Index: /branches/cleanup/ippTools/src/dettool.h
===================================================================
--- /branches/cleanup/ippTools/src/dettool.h	(revision 18356)
+++ /branches/cleanup/ippTools/src/dettool.h	(revision 18357)
@@ -74,4 +74,5 @@
     DETTOOL_MODE_REVERTDETRUNSUMMARY,
     DETTOOL_MODE_UPDATERESIDEXP,
+    DETTOOL_MODE_UPDATEDETRUNSUMMARY,
     DETTOOL_MODE_UPDATEDETRUN,
     DETTOOL_MODE_RERUN,
Index: /branches/cleanup/ippTools/src/dettoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/dettoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/dettoolConfig.c	(revision 18357)
@@ -1034,4 +1034,13 @@
             "search by fault code", 0);
 
+    // -updatedetrunsummary
+    psMetadata *updatedetrunsummaryArgs = psMetadataAlloc();
+    psMetadataAddStr(updatedetrunsummaryArgs, PS_LIST_TAIL, "-det_id",  0,
+            "search for detrend master for detrend ID (required)", NULL);
+    psMetadataAddBool(updatedetrunsummaryArgs, PS_LIST_TAIL, "-accept",  0,
+            "declare that this detrun iteration is accepted as a master", false);
+    psMetadataAddBool(updatedetrunsummaryArgs, PS_LIST_TAIL, "-reject",  0,
+            "reject this detrun iteration as a master", false);
+
     // -updatedetrun
     psMetadata *updatedetrunArgs = psMetadataAlloc();
@@ -1187,4 +1196,5 @@
     PXOPT_ADD_MODE("-detrunsummary", "", DETTOOL_MODE_DETRUNSUMMARY,detrunsummaryArgs);
     PXOPT_ADD_MODE("-revertdetrunsummary", "", DETTOOL_MODE_REVERTDETRUNSUMMARY, revertdetrunsummaryArgs);
+    PXOPT_ADD_MODE("-updatedetrunsummary", "", DETTOOL_MODE_UPDATEDETRUNSUMMARY, updatedetrunsummaryArgs);
     PXOPT_ADD_MODE("-updatedetrun", "", DETTOOL_MODE_UPDATEDETRUN, updatedetrunArgs);
     PXOPT_ADD_MODE("-rerun",           "", DETTOOL_MODE_RERUN,         rerunArgs);
@@ -1308,5 +1318,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/dettool_correction.c
===================================================================
--- /branches/cleanup/ippTools/src/dettool_correction.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/dettool_correction.c	(revision 18357)
@@ -120,10 +120,4 @@
     }
 
-    if (!convertIdToStr(detRuns)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(detRuns);
-        return false;
-    }
-
     bool simple = false;
     {
Index: /branches/cleanup/ippTools/src/difftool.c
===================================================================
--- /branches/cleanup/ippTools/src/difftool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/difftool.c	(revision 18357)
@@ -42,5 +42,5 @@
 static bool definebyqueryMode(pxConfig *config);
 
-static bool setdiffRunState(pxConfig *config, const char *diff_id, const char *state);
+static bool setdiffRunState(pxConfig *config, psS64 diff_id, const char *state);
 
 # define MODECASE(caseName, func) \
@@ -146,5 +146,5 @@
 
     // required options
-    PXOPT_LOOKUP_STR(diff_id, config->args, "-diff_id", true, false);
+    PXOPT_LOOKUP_S64(diff_id, config->args, "-diff_id", true, false);
     PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
@@ -163,9 +163,9 @@
 
     // required options
-    PXOPT_LOOKUP_STR(diff_id, config->args, "-diff_id", true, false);
+    PXOPT_LOOKUP_S64(diff_id, config->args, "-diff_id", true, false);
 
     // optional
-    PXOPT_LOOKUP_STR(stack_id, config->args, "-stack_id", false, false);
-    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", false, false);
+    PXOPT_LOOKUP_S64(stack_id, config->args, "-stack_id", false, false);
+    PXOPT_LOOKUP_S64(warp_id, config->args, "-warp_id", false, false);
     PXOPT_LOOKUP_STR(kind, config->args, "-kind", false, false);
 
@@ -188,5 +188,5 @@
     psString tess_id = NULL;
     if (warp_id) {
-        if (!p_psDBRunQuery(config->dbh, "SELECT * from diffRun WHERE diff_id = %" PRId64, (psS64)atoll(diff_id))) {
+        if (!p_psDBRunQuery(config->dbh, "SELECT * from diffRun WHERE diff_id = %" PRId64, diff_id)) {
             psError(PS_ERR_UNKNOWN, false, "database error");
             return false;
@@ -199,5 +199,5 @@
         }
         if (!psArrayLength(output)) {
-            psError(PS_ERR_UNKNOWN, false, "diff_id %" PRId64 " not found", (psS64)atoll(diff_id));
+            psError(PS_ERR_UNKNOWN, false, "diff_id %" PRId64 " not found", diff_id);
             psFree(output);
             return false;
@@ -215,8 +215,8 @@
 
     if (!diffInputSkyfileInsert(config->dbh,
-            (psS64)atoll(diff_id),
+            diff_id,
             template,
-            stack_id ? (psS64)atoll(stack_id) : PS_MAX_S64, // defined or NULL
-            warp_id ? (psS64)atoll(warp_id) : PS_MAX_S64, // defined or NULL
+            stack_id ? stack_id : PS_MAX_S64, // defined or NULL
+            warp_id ? warp_id : PS_MAX_S64, // defined or NULL
             skycell_id,
             tess_id,
@@ -230,5 +230,5 @@
     }
 
-    if (!p_psDBRunQuery(config->dbh, "SELECT count(diff_id) FROM diffRun JOIN diffInputSkyfile USING(diff_id) WHERE diff_id = %" PRId64, (psS64)atoll(diff_id))) {
+    if (!p_psDBRunQuery(config->dbh, "SELECT count(diff_id) FROM diffRun JOIN diffInputSkyfile USING(diff_id) WHERE diff_id = %" PRId64, diff_id)) {
         if (!psDBRollback(config->dbh)) {
             psError(PS_ERR_UNKNOWN, false, "database error");
@@ -250,5 +250,5 @@
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
-        psError(PS_ERR_UNKNOWN, false, "diff_id %" PRId64 " not found", (psS64)atoll(diff_id));
+        psError(PS_ERR_UNKNOWN, false, "diff_id %" PRId64 " not found", diff_id);
         psFree(output);
         return false;
@@ -333,10 +333,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "diffInputSkyfile", !simple)) {
@@ -407,10 +401,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "diffSkyfile", !simple)) {
@@ -432,5 +420,5 @@
 
     // required
-    PXOPT_LOOKUP_STR(diff_id, config->args, "-diff_id", true, false);
+    PXOPT_LOOKUP_S64(diff_id, config->args, "-diff_id", true, false);
 
     // default to 0
@@ -465,5 +453,5 @@
 
     if (!diffSkyfileInsert(config->dbh,
-                           (psS64)atoll(diff_id),
+                           diff_id,
                            uri,
                            path_base,
@@ -557,10 +545,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "diffSkyfile", !simple)) {
@@ -609,7 +591,6 @@
 
 
-static bool setdiffRunState(pxConfig *config, const char *diff_id, const char *state)
-{
-    PS_ASSERT_PTR_NON_NULL(diff_id, false);
+static bool setdiffRunState(pxConfig *config, psS64 diff_id, const char *state)
+{
     PS_ASSERT_PTR_NON_NULL(state, false);
 
@@ -626,8 +607,8 @@
     }
 
-    char *query = "UPDATE diffRun SET state = '%s' WHERE diff_id = '%s'";
+    char *query = "UPDATE diffRun SET state = '%s' WHERE diff_id = %"PRId64;
     if (!p_psDBRunQuery(config->dbh, query, state, diff_id)) {
         psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for diff_id %s", diff_id);
+                "failed to change state for diff_id %"PRId64, diff_id);
         return false;
     }
@@ -766,6 +747,6 @@
 
     // optional
-    PXOPT_LOOKUP_STR(template_stack_id, config->args, "-template_stack_id", false, false);
-    PXOPT_LOOKUP_STR(template_warp_id, config->args, "-template_warp_id", false, false);
+    PXOPT_LOOKUP_S64(template_stack_id, config->args, "-template_stack_id", false, false);
+    PXOPT_LOOKUP_S64(template_warp_id, config->args, "-template_warp_id", false, false);
 
     if (template_stack_id && template_warp_id) {
@@ -779,6 +760,6 @@
     }
 
-    PXOPT_LOOKUP_STR(input_stack_id, config->args, "-input_stack_id", false, false);
-    PXOPT_LOOKUP_STR(input_warp_id, config->args, "-input_warp_id", false, false);
+    PXOPT_LOOKUP_S64(input_stack_id, config->args, "-input_stack_id", false, false);
+    PXOPT_LOOKUP_S64(input_warp_id, config->args, "-input_warp_id", false, false);
     if (input_stack_id && input_warp_id) {
         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Only one input can be defined.");
@@ -792,8 +773,8 @@
 
     return populatedrun(workdir, skycell_id, tess_id,
-                        input_warp_id ? (psS64)atoll(input_warp_id) : PS_MAX_S64,
-                        input_stack_id ? (psS64)atoll(input_stack_id) : PS_MAX_S64,
-                        template_warp_id ? (psS64)atoll(template_warp_id) : PS_MAX_S64,
-                        template_stack_id ? (psS64)atoll(template_stack_id) : PS_MAX_S64,
+                        input_warp_id ? input_warp_id : PS_MAX_S64,
+                        input_stack_id ? input_stack_id : PS_MAX_S64,
+                        template_warp_id ? template_warp_id : PS_MAX_S64,
+                        template_stack_id ? template_stack_id : PS_MAX_S64,
                         config);
 
Index: /branches/cleanup/ippTools/src/difftoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/difftoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/difftoolConfig.c	(revision 18357)
@@ -60,6 +60,6 @@
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define diff ID (required)", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-diff_id", 0,
+            "define diff ID (required)", 0);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,
             "set state (required)", NULL);
@@ -73,10 +73,10 @@
     // -addinputskyfile
     psMetadata *addinputskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define diff ID (required)", NULL);
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "define warp ID", NULL);
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "define stack ID", NULL);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
+            "define diff ID (required)", 0);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "define warp ID", 0);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
+            "define stack ID", 0);
     psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-kind", 0,
             "define kind", NULL);
@@ -86,8 +86,8 @@
     // -inputskyfile
     psMetadata *inputskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "search by diff ID", NULL);
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", NULL);
+    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
+            "search by diff ID", 0);
+    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warp ID", 0);
     psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-skycell_id", 0,
             "search by skycell ID", NULL);
@@ -105,6 +105,6 @@
     // -todiffskyfile
     psMetadata *todiffskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(todiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "search by diff ID", NULL);
+    psMetadataAddS64(todiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
+            "search by diff ID", 0);
     psMetadataAddU64(todiffskyfileArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -114,6 +114,6 @@
     // -adddiffskyfile
     psMetadata *adddiffskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define warp ID (required)", NULL);
+    psMetadataAddS64(adddiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
+            "define warp ID (required)", 0);
     psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-uri", 0,
             "define URI of file", 0);
@@ -141,6 +141,6 @@
     // -diffskyfile
     psMetadata *diffskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(diffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "search by warp ID", NULL);
+    psMetadataAddS64(diffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
+            "search by warp ID", 0);
     psMetadataAddStr(diffskyfileArgs , PS_LIST_TAIL, "-skycell_id",  0,
             "define skycell ID", NULL);
@@ -154,6 +154,6 @@
     // -revertdiffskyfile
     psMetadata *revertdiffskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(revertdiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define warp ID (required)", NULL);
+    psMetadataAddS64(revertdiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
+            "define warp ID (required)", 0);
     psMetadataAddS16(revertdiffskyfileArgs, PS_LIST_TAIL, "-code",  0,
             "search by fault code", 0);
@@ -171,12 +171,12 @@
     psMetadataAddBool(definepoprunArgs, PS_LIST_TAIL, "-simple",  0,
             "use the simple output format", false);
-    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-template_warp_id", 0,
-            "define warp ID for template", NULL);
-    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-template_stack_id", 0,
-            "define stack ID for template", NULL);
-    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-input_warp_id", 0,
-            "define warp ID for input", NULL);
-    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-input_stack_id", 0,
-            "define stack ID for input", NULL);
+    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-template_warp_id", 0,
+            "define warp ID for template", 0);
+    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-template_stack_id", 0,
+            "define stack ID for template", 0);
+    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-input_warp_id", 0,
+            "define warp ID for input", 0);
+    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-input_stack_id", 0,
+            "define stack ID for input", 0);
 
     // -definebyquery
@@ -293,5 +293,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/faketool.c
===================================================================
--- /branches/cleanup/ippTools/src/faketool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/faketool.c	(revision 18357)
@@ -103,16 +103,6 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-
     psMetadata *where = psMetadataAlloc();
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -259,24 +249,6 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(fake_id, config->args, "-fake_id", false, false);
-    // convert fake_id into a psS64
-    if (fake_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "fake_id", 0, "==", (psS64)atoll(fake_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item fake_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -406,10 +378,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negate simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "fakePendingExp", !simple)) {
@@ -433,24 +399,6 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(fake_id, config->args, "-fake_id", false, false);
-    // convert fake_id into a psS64
-    if (fake_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "fakeRun.fake_id", 0, "==", (psS64)atoll(fake_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item fake_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "rawExp.exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-class_id", "rawImfile.class_id", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "rawExp.telescope", "==");
@@ -495,10 +443,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "fakePendingImfile", !simple)) {
@@ -519,6 +461,6 @@
 
     // fake_id, ext_tag, class_id are required
-    PXOPT_LOOKUP_STR(fake_id, config->args,     "-fake_id", true, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args,      "-exp_id", true, false);
+    PXOPT_LOOKUP_S64(fake_id, config->args,     "-fake_id", true, false);
+    PXOPT_LOOKUP_S64(exp_id, config->args,      "-exp_id", true, false);
     PXOPT_LOOKUP_STR(class_id, config->args,    "-class_id", true, false);
 
@@ -539,6 +481,6 @@
 
     if (!fakeProcessedImfileInsert(config->dbh,
-                                   (psS64)atoll(fake_id),
-                                   (psS64)atoll(exp_id),
+                                   fake_id,
+                                   exp_id,
                                    class_id,
                                    uri,
@@ -589,24 +531,6 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(fake_id, config->args, "-fake_id", false, false);
-    // convert fake_id into a psS64
-    if (fake_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "fakeRun.fake_id", 0, "==", (psS64)atoll(fake_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item fake_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "rawExp.exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fakeRun.fake_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "rawExp.exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-class_id", "rawImfile.class_id", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "rawExp.telescope", "==");
@@ -659,10 +583,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "fakeProcessedImfile", !simple)) {
@@ -682,24 +600,6 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(fake_id, config->args, "-fake_id", false, false);
-    // convert fake_id into a psS64
-    if (fake_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "fake_id", 0, "==", (psS64)atoll(fake_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item fake_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -778,13 +678,5 @@
 
     psMetadata *where = psMetadataAlloc();
-    PXOPT_LOOKUP_STR(fake_id, config->args, "-fake_id", false, false);
-    // convert fake_id into a psS64
-    if (fake_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "fake_id", 0, "==", (psS64)atoll(fake_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item fake_id");
-            psFree(where);
-            return false;
-        }
-    }
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
     PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
 
@@ -866,10 +758,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "fakeMask", !simple)) {
@@ -937,10 +823,4 @@
         psFree(output);
         return true;
-    }
-
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
     }
 
Index: /branches/cleanup/ippTools/src/faketoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/faketoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/faketoolConfig.c	(revision 18357)
@@ -47,6 +47,6 @@
     psMetadata *queueArgs = psMetadataAlloc();
     // XXX need to allow multiple exp_ids
-    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
+    psMetadataAddS64(queueArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", 0);
     psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-exp_name",  0,
             "search by exp_name", NULL);
@@ -145,8 +145,8 @@
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "search by fake ID", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-fake_id", 0,
+            "search by fake ID", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", 0);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_name",  0,
             "search by exp_name", NULL);
@@ -231,11 +231,10 @@
             "allow everything to be queued without search terms", false);
 
-
     // -pendingexp
     psMetadata *pendingexpArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", NULL);
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-chip_id", 0,
-            "search by chiptool ID", NULL);
+    psMetadataAddS64(pendingexpArgs, PS_LIST_TAIL, "-cam_id", 0,
+            "search by camtool ID", 0);
+    psMetadataAddS64(pendingexpArgs, PS_LIST_TAIL, "-chip_id", 0,
+            "search by chiptool ID", 0);
     psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -245,8 +244,8 @@
     // -pendingimfile
     psMetadata *pendingimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-fake_id",  0,
-            "search by fake ID", NULL);
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exposure ID", NULL);
+    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-fake_id",  0,
+            "search by fake ID", 0);
+    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exposure ID", 0);
     psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-class_id",  0,
             "search by class ID", NULL);
@@ -262,8 +261,8 @@
     // -addprocessedimfile
     psMetadata *addprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-fake_id",  0,
-            "define fake ID (required)", NULL);
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define exposure ID (required)", NULL);
+    psMetadataAddS64(addprocessedimfileArgs, PS_LIST_TAIL, "-fake_id",  0,
+            "define fake ID (required)", 0);
+    psMetadataAddS64(addprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "define exposure ID (required)", 0);
     psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,
             "define class ID (required)", NULL);
@@ -281,8 +280,8 @@
     // -processedimfile
     psMetadata *processedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-fake_id",  0,
-            "define fake ID", NULL);
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define exposure ID", NULL);
+    psMetadataAddS64(processedimfileArgs, PS_LIST_TAIL, "-fake_id",  0,
+            "define fake ID", 0);
+    psMetadataAddS64(processedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "define exposure ID", 0);
     psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-class_id",  0,
             "define class ID", NULL);
@@ -300,8 +299,8 @@
     // -updateprocessedimfile
     psMetadata *updateprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(updateprocessedimfileArgs, PS_LIST_TAIL, "-fake_id",  0,
-            "search by fake ID", NULL);
-    psMetadataAddStr(updateprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exposure ID", NULL);
+    psMetadataAddS64(updateprocessedimfileArgs, PS_LIST_TAIL, "-fake_id",  0,
+            "search by fake ID", 0);
+    psMetadataAddS64(updateprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exposure ID", 0);
     psMetadataAddStr(updateprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,
             "search by class ID", NULL);
@@ -311,8 +310,8 @@
     // -revertprocessedimfile
     psMetadata *revertprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "search by fake ID", NULL);
-    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
+    psMetadataAddS64(revertprocessedimfileArgs, PS_LIST_TAIL, "-fake_id", 0,
+            "search by fake ID", 0);
+    psMetadataAddS64(revertprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", 0);
     psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-exp_name",  0,
             "search by exp_name", NULL);
@@ -458,5 +457,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/flatcorr.c
===================================================================
--- /branches/cleanup/ippTools/src/flatcorr.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/flatcorr.c	(revision 18357)
@@ -463,10 +463,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "chipProcessedImfile", !simple)) {
Index: /branches/cleanup/ippTools/src/flatcorrConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/flatcorrConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/flatcorrConfig.c	(revision 18357)
@@ -251,5 +251,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/guidetoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/guidetoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/guidetoolConfig.c	(revision 18357)
@@ -196,5 +196,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/magictool.c
===================================================================
--- /branches/cleanup/ippTools/src/magictool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/magictool.c	(revision 18357)
@@ -399,10 +399,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "magicInputSkyfile", !simple)) {
@@ -627,10 +621,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "magicMe", !simple)) {
@@ -718,10 +706,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "toprocess", !simple)) {
@@ -806,10 +788,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "toskyfilemask", !simple)) {
Index: /branches/cleanup/ippTools/src/magictoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/magictoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/magictoolConfig.c	(revision 18357)
@@ -251,5 +251,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/pstamptool.c
===================================================================
--- /branches/cleanup/ippTools/src/pstamptool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pstamptool.c	(revision 18357)
@@ -336,5 +336,5 @@
     char *query ="INSERT INTO pstampRequest"
                  " (state, uri, ds_id, outFileset, resultsFile)"
-                 " VALUES( 'new', '%s', %s, '%s', 1)";
+                 " VALUES( 'new', '%s', %s, '%s', 0)";
 
     if (!p_psDBRunQuery(config->dbh, query, uri, ds_id, outFileset)) {
@@ -567,5 +567,5 @@
     }
     if (job_type) {
-        if (!strcmp(job_type, "get_image")) {
+        if (!strcmp(job_type, "get_image") || !strcmp(job_type, "detect_query")) {
             stampJob = false;
         } else if (!strcmp(job_type, "stamp")) {
@@ -622,17 +622,34 @@
     }
 
+    psString stateString = psMetadataLookupStr(&status, config->args, "-state");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -state");
+        return false;
+    }
+    if (!stateString) {
+        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";
+    }
+
     char *query;
     
     if (stampJob) {
         query ="INSERT INTO pstampJob"
-                 " (req_id, state, jobType, uri, outputBase, args)"
-                 " VALUES( %s, 'run', '%s', '%s', '%s', '%s')";
+                 " (req_id, state, jobType, uri, outputBase, result, args)"
+                 " VALUES( %s, '%s', '%s', '%s', '%s', %s, '%s')";
     } else {
         query ="INSERT INTO pstampJob"
-                 " (req_id, state, jobType, uri, outputBase)"
-                 " VALUES( %s, 'run', '%s', '%s', '%s')";
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query, req_id, job_type, uri, outputBase, argString)) {
+                 " (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)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
Index: /branches/cleanup/ippTools/src/pstamptoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/pstamptoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pstamptoolConfig.c	(revision 18357)
@@ -119,4 +119,8 @@
     psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-args", 0,
             "define job args", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-state", 0,
+            "new state", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-result", 0,
+            "new result", NULL); 
 
     // -listjob
@@ -224,5 +228,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/pxadminConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/pxadminConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pxadminConfig.c	(revision 18357)
@@ -126,5 +126,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/pxinject.c
===================================================================
--- /branches/cleanup/ippTools/src/pxinject.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pxinject.c	(revision 18357)
@@ -91,5 +91,5 @@
 
     if (!newExpInsert(config->dbh,
-                0x0,    // exp_id
+                0,    // exp_id
                 tmp_exp_name,
                 tmp_camera,
@@ -110,14 +110,11 @@
     }
 
-    psS64 lastInsertID = psDBLastInsertID(config->dbh);
-    psString exp_id = psDBIntToString(lastInsertID);
+    psS64 exp_id = psDBLastInsertID(config->dbh);
 
     psMetadata *md = psMetadataAlloc();
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
+    if (!psMetadataAddS64(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
         psFree(md);
-        psFree(exp_id);
     }
-    psFree(exp_id);
 
     // negate simple so the default is true
@@ -137,10 +134,10 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", true, false);
     PXOPT_LOOKUP_STR(tmp_class_id, config->args, "-tmp_class_id", true, false);
     PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
     // insert with error flag state set to 0 (no errors)
-    if (!newImfileInsert(config->dbh, (psS64)atoll(exp_id), tmp_class_id, uri, NULL)) {
+    if (!newImfileInsert(config->dbh, exp_id, tmp_class_id, uri, NULL)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
@@ -155,5 +152,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", true, false);
     PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
Index: /branches/cleanup/ippTools/src/pxinjectConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/pxinjectConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pxinjectConfig.c	(revision 18357)
@@ -68,6 +68,6 @@
     // -newImfile
     psMetadata *newImfileArgs = psMetadataAlloc();
-    psMetadataAddStr(newImfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define the exp_id (required)", NULL);
+    psMetadataAddS64(newImfileArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "define the exp_id (required)", 0);
     psMetadataAddStr(newImfileArgs, PS_LIST_TAIL, "-tmp_class_id",  0,
             "define the class ID (required)", NULL);
@@ -77,6 +77,6 @@
     // -updatenewExp
     psMetadata *updatenewExpArgs = psMetadataAlloc();
-    psMetadataAddStr(updatenewExpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define the exp_id (required)", NULL);
+    psMetadataAddS64(updatenewExpArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "define the exp_id (required)", 0);
     psMetadataAddStr(updatenewExpArgs, PS_LIST_TAIL, "-state", 0,
             "set state (required)", NULL);
@@ -192,5 +192,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: anches/cleanup/ippTools/src/pxio.c
===================================================================
--- /branches/cleanup/ippTools/src/pxio.c	(revision 18356)
+++ 	(revision )
@@ -1,59 +1,0 @@
-/*
- * pxio.c
- *
- * Copyright (C) 2007  Joshua Hoblitt
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * program; see the file COPYING. If not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifdef HAVB_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdbool.h>
-
-#include <pslib.h>
-
-#include "pxtools.h"
-#include "pxio.h"
-
-bool convertIdToStr(psArray *mds)
-{
-    PS_ASSERT_PTR_NON_NULL(mds, false);
-
-    char *ids[] = {"guide_id", "chip_id", "cam_id", "det_id", "warp_id", "diff_id", "stack_id", "magic_id", NULL};
-
-    // loop over array of metadatas
-    for (long i = 0; i < psArrayLength(mds); i++) {
-        psMetadata *md = mds->data[i];
-        // loop over array of ID fields
-        for (int j = 0; ids[j] != NULL; j++) {
-            char *name = ids[j];
-            bool status = false;
-            psS64 numeric_id = psMetadataLookupS64(&status, md, name);
-            if (!status) {
-                continue;
-//                psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s",
-//                        name);
- //               return false;
-            }
-            psMetadataRemoveKey(md, name);
-            psString string_id = psDBIntToString((psU64)numeric_id);
-            psMetadataAddStr(md, PS_LIST_HEAD, name, 0, NULL, string_id);
-            psFree(string_id);
-        }
-    }
-
-    return true;
-}
Index: anches/cleanup/ippTools/src/pxio.h
===================================================================
--- /branches/cleanup/ippTools/src/pxio.h	(revision 18356)
+++ 	(revision )
@@ -1,27 +1,0 @@
-/*
- * pxio.h
- *
- * Copyright (C) 2007  Joshua Hoblitt
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation; version 2 of the License.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- *
- * You should have received a copy of the GNU General Public License along with
- * program; see the file COPYING. If not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- */
-
-#ifndef PXIO_H
-#define PXIO_H 1
-
-#include <pslib.h>
-
-bool convertIdToStr(psArray *mds);
-
-#endif // PXIO_H
Index: /branches/cleanup/ippTools/src/pxregister.c
===================================================================
--- /branches/cleanup/ippTools/src/pxregister.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pxregister.c	(revision 18357)
@@ -29,7 +29,10 @@
 #include "pxregister.h"
 
-bool pxnewExpSetState(pxConfig *config, const char *exp_id, const char *state)
+bool pxnewExpSetState(pxConfig *config, psS64 exp_id, const char *state)
 {
-    PS_ASSERT_PTR_NON_NULL(exp_id, false);
+    if (!exp_id) {
+        psError(PS_ERR_UNKNOWN, true, "0 is not a valid exp_id");
+        return false;
+    }
     PS_ASSERT_PTR_NON_NULL(state, false);
 
@@ -46,8 +49,8 @@
     }
 
-    char *query = "UPDATE newExp SET state = '%s' WHERE exp_id = '%s'";
+    char *query = "UPDATE newExp SET state = '%s' WHERE exp_id = %"PRId64;
     if (!p_psDBRunQuery(config->dbh, query, state, exp_id)) {
         psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for exp_id %s", exp_id);
+                "failed to change state for exp_id %"PRId64, exp_id);
         return false;
     }
Index: /branches/cleanup/ippTools/src/pxregister.h
===================================================================
--- /branches/cleanup/ippTools/src/pxregister.h	(revision 18356)
+++ /branches/cleanup/ippTools/src/pxregister.h	(revision 18357)
@@ -25,5 +25,5 @@
 #include "pxtools.h"
 
-bool pxnewExpSetState(pxConfig *config, const char *exp_id, const char *state);
+bool pxnewExpSetState(pxConfig *config, psS64 exp_id, const char *state);
 
 #endif // PXREGISTER_H
Index: /branches/cleanup/ippTools/src/pxtools.h
===================================================================
--- /branches/cleanup/ippTools/src/pxtools.h	(revision 18356)
+++ /branches/cleanup/ippTools/src/pxtools.h	(revision 18357)
@@ -36,5 +36,4 @@
 #include "pxfake.h"
 #include "pxwarp.h"
-#include "pxio.h"
 #include "pxregister.h"
 #include "pxtag.h"
@@ -108,16 +107,17 @@
 type var; \
 { \
-    bool status; \
- \
-    var = psMetadataLookup##suffix(&status, md, key); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s", key); \
-        return ret; \
-    } \
- \
-    if (required && (var == max)) { \
-        psError(PS_ERR_UNKNOWN, true, "%s is required", key); \
-        return ret; \
-    } \
+    psMetadataItem *item = psMetadataLookup(md, key); \
+    if (!item) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s", key); \
+        return ret; \
+    } \
+    psAssert(item->comment, "metadata item comment should be defined"); \
+    if (required && (!psStrcasestr(item->comment, "(found)"))) { \
+        psError(PS_ERR_UNKNOWN, true, "%s is required", key); \
+        return ret; \
+    } \
+ \
+    var = item->data.suffix; \
+ \
 }
 
@@ -171,16 +171,19 @@
 // XXX the PXOPT_COPY_* macros free 'to' on error
 
-#define PXOPT_COPY_PRIMITIVE(from, to, type, suffix, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    type var = psMetadataLookup##suffix(&status, from, oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for " oldname); \
+#define PXOPT_COPY_PRIMITIVE(from, to, type, suffix, oldname, newname, newcomment) \
+{ \
+    psMetadataItem *item = psMetadataLookup(from, oldname); \
+    if (!item) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s", oldname); \
         return false; \
     } \
-    if (!psMetadataAdd##suffix(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, var)) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-        psFree(to); \
-        return false; \
+    psAssert(item->comment, "metadata item comment should be defined"); \
+\
+    if (psStrcasestr(item->comment, "(found)")) { \
+        if (!psMetadataAdd##suffix(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, newcomment, item->data.suffix)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
+            psFree(to); \
+            return false; \
+        } \
     } \
 }
Index: /branches/cleanup/ippTools/src/pzgetexpConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/pzgetexpConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pzgetexpConfig.c	(revision 18357)
@@ -73,5 +73,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if(!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't connect to db\n");
Index: /branches/cleanup/ippTools/src/pzgetimfilesConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/pzgetimfilesConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pzgetimfilesConfig.c	(revision 18357)
@@ -79,5 +79,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if(!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't connect to db\n");
Index: /branches/cleanup/ippTools/src/pztool.c
===================================================================
--- /branches/cleanup/ippTools/src/pztool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pztool.c	(revision 18357)
@@ -42,4 +42,6 @@
 static bool updatecopiedMode(pxConfig *config);
 static bool revertcopiedMode(pxConfig *config);
+
+static bool clearcommonfaultsMode(pxConfig *config);
 static bool advanceMode(pxConfig *config);
 
@@ -77,4 +79,5 @@
         MODECASE(PZTOOL_MODE_UPDATECOPIED, updatecopiedMode);
         MODECASE(PZTOOL_MODE_REVERTCOPIED, revertcopiedMode);
+        MODECASE(PZTOOL_MODE_CLEARCOMMONFAULTS, clearcommonfaultsMode);
         MODECASE(PZTOOL_MODE_ADVANCE, advanceMode);
         default:
@@ -203,4 +206,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(desc, config->args, "-desc", false);
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -225,4 +229,9 @@
     }
 
+    psStringAppend(&query, " ORDER BY summitExp.dateobs");
+    if (desc) {
+        psStringAppend(&query, " DESC");
+    }
+
     // treat limit == 0 as "no limit"
     if (limit) {
@@ -266,4 +275,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(desc, config->args, "-desc", false);
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -294,4 +304,9 @@
             psStringAppend(&query, " AND %s", whereClause);
             psFree(whereClause);
+        }
+
+        psStringAppend(&query, " ORDER BY dateobs");
+        if (desc) {
+            psStringAppend(&query, " DESC");
         }
 
@@ -748,4 +763,41 @@
 
 
+static bool clearcommonfaultsMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+{
+    psString query = pxDataGet("pztool_revert_downloadimfile_faults.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+}
+
+{
+    psString query = pxDataGet("pztool_revert_fileset_faults.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+}
+
+    return true;
+}
+
 static bool advanceMode(pxConfig *config)
 {
Index: /branches/cleanup/ippTools/src/pztool.h
===================================================================
--- /branches/cleanup/ippTools/src/pztool.h	(revision 18356)
+++ /branches/cleanup/ippTools/src/pztool.h	(revision 18357)
@@ -34,4 +34,5 @@
     PZTOOL_MODE_UPDATECOPIED,
     PZTOOL_MODE_REVERTCOPIED,
+    PZTOOL_MODE_CLEARCOMMONFAULTS,
     PZTOOL_MODE_ADVANCE
 } pztoolMode;
Index: /branches/cleanup/ippTools/src/pztoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/pztoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/pztoolConfig.c	(revision 18357)
@@ -80,4 +80,6 @@
     psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-exp_type", 0,
             "define exposure type", NULL); 
+    psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-desc", 0,
+            "sort ouput in descending format", false);
     psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -95,4 +97,6 @@
     psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-exp_type", 0,
             "define exposure type", NULL); 
+    psMetadataAddBool(pendingimfileArgs, PS_LIST_TAIL, "-desc", 0,
+            "sort ouput in descending format", false);
     psMetadataAddU64(pendingimfileArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -176,4 +180,7 @@
             "search by fault code", 0);
 
+    // -clearcommonfaults
+    psMetadata *clearcommonfaultsArgs = psMetadataAlloc();
+
     // -advance
     psMetadata *advanceArgs = psMetadataAlloc();
@@ -201,4 +208,5 @@
     PXOPT_ADD_MODE("-updatecopied",    "", PZTOOL_MODE_UPDATECOPIED,updatecopiedArgs);
     PXOPT_ADD_MODE("-revertcopied",    "", PZTOOL_MODE_REVERTCOPIED,revertcopiedArgs);
+    PXOPT_ADD_MODE("-clearcommonfaults","", PZTOOL_MODE_CLEARCOMMONFAULTS,clearcommonfaultsArgs);
     PXOPT_ADD_MODE("-advance",          "", PZTOOL_MODE_ADVANCE,    advanceArgs);
 
@@ -257,5 +265,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/regtool.c
===================================================================
--- /branches/cleanup/ippTools/src/regtool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/regtool.c	(revision 18357)
@@ -43,4 +43,5 @@
 static bool revertprocessedexpMode(pxConfig *config);
 static bool updateprocessedexpMode(pxConfig *config);
+static bool cleardupexpMode(pxConfig *config);
 
 # define MODECASE(caseName, func) \
@@ -74,4 +75,5 @@
         MODECASE(REGTOOL_MODE_REVERTPROCESSEDEXP,    revertprocessedexpMode);
         MODECASE(REGTOOL_MODE_UPDATEPROCESSEDEXP,    updateprocessedexpMode);
+        MODECASE(REGTOOL_MODE_CLEARDUPEXP,           cleardupexpMode);
         default:
             psAbort("invalid option (this should not happen)");
@@ -168,5 +170,5 @@
 
     // required
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", true, false);
     PXOPT_LOOKUP_STR(exp_name, config->args, "-exp_name", true, false);
     PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
@@ -228,5 +230,5 @@
     if (!rawImfileInsert(
         config->dbh,
-        (psS64)atoll(exp_id),
+        exp_id,
         exp_name,
         camera,
@@ -494,5 +496,5 @@
 
     // required
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_S64(exp_id, config->args, "-exp_id", true, false);
     PXOPT_LOOKUP_STR(exp_name, config->args, "-exp_name", true, false);
     PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
@@ -567,5 +569,5 @@
         // build a query to search by exp_id
         psMetadata *where = psMetadataAlloc();
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "newExp.exp_id", 0, "==", exp_id)) {
+        if (!psMetadataAddS64(where, PS_LIST_TAIL, "newExp.exp_id", 0, "==", exp_id)) {
             psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
             psFree(where);
@@ -650,5 +652,5 @@
 
     if (!rawExpInsert(config->dbh,
-        (psS64)atoll(exp_id),
+        exp_id,
         exp_name,
         camera,
@@ -724,5 +726,5 @@
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
-        psError(PS_ERR_UNKNOWN, false, "failed to change newExp.state for exp_id: %s", exp_id);
+        psError(PS_ERR_UNKNOWN, false, "failed to change newExp.state for exp_id: %"PRId64, exp_id);
     psFree(newExp);
         return false;
@@ -747,5 +749,5 @@
     // this can only be run as the newExp's state has been set to stop
     if (!pxchipQueueByExpTag(config,
-                (psS64)atoll(exp_id),
+                exp_id,
                 workdir,
             label,
@@ -795,5 +797,5 @@
 
     // XX test this out; need to make this consistent with the list in regtoolConfig.c
-    PXOPT_COPY_STR(config->args, config->where,  "-exp_id", "exp_id", "==");
+    PXOPT_COPY_S64(config->args, config->where,  "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, config->where,  "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, config->where,  "-inst", "camera", "==");
@@ -941,2 +943,106 @@
     return true;
 }
+
+
+static bool cleardupexpMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    if (!psDBTransaction(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+// create temp table of exp_ids to be removed
+{
+    psString query = pxDataGet("regtool_create_dup_table.sql");
+    if (!query) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+}
+
+// populate that table
+// XXX note that this query currently doesn't not correctly handle the case
+// where there is more than one duplicate
+{
+    psString query = pxDataGet("regtool_populate_dup_table.sql");
+    if (!query) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+}
+
+    if (!p_psDBRunQuery(config->dbh, "DELETE FROM rawImfile USING rawImfile, duplicate WHERE duplicate.exp_id = rawImfile.exp_id")) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, "DELETE FROM rawExp USING rawExp, duplicate WHERE duplicate.exp_id = rawExp.exp_id")) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, "DELETE FROM newImfile USING newImfile, duplicate WHERE duplicate.exp_id = newImfile.exp_id")) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    if (!p_psDBRunQuery(config->dbh, "DELETE FROM newExp USING newExp, duplicate WHERE duplicate.exp_id = newExp.exp_id")) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    if (!psDBCommit(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
+}
Index: /branches/cleanup/ippTools/src/regtool.h
===================================================================
--- /branches/cleanup/ippTools/src/regtool.h	(revision 18356)
+++ /branches/cleanup/ippTools/src/regtool.h	(revision 18357)
@@ -35,4 +35,5 @@
     REGTOOL_MODE_REVERTPROCESSEDEXP,
     REGTOOL_MODE_UPDATEPROCESSEDEXP,
+    REGTOOL_MODE_CLEARDUPEXP,
 } regtoolMode;
 
Index: /branches/cleanup/ippTools/src/regtoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/regtoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/regtoolConfig.c	(revision 18357)
@@ -61,5 +61,5 @@
     // -addprocessedimfile
     psMetadata *addprocessedimfileArgs = psMetadataAlloc();
-    ADD_OPT(Str,  addprocessedimfileArgs, "-exp_id",         "define exposure ID (required)",        NULL);
+    ADD_OPT(S64,  addprocessedimfileArgs, "-exp_id",         "define exposure ID (required)",        0);
     ADD_OPT(Str,  addprocessedimfileArgs, "-exp_name",       "define the exp_name (required)",         NULL);
     ADD_OPT(Str,  addprocessedimfileArgs, "-inst",           "define the camera name (required)",     NULL);
@@ -117,5 +117,5 @@
     // -processedimfile
     psMetadata *processedimfileArgs = psMetadataAlloc();
-   ADD_OPT(Str,  processedimfileArgs, "-exp_id",    "search by exposure ID",                 NULL);
+   ADD_OPT(S64,  processedimfileArgs, "-exp_id",    "search by exposure ID",                 0);
    ADD_OPT(Str,  processedimfileArgs, "-exp_name",  "search by exposure name",               NULL);
    ADD_OPT(Str,  processedimfileArgs, "-class_id",  "search by class ID",                    NULL);
@@ -126,5 +126,5 @@
     // -revertprocessedimfile
     psMetadata *revertprocessedimfileArgs = psMetadataAlloc();
-    ADD_OPT(Str, revertprocessedimfileArgs, "-exp_id",        "search by exposure ID (required)", NULL);
+    ADD_OPT(S64, revertprocessedimfileArgs, "-exp_id",        "search by exposure ID (required)", 0);
     ADD_OPT(Str, revertprocessedimfileArgs, "-tmp_class_id",  "searcy by temp. class ID", NULL);
     ADD_OPT(Str, revertprocessedimfileArgs, "-class_id",      "search by class ID", NULL);
@@ -133,5 +133,5 @@
     // -updateprocessedimfile
     psMetadata *updateprocessedimfileArgs = psMetadataAlloc();
-    ADD_OPT(Str, updateprocessedimfileArgs, "-exp_id",        "search by exposure ID", NULL);
+    ADD_OPT(S64, updateprocessedimfileArgs, "-exp_id",        "search by exposure ID", 0);
     ADD_OPT(Str, updateprocessedimfileArgs, "-class_id",      "search by class ID", NULL);
     ADD_OPT(S16, updateprocessedimfileArgs, "-code",          "set fault code (required)", INT16_MAX);
@@ -151,5 +151,5 @@
     // -addprocessedexp
     psMetadata *addprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-exp_id",           0,        "exp_id to operate on (required)", NULL);
+    psMetadataAddS64(addprocessedexpArgs, PS_LIST_TAIL, "-exp_id",           0,        "exp_id to operate on (required)", 0);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-exp_name",         0,        "define the exp_name (required)", NULL);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-inst",             0,        "define the camera name (required)", NULL);
@@ -215,5 +215,5 @@
     // -processedexp
     psMetadata *processedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(processedexpArgs,  PS_LIST_TAIL, "-exp_id",        0,            "search by exposure ID", NULL);
+    psMetadataAddS64(processedexpArgs,  PS_LIST_TAIL, "-exp_id",        0,            "search by exposure ID", 0);
     psMetadataAddStr(processedexpArgs,  PS_LIST_TAIL, "-exp_name",      0,            "search by exp_name", NULL);
     psMetadataAddStr(processedexpArgs,  PS_LIST_TAIL, "-inst",          0,            "search for camera", NULL);
@@ -260,11 +260,14 @@
     // -revertprocessedexp
     psMetadata *revertprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_id",   0,            "search by exposure ID (required)", NULL);
+    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_id",   0,            "search by exposure ID (required)", 0);
     psMetadataAddS16(revertprocessedexpArgs, PS_LIST_TAIL, "-code",     0,            "search by fault code", 0);
 
     // -updatedprocessedexp
     psMetadata *updatedprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(updatedprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", NULL);
+    psMetadataAddS64(updatedprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", 0);
     psMetadataAddS16(updatedprocessedexpArgs, PS_LIST_TAIL, "-code",    0,            "set fault code (required)", INT16_MAX);
+
+    // -cleardupexp
+    psMetadata *cleardupexpArgs = psMetadataAlloc();
 
     psMetadata *argSets = psMetadataAlloc();
@@ -272,13 +275,14 @@
 
     PXOPT_ADD_MODE("-pendingimfile",           "", REGTOOL_MODE_PENDINGIMFILE, pendingimfileArgs);
-    PXOPT_ADD_MODE("-addprocessedimfile",      "",  REGTOOL_MODE_ADDPROCESSEDIMFILE, addprocessedimfileArgs);
+    PXOPT_ADD_MODE("-addprocessedimfile",      "", REGTOOL_MODE_ADDPROCESSEDIMFILE, addprocessedimfileArgs);
     PXOPT_ADD_MODE("-processedimfile",         "", REGTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
     PXOPT_ADD_MODE("-revertprocessedimfile",   "", REGTOOL_MODE_REVERTPROCESSEDIMFILE, revertprocessedimfileArgs);
-    PXOPT_ADD_MODE("-updateprocessedimfile",   "",   REGTOOL_MODE_UPDATEPROCESSEDIMFILE, updateprocessedimfileArgs);
-    PXOPT_ADD_MODE("-pendingexp",              "",       REGTOOL_MODE_PENDINGEXP,pendingexpArgs);
-    PXOPT_ADD_MODE("-addprocessedexp",         "",  REGTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
-    PXOPT_ADD_MODE("-processedexp",            "",     REGTOOL_MODE_PROCESSEDEXP, processedexpArgs);
+    PXOPT_ADD_MODE("-updateprocessedimfile",   "", REGTOOL_MODE_UPDATEPROCESSEDIMFILE, updateprocessedimfileArgs);
+    PXOPT_ADD_MODE("-pendingexp",              "", REGTOOL_MODE_PENDINGEXP,pendingexpArgs);
+    PXOPT_ADD_MODE("-addprocessedexp",         "", REGTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
+    PXOPT_ADD_MODE("-processedexp",            "", REGTOOL_MODE_PROCESSEDEXP, processedexpArgs);
     PXOPT_ADD_MODE("-revertprocessedexp",      "", REGTOOL_MODE_REVERTPROCESSEDEXP, revertprocessedexpArgs);
-    PXOPT_ADD_MODE("-updateprocessedexp",      "",  REGTOOL_MODE_UPDATEPROCESSEDEXP,      updatedprocessedexpArgs);
+    PXOPT_ADD_MODE("-updateprocessedexp",      "", REGTOOL_MODE_UPDATEPROCESSEDEXP,      updatedprocessedexpArgs);
+    PXOPT_ADD_MODE("-cleardupexp",             "", REGTOOL_MODE_CLEARDUPEXP,      cleardupexpArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
@@ -352,5 +356,5 @@
 
     // define Database handle, if used
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PXTOOLS_ERR_SYS, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/stacktool.c
===================================================================
--- /branches/cleanup/ippTools/src/stacktool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/stacktool.c	(revision 18357)
@@ -41,5 +41,5 @@
 static bool revertsumskyfileMode(pxConfig *config);
 
-static bool setstackRunState(pxConfig *config, const char *stack_id, const char *state);
+static bool setstackRunState(pxConfig *config, psS64 stack_id, const char *state);
 
 # define MODECASE(caseName, func) \
@@ -486,5 +486,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(stack_id, config->args, "-stack_id", true, false);
+    PXOPT_LOOKUP_S64(stack_id, config->args, "-stack_id", true, false);
     PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
@@ -502,6 +502,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(stack_id, config->args, "-stack_id", true, false);
-    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", true, false);
+    PXOPT_LOOKUP_S64(stack_id, config->args, "-stack_id", true, false);
+    PXOPT_LOOKUP_S64(warp_id, config->args, "-warp_id", true, false);
 
     // XXX need to validate the warp_id here
@@ -509,6 +509,6 @@
     // constrants
     if (!stackInputSkyfileInsert(config->dbh,
-            (psS64)atoll(stack_id),
-            (psS64)atoll(warp_id)
+            stack_id,
+            warp_id
         )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -574,10 +574,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "stackInputSkyfile", !simple)) {
@@ -648,10 +642,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "stackSumSkyfile", !simple)) {
@@ -673,5 +661,5 @@
 
     // required
-    PXOPT_LOOKUP_STR(stack_id, config->args, "-stack_id", true, false);
+    PXOPT_LOOKUP_S64(stack_id, config->args, "-stack_id", true, false);
 
     // optional
@@ -696,5 +684,5 @@
     // constrants
     if (!stackSumSkyfileInsert(config->dbh,
-                               (psS64)atoll(stack_id),
+                               stack_id,
                                uri,
                                path_base,
@@ -785,10 +773,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         if (!ippdbPrintMetadatas(stdout, output, "stackSumSkyfile", !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
@@ -836,7 +818,6 @@
 
 
-static bool setstackRunState(pxConfig *config, const char *stack_id, const char *state)
-{
-    PS_ASSERT_PTR_NON_NULL(stack_id, false);
+static bool setstackRunState(pxConfig *config, psS64 stack_id, const char *state)
+{
     PS_ASSERT_PTR_NON_NULL(state, false);
 
@@ -853,11 +834,11 @@
     }
 
-    char *query = "UPDATE stackRun SET state = '%s' WHERE stack_id = '%s'";
+    char *query = "UPDATE stackRun SET state = '%s' WHERE stack_id = %"PRId64;
     if (!p_psDBRunQuery(config->dbh, query, state, stack_id)) {
         psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for stack_id %s", stack_id);
-        return false;
-    }
-
-    return true;
-}
+                "failed to change state for stack_id %"PRId64, stack_id);
+        return false;
+    }
+
+    return true;
+}
Index: /branches/cleanup/ippTools/src/stacktoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/stacktoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/stacktoolConfig.c	(revision 18357)
@@ -111,7 +111,7 @@
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id",  0,
             "define tessellation ID (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-warp_id",
+    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-warp_id",
              PS_META_DUPLICATE_OK,
-             "include this warp ID (multiple OK, required)", NULL);
+             "include this warp ID (multiple OK, required)", 0);
 
     psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,
@@ -120,6 +120,6 @@
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "define stack ID (required)", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-stack_id", 0,
+            "define stack ID (required)", 0);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,
             "set state (required)", NULL);
@@ -133,15 +133,15 @@
     // -addinputskyfile
     psMetadata *addinputskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "define stack ID (required)", NULL);
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "define warp ID (required)", NULL);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
+            "define stack ID (required)", 0);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "define warp ID (required)", 0);
 
     // -inputskyfile
     psMetadata *inputskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "search by stack ID", NULL);
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", NULL);
+    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
+            "search by stack ID", 0);
+    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warp ID", 0);
     psMetadataAddU64(inputskyfileArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -151,8 +151,8 @@
     // -tosum
     psMetadata *tosumArgs = psMetadataAlloc();
-    psMetadataAddStr(tosumArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "search by stack ID", NULL);
-    psMetadataAddStr(tosumArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", NULL);
+    psMetadataAddS64(tosumArgs, PS_LIST_TAIL, "-stack_id", 0,
+            "search by stack ID", 0);
+    psMetadataAddS64(tosumArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warp ID", 0);
     psMetadataAddU64(tosumArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -162,6 +162,6 @@
     // -addsumskyfile
     psMetadata *addsumskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addsumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "define stack ID (required)", NULL);
+    psMetadataAddS64(addsumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
+            "define stack ID (required)", 0);
     psMetadataAddStr(addsumskyfileArgs, PS_LIST_TAIL, "-uri", 0,
             "define URI of file", 0);
@@ -183,8 +183,8 @@
     // -sumskyfile
     psMetadata *sumskyfileArgs= psMetadataAlloc();
-    psMetadataAddStr(sumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "search by stack ID", NULL);
-    psMetadataAddStr(sumskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", NULL);
+    psMetadataAddS64(sumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
+            "search by stack ID", 0);
+    psMetadataAddS64(sumskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warp ID", 0);
     psMetadataAddU64(sumskyfileArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -194,6 +194,6 @@
     // -revertsumskyfile
     psMetadata *revertsumskyfileArgs= psMetadataAlloc();
-    psMetadataAddStr(revertsumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "search by stack ID (required)", NULL);
+    psMetadataAddS64(revertsumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
+            "search by stack ID (required)", 0);
     psMetadataAddS16(revertsumskyfileArgs, PS_LIST_TAIL, "-code",  0,
             "search by fault code", 0);
@@ -305,5 +305,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
Index: /branches/cleanup/ippTools/src/warptool.c
===================================================================
--- /branches/cleanup/ippTools/src/warptool.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/warptool.c	(revision 18357)
@@ -111,5 +111,5 @@
 
     // required options
-    PXOPT_LOOKUP_STR(fake_id, config->args, "-fake_id", true, false);
+    PXOPT_LOOKUP_S64(fake_id, config->args, "-fake_id", true, false);
     PXOPT_LOOKUP_STR(mode, config->args, "-mode", true, false);
     // check mode
@@ -133,5 +133,5 @@
     warpRunRow *warpRun = warpRunRowAlloc(
             0,          // ID
-            (psS64)atoll(fake_id),
+            fake_id,
             mode,
             "run",      // state
@@ -175,46 +175,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", false, false);
-    PXOPT_LOOKUP_STR(fake_id, config->args, "-fake_id", false, false);
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-
     psMetadata *where = psMetadataAlloc();
-    // convert warp_id into a psS64
-    if (warp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "warp_id", 0, "==", (psS64)atoll(warp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert fake_id into a psS64
-    if (fake_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "fake_id", 0, "==", (psS64)atoll(fake_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item fake_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -350,10 +313,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "warpRun", !simple)) {
@@ -425,10 +382,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "warpInputImfile", !simple)) {
@@ -500,10 +451,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "warpRun", !simple)) {
@@ -525,5 +470,5 @@
 
     PXOPT_LOOKUP_STR(mapfile, config->args, "-mapfile", false, false);
-    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", false, false);
+    PXOPT_LOOKUP_S64(warp_id, config->args, "-warp_id", false, false);
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
@@ -544,5 +489,5 @@
     } else {
         warpSkyCellMapInsert(config->dbh,
-            (psS64)atoll(warp_id),
+            warp_id,
             NULL,   // skycell_id
             NULL,   // tess_id
@@ -677,10 +622,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "warpSkyCellMap", !simple)) {
@@ -752,10 +691,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "warpPendingSkyCell", !simple)) {
@@ -776,5 +709,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", true, false);
+    PXOPT_LOOKUP_S64(warp_id, config->args, "-warp_id", true, false);
     PXOPT_LOOKUP_STR(skycell_id, config->args, "-skycell_id", true, false);
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false);
@@ -806,5 +739,5 @@
     // XXX need to validate that this coresponds to an warpInputImfile
     if (!warpSkyfileInsert(config->dbh,
-                           (psS64)atoll(warp_id),
+                           warp_id,
                            skycell_id,
                            tess_id,
@@ -1009,10 +942,4 @@
 
     if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
         // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "warpSkyfile", !simple)) {
@@ -1033,48 +960,11 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", false, false);
-    PXOPT_LOOKUP_STR(fake_id, config->args, "-fake_id", false, false);
-    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-
     psMetadata *where = psMetadataAlloc();
-    // convert warp_id into a psS64
-    if (warp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "warpRun.warp_id", 0, "==", (psS64)atoll(warp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id");
-            psFree(where);
-            return false;
-        }
-    }
-
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
     PXOPT_COPY_STR(config->args, where, "-tess_id", "tess_id", "==");
-
-    // convert fake_id into a psS64
-    if (fake_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "fakeRun.fake_id", 0, "==", (psS64)atoll(fake_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item fake_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert chip_id into a psS64
-    if (chip_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chipRun.chip_id", 0, "==", (psS64)atoll(chip_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(where);
-            return false;
-        }
-    }
-
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "rawExp.exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false;
-        }
-    }
 
     // XXX These may need to be updated with the table name?
@@ -1193,10 +1083,4 @@
     }
 
-    if (!convertIdToStr(output)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-        psFree(output);
-        return false;
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "warpMask", !simple)) {
Index: /branches/cleanup/ippTools/src/warptoolConfig.c
===================================================================
--- /branches/cleanup/ippTools/src/warptoolConfig.c	(revision 18356)
+++ /branches/cleanup/ippTools/src/warptoolConfig.c	(revision 18357)
@@ -49,6 +49,6 @@
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "define camtool ID (required)", NULL);
+    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-fake_id", 0,
+            "define camtool ID (required)", 0);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-mode", 0,
             "define mode (required)", NULL);
@@ -73,15 +73,15 @@
     psMetadata *updaterunArgs = psMetadataAlloc();
     // XXX need to allow multiple fake_ids
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warptool ID", 0);
     // XXX need to allow multiple fake_ids
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-fake_id",  0,
-            "search by fake_id", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-fake_id",  0,
+            "search by fake_id", 0);
     // XXX need to allow multiple chip_ids
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-chip_id",  0,
+            "search by chip_id", 0);
     // XXX need to allow multiple exp_ids
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", 0);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_name",  0,
             "search by exp_name", NULL);
@@ -174,8 +174,8 @@
     // -exp
     psMetadata *expArgs = psMetadataAlloc();
-    psMetadataAddStr(expArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", NULL);
-    psMetadataAddStr(expArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "search by camtool ID", NULL);
+    psMetadataAddS64(expArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warptool ID", 0);
+    psMetadataAddS64(expArgs, PS_LIST_TAIL, "-fake_id", 0,
+            "search by camtool ID", 0);
     psMetadataAddU64(expArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -185,8 +185,8 @@
     // -imfile
     psMetadata *imfileArgs = psMetadataAlloc();
-    psMetadataAddStr(imfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", NULL);
-    psMetadataAddStr(imfileArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "search by camtool ID", NULL);
+    psMetadataAddS64(imfileArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warptool ID", 0);
+    psMetadataAddS64(imfileArgs, PS_LIST_TAIL, "-fake_id", 0,
+            "search by camtool ID", 0);
     psMetadataAddU64(imfileArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -196,6 +196,6 @@
     // -tooverlap
     psMetadata *tooverlapArgs = psMetadataAlloc();
-    psMetadataAddStr(tooverlapArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", NULL);
+    psMetadataAddS64(tooverlapArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warp ID", 0);
     psMetadataAddU64(tooverlapArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -207,6 +207,6 @@
     psMetadataAddStr(addoverlapArgs, PS_LIST_TAIL, "-mapfile", 0,
             "path to skycell <-> imfile mapping file", NULL);
-    psMetadataAddStr(addoverlapArgs, PS_LIST_TAIL, "-warp_id",  0,
-            "set warp ID", NULL);
+    psMetadataAddS64(addoverlapArgs, PS_LIST_TAIL, "-warp_id",  0,
+            "set warp ID", 0);
     psMetadataAddS16(addoverlapArgs, PS_LIST_TAIL, "-code",  0,
             "set fault code", 0);
@@ -214,6 +214,6 @@
     // -scmap
     psMetadata *scmapArgs = psMetadataAlloc();
-    psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", NULL);
+    psMetadataAddS64(scmapArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warptool ID", 0);
     psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-skycell_id", 0,
             "search by skycell ID", NULL);
@@ -227,6 +227,6 @@
     // -towarped
     psMetadata *towarpedArgs = psMetadataAlloc();
-    psMetadataAddStr(towarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", NULL);
+    psMetadataAddS64(towarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warptool ID", 0);
     psMetadataAddU64(towarpedArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -236,6 +236,6 @@
     // -addwarped
     psMetadata *addwarpedArgs = psMetadataAlloc();
-    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "define warptool ID (required)", NULL);
+    psMetadataAddS64(addwarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "define warptool ID (required)", 0);
     psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-skycell_id",  0,
             "define skycell ID (required)", NULL);
@@ -271,14 +271,14 @@
     // -warped
     psMetadata *warpedArgs = psMetadataAlloc();
-    psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", NULL);
+    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warptool ID", 0);
     psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-skycell_id",  0,
             "define skycell ID", NULL);
     psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-tess_id",  0,
             "define tessellation ID", NULL);
-    psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-exp_id", 0,
-            "define exposure tag", NULL);
-    psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "define phase 3 version of exposure tag", NULL);
+    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-exp_id", 0,
+            "define exposure tag", 0);
+    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-fake_id", 0,
+            "define phase 3 version of exposure tag", 0);
     psMetadataAddU64(warpedArgs, PS_LIST_TAIL, "-limit",  0,
             "limit result set to N items", 0);
@@ -289,6 +289,6 @@
     psMetadata *revertwarpedArgs = psMetadataAlloc();
     // XXX need to allow multiple fake_ids
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", NULL);
+    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
+            "search by warptool ID", 0);
     psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-skycell_id",  0,
             "search by skycell ID", NULL);
@@ -296,12 +296,12 @@
             "searcy by tessellation ID", NULL);
     // XXX need to allow multiple fake_ids
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-fake_id",  0,
-            "search by fake_id", NULL);
+    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-fake_id",  0,
+            "search by fake_id", 0);
     // XXX need to allow multiple chip_ids
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", NULL);
+    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-chip_id",  0,
+            "search by chip_id", 0);
     // XXX need to allow multiple exp_ids
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
+    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-exp_id",  0,
+            "search by exp_id", 0);
     psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-exp_name",  0,
             "search by exp_name", NULL);
@@ -496,5 +496,5 @@
     // do this last so we don't setup a connection before CLI options are
     // validated
-    config->dbh = pmConfigDB(config->modules);
+    config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
     if (!config->dbh) {
         psError(PS_ERR_UNKNOWN, false, "Can't configure database");
