Index: /trunk/ippTools/src/pztool.c
===================================================================
--- /trunk/ippTools/src/pztool.c	(revision 6876)
+++ /trunk/ippTools/src/pztool.c	(revision 6877)
@@ -6,7 +6,8 @@
 static bool pendingMode(pxConfig *config);
 static bool copydoneMode(pxConfig *config);
-bool summitExpPrint(FILE *stream, summitExpRow *summitExp);
-psArray *pzsearchPendingImfiles(pxConfig *config);
-bool pzsearchFlushPendingExp(pxConfig *config);
+static bool summitExpPrint(FILE *stream, summitExpRow *summitExp);
+static psArray *pzsearchPendingExp(pxConfig *config);
+static psArray *pzsearchPendingImfiles(pxConfig *config);
+static bool pzsearchFlushPendingExp(pxConfig *config);
 
 int main(int argc, char **argv)
@@ -151,5 +152,5 @@
 }
 
-bool summitExpPrint(FILE *stream, summitExpRow *summitExp)
+static bool summitExpPrint(FILE *stream, summitExpRow *summitExp)
 {
     PS_ASSERT_PTR_NON_NULL(stream, false);
@@ -167,5 +168,19 @@
 }
 
-psArray *pzsearchPendingImfiles(pxConfig *config)
+static psArray *pzsearchPendingExp(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, NULL);
+
+    psArray *exps = pzPendingExpSelectRowObjects(config->dbh,
+        config->where, MAX_ROWS);
+    if (!exps) {
+        psError(PS_ERR_UNKNOWN, false, "no pzPendingExp rows found");
+        return NULL;
+    }
+
+    return exps;
+}
+
+static psArray *pzsearchPendingImfiles(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, NULL);
@@ -175,5 +190,4 @@
     if (!imfiles) {
         psError(PS_ERR_UNKNOWN, false, "no pzPendingImfile rows found");
-
         return NULL;
     }
@@ -182,8 +196,43 @@
 }
 
-bool pzsearchFlushPendingExp(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    return true;
-}
+static bool pzsearchFlushPendingExp(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psArray *pending = pzsearchPendingExp(config);
+    if (!pending) {
+        psError(PS_ERR_UNKNOWN, false, "no pzPendingExps found");
+        return false;
+    }
+
+    for (long i = 0; i < pending->n; i++) {
+        pzPendingExpRow *pendingExp = pending->data[i];
+
+        psMetadata *where = psMetadataAlloc();
+        psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==",
+            pendingExp->exp_id);
+        psArray *pendingImfiles = pzPendingImfileSelectRowObjects(config->dbh, where, MAX_ROWS);
+        psFree(where);
+
+        if (!pendingImfiles) {
+            // exp has no coresponding imfiles
+
+            // XXX start transaction
+
+            psArray *nukeMe = psArrayAlloc(1);
+            nukeMe->n = 0;
+            psArrayAdd(nukeMe, 0, pendingExp);
+            bool status = pzPendingExpDeleteRowObjects(config->dbh, nukeMe, MAX_ROWS);
+            psFree(nukeMe);
+            if (!status) {
+                psError(PS_ERR_UNKNOWN, false, "dbh access failed");
+                // XXX rollback transaction
+                return false;
+            }
+
+            // XXX commit transaction
+        }
+    }
+
+    return true;
+}
