Index: /trunk/ippTools/src/dettool.c
===================================================================
--- /trunk/ippTools/src/dettool.c	(revision 8375)
+++ /trunk/ippTools/src/dettool.c	(revision 8376)
@@ -2034,103 +2034,86 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
  
-    // det_id, class_id, uri, & recipe are required
-    bool status = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-        return false;
-    }
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return false;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-class_id is required");
-        return false;
-    }
-    psString uri    = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-
-    // iteration has a default value
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-
-    // correlate the class_id against the det_id's detStackedImfiles
-
-    // we have to generate our own where claus as we want to search only by the
-    // det_id & class_id
-    psMetadata *where = psMetadataAlloc();
-    if (!psMetadataAddS32(where, PS_LIST_TAIL, "det_id", 0, "==",
-            (psS32)atoi(det_id))) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-        psFree(where);
-        return false;
-    }
-    if (!psMetadataAddStr(where, PS_LIST_TAIL, "class_id", 0, "==", class_id)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
-        psFree(where);
-        return false;
-    }
-
-    psArray *stackedImfiles = detStackedImfileSelectRowObjects(
-                                config->dbh, where, 0);
-    psFree(where);
-
-    bool valid_class_id = false;
-    if (stackedImfiles) {
-        for (long i = 0; i < psArrayLength(stackedImfiles); i++) {
-            if (strcmp(class_id, 
-                ((detStackedImfileRow *)stackedImfiles->data[i])->class_id)
-            == 0) {
-                valid_class_id = true;
-                break;
+    // make sure that there is a respondoing entry in detNormalizedStatImfile
+    // select * from detNormalizedStatImfile
+    // by det_id, iteration, class_id
+    // where det_id, iteration, class_id is not in detNormalizedImfile
+    psString query = psStringCopy(
+        "SELECT DISTINCT"
+        "   detNormalizedStatImfile.*"
+        " FROM detNormalizedStatImfile"
+        " LEFT JOIN detNormalizedStatImfile"
+        "   USING(det_id, iteration, class_id)"
+        " WHERE"
+        "  detNormalizedImfile.det_id IS NULL" 
+        "  AND detNormalizedImfile.iteration IS NULL" 
+        "  AND detNormalizedImfile.class_id IS NULL" 
+        );
+
+# if 0
+    if (config->where) {
+        psString whereClaus = psDBGenerateWhereConditionSQL(config->where, "detStackedImfile");
+        psStringAppend(&query, " AND %s", whereClaus);
+        psFree(whereClaus);
+    }
+#endif
+
+    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) {
+        // XXX check psError here
+        psError(PS_ERR_UNKNOWN, false, "no pending rawDetrendExp rows found");
+        return false;
+    }
+
+    // start a transaction so it's all rows or nothing
+    if (!psDBTransaction(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(output);
+        return false;
+    }
+
+#if 0
+    for (long i = 0; i < psArrayLength(output); i++) {
+        psMetadata *row = output->data[i];
+        // convert metadata into a detStackedImfile object
+        detStackedImfileRow *stackedImfile = detStackedImfileObjectFromMetadata(row);
+        // convert detStackedImfile object into a detNormalizedStat object
+        detNormalizedStatImfileRow *stat = detStackedToDetNormalizedStatImfile(config, stackedImfile);
+        psFree(stackedImfile);
+        if (!stat) {
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
             }
-        }
-        psFree(stackedImfiles);
-    } 
-
-    if (!valid_class_id) {
-        psError(PS_ERR_UNKNOWN, true, 
-        "class_id can not be correlated with a detStackedImfile");
-        return false;
-    }
-
-    // create a new detNormalizedImfile object
-    detNormalizedImfileRow *masterImfile = detNormalizedImfileRowAlloc(
-        (psS32)atol(det_id), iteration, class_id, uri, recipe
-    );   
-
-    // insert the new row into the detProcessedImfile table
-    if (!detNormalizedImfileInsertObject(config->dbh, masterImfile)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to convert detStackedImfile to detNormalizedStatImfile");
+            psFree(output);
+            return false;
+        }
+        // insert detNormlized Stat object into the database
+        if (!detNormalizedStatImfileInsertObject(config->dbh, stat)) {
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            psFree(stat);
+            psFree(output);
+        }
+        psFree(stat);
+    }
+
+    psFree(output);
+
+    if (!psDBCommit(config->dbh)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(masterImfile);
-        return false; 
-    }
-
-    psFree(masterImfile);
+        return false;
+    }
+
+    return true;
+#endif
 
     return true;
