Index: trunk/ippTools/src/pztool.c
===================================================================
--- trunk/ippTools/src/pztool.c	(revision 16361)
+++ trunk/ippTools/src/pztool.c	(revision 16362)
@@ -651,4 +651,68 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_STR(config->args, where,  "-exp_name", "exp_name", "==");
+    PXOPT_COPY_STR(config->args, where, "-inst", "inst", "==");
+    PXOPT_COPY_STR(config->args, where, "-telescope", "telescope", "==");
+    PXOPT_COPY_STR(config->args, where,  "-class", "class", "==");
+    PXOPT_COPY_STR(config->args, where,  "-class_id", "class_id", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
+
+    psString query = psStringCopy("SELECT * FROM pzDoneImfile");
+
+    if (faulted) {
+        // list only faulted rows
+        psStringAppend(&query, " %s", "WHERE pzDoneImfile.fault != 0");
+    } else {
+        // don't list faulted rows
+        psStringAppend(&query, " %s", "WHERE pzDoneImfile.fault = 0");
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "pzDoneImfile");
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree(where);
+
+    // treat limit == 0 as "no limit"
+    if (limit) {
+        psString limitString = psDBGenerateLimitSQL(limit);
+        psStringAppend(&query, " %s", limitString);
+        psFree(limitString);
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    psArray *output = p_psDBFetchResult(config->dbh);
+    if (!output) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+    if (!psArrayLength(output)) {
+        psTrace("pztool", PS_LOG_INFO, "no rows found");
+        psFree(output);
+        return true;
+    }
+
+    // negative simple so the default is true
+    if (!ippdbPrintMetadatas(stdout, output, "chipPendingImfile", !simple)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print array");
+        psFree(output);
+        return false;
+    }
+
+    psFree(output);
+
     return true;
 }
Index: trunk/ippTools/src/pztoolConfig.c
===================================================================
--- trunk/ippTools/src/pztoolConfig.c	(revision 16361)
+++ trunk/ippTools/src/pztoolConfig.c	(revision 16362)
@@ -128,9 +128,9 @@
     psMetadata *copiedArgs = psMetadataAlloc();
     psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-exp_name", 0,
-            "define exposure ID (required)", NULL); 
+            "define exposure ID", NULL); 
     psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID (required)", NULL); 
+            "define camera ID", NULL); 
     psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID (required)", NULL); 
+            "define telescope ID", NULL); 
     psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-class", 0,
             "define class", NULL);
@@ -139,4 +139,6 @@
     psMetadataAddBool(copiedArgs, PS_LIST_TAIL, "-faulted",  0,
             "only return imfiles with a fault status set", false);
+    psMetadataAddU64(copiedArgs, PS_LIST_TAIL, "-limit",  0,
+            "limit result set to N items", 0);
     psMetadataAddBool(copiedArgs, PS_LIST_TAIL, "-simple",  0,
             "use the simple output format", false);