@@ -2168,5 +2151,5 @@
 
     // mask out normalized imfiles that have residuals registered for them
-    psArray *residImfiles = detResidImfileAnalysisSelectRowObjects(config->dbh,
+    psArray *residImfiles = detResidImfileSelectRowObjects(config->dbh,
             config->where, 0);
     if (residImfiles) {
@@ -2176,13 +2159,13 @@
                 (((detNormalizedImfileRow *)normalizedImfiles->data[i])->det_id
                     ==
-                ((detResidImfileAnalysisRow *)residImfiles->data[j])->det_id)
+                ((detResidImfileRow *)residImfiles->data[j])->det_id)
                 &&
                 (((detNormalizedImfileRow *)normalizedImfiles->data[i])->iteration
                     ==
-                ((detResidImfileAnalysisRow *)residImfiles->data[j])->iteration)
+                ((detResidImfileRow *)residImfiles->data[j])->iteration)
                 &&
                 (strcmp(
                 ((detNormalizedImfileRow *)normalizedImfiles->data[i])->class_id,
-                ((detResidImfileAnalysisRow *)residImfiles->data[j])->class_id) == 0))
+                ((detResidImfileRow *)residImfiles->data[j])->class_id) == 0))
                  {
 
@@ -2427,5 +2410,5 @@
 
     // create a new detResidImfileRow and insert it
-    detResidImfileAnalysisRow *residImfile = detResidImfileAnalysisRowAlloc(
+    detResidImfileRow *residImfile = detResidImfileRowAlloc(
                 (psS32)atol(det_id),
                 iteration,
@@ -2438,5 +2421,5 @@
             );
 
-    if (!detResidImfileAnalysisInsertObject(config->dbh, residImfile)) {
+    if (!detResidImfileInsertObject(config->dbh, residImfile)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(residImfile);
@@ -2454,8 +2437,8 @@
 
     // no options are required... use the default where statement
-    psArray *residImfiles = detResidImfileAnalysisSelectRowObjects(config->dbh,
+    psArray *residImfiles = detResidImfileSelectRowObjects(config->dbh,
             config->where, 0);
     if (!residImfiles) {
-        psError(PS_ERR_UNKNOWN, false, "no detResidImfileAnalysis rows found");
+        psError(PS_ERR_UNKNOWN, false, "no detResidImfile rows found");
         return false;
     }
@@ -2473,5 +2456,5 @@
     // negative simple so the default is true
     if (residImfiles->n) {
-        if (!detResidImfileAnalysisPrintObjects(stdout, residImfiles, !simple)) {
+        if (!detResidImfilePrintObjects(stdout, residImfiles, !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(residImfiles);
@@ -2569,6 +2552,6 @@
     psFree(inputExp);
 
-    // create a new detResidExpAnalysis row and insert it
-    detResidExpAnalysisRow *residExp = detResidExpAnalysisRowAlloc(
+    // create a new detResidExpg row and insert it
+    detResidExpRow *residExp = detResidExpRowAlloc(
                 (psS32)atol(det_id),
                 iteration,
@@ -2579,5 +2562,5 @@
             );
 
-    if (!detResidExpAnalysisInsertObject(config->dbh, residExp)) {
+    if (!detResidExpInsertObject(config->dbh, residExp)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(residExp);
@@ -2595,8 +2578,8 @@
  
     // no options are required... use the default where statement
-    psArray *residExps = detResidExpAnalysisSelectRowObjects(config->dbh,
+    psArray *residExps = detResidExpSelectRowObjects(config->dbh,
             config->where, 0);
     if (!residExps) {
-        psError(PS_ERR_UNKNOWN, false, "no detResidExpAnalysis rows found");
+        psError(PS_ERR_UNKNOWN, false, "no detResidExpg rows found");
         return false;
     }
@@ -2614,5 +2597,5 @@
     // negative simple so the default is true
     if (residExps->n) {
-        if (!detResidExpAnalysisPrintObjects(stdout, residExps, !simple)) {
+        if (!detResidExpPrintObjects(stdout, residExps, !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(residExps);
