Index: branches/haf_branches/ipp.20100512/ippTools/src/addtool.c
===================================================================
--- branches/haf_branches/ipp.20100512/ippTools/src/addtool.c	(revision 28058)
+++ branches/haf_branches/ipp.20100512/ippTools/src/addtool.c	(revision 28102)
@@ -44,4 +44,5 @@
 static bool listminidvodbrunMode(pxConfig *config);
 static bool flipminidvodbrunMode(pxConfig *config);
+static bool checkminidvodbrunaddrunMode(pxConfig *config);
 static bool addminidvodbprocessedMode(pxConfig *config);
 static bool listminidvodbprocessedMode(pxConfig *config);
@@ -83,4 +84,5 @@
  	MODECASE(ADDTOOL_MODE_LISTMINIDVODBRUN,     listminidvodbrunMode);
 	MODECASE(ADDTOOL_MODE_FLIPMINIDVODBRUN,     flipminidvodbrunMode);
+	MODECASE(ADDTOOL_MODE_CHECKMINIDVODBRUNADDRUN, checkminidvodbrunaddrunMode);
 	MODECASE(ADDTOOL_MODE_ADDMINIDVODBPROCESSED,addminidvodbprocessedMode);
    	MODECASE(ADDTOOL_MODE_LISTMINIDVODBPROCESSED,listminidvodbprocessedMode);
@@ -771,70 +773,129 @@
   // required
 
+  PXOPT_LOOKUP_STR(minidvodb_group, config->args, "-set_minidvodb_group", true, false);
+  PXOPT_LOOKUP_STR(mergedvodb_path, config->args, "-set_mergedvodb_path", true, false);
+
+
+ PXOPT_LOOKUP_STR(minidvodb_name, config->args, "-set_minidvodb_name", false, false);
   
-
-  PXOPT_LOOKUP_STR(minidvodb_name, config->args, "-set_minidvodb_name", false, false);
-  PXOPT_LOOKUP_STR(minidvodb_group, config->args, "-set_minidvodb_group", true, false);
-  PXOPT_LOOKUP_STR(minidvodb_path, config->args, "-set_minidvodb_path", false, false);
-  PXOPT_LOOKUP_STR(mergedvodb_path, config->args, "-set_mergedvodb_path", true, false);
+ PXOPT_LOOKUP_STR(minidvodb_path, config->args, "-set_minidvodb_path", false, false);
+  
   PXOPT_LOOKUP_STR(state, config->args, "-set_state", false, false);
-  psMetadata *where = psMetadataAlloc();
-
-  PXOPT_COPY_S64(config->args, where, "-set_minidvodb_name",  "minidvodb_name", "==");
-  PXOPT_COPY_S64(config->args, where, "-set_minidvodb_path",  "minidvodb_path", "==");
-  PXOPT_COPY_STR(config->args, where, "-set_mergedvodb_path",  "mergedvodb_path", "==");
-  //PXOPT_COPY_S255(config->args, where, "-set_state",  "state", "==");
-
-  //generate restrictions
-  //psString query = pxDataGet("addtool_queue_minidvodbrun.sql");
-  //if (!query) {
-  //    psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
-  //    return false;
-  // }
-
-  //if ((!minidvodb_name) && (!minidvodb_path) && (!mergedvodb_path) ) {
-  // psError(PXTOOLS_ERR_SYS, false, "need minidvodb_path, mergedvodb_path, and minidvodb_name");
-  //}
-
-    psString query =  NULL;
-    psStringAppend(&query, "INSERT INTO minidvodbRun SET minidvodb_path = '%s' ,",minidvodb_path);
-    if (minidvodb_name) {psStringAppend(&query, "minidvodb_name = '%s' ,",minidvodb_name);}
-    psStringAppend(&query, "mergedvodb_path = '%s',",mergedvodb_path);
-    if (minidvodb_path) {psStringAppend(&query, "minidvodb_group = '%s'",minidvodb_group);}
-    if (state) {
-      psStringAppend(&query, ",state = '%s';", state);
-    } else {
-      psStringAppend(&query, ",state = 'new';");
-    }
-    
-    
-if (!query) {
-      psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+ 
+
+    if (!psDBTransaction(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        
+        return false;
+    }
+ //psMetadata *where = psMetadataAlloc();
+
+  //PXOPT_COPY_S64(config->args, where, "-set_minidvodb_name",  "minidvodb_name", "==");
+  // PXOPT_COPY_S64(config->args, where, "-set_minidvodb_path",  "minidvodb_path", "==");
+  //PXOPT_COPY_STR(config->args, where, "-set_mergedvodb_path",  "mergedvodb_path", "==");
+  
+
+  //  psString query =  NULL;
+  //   psStringAppend(&query, "INSERT INTO minidvodbRun SET minidvodb_path = '%s' ,",minidvodb_path);
+  //  if (minidvodb_name) {psStringAppend(&query, "minidvodb_name = '%s' ,",minidvodb_name);}
+  //   psStringAppend(&query, "mergedvodb_path = '%s',",mergedvodb_path);
+  //   if (minidvodb_path) {psStringAppend(&query, "minidvodb_group = '%s'",minidvodb_group);}
+  //   if (state) {
+  //     psStringAppend(&query, ",state = '%s';", state);
+  //   } else {
+  //     psStringAppend(&query, ",state = 'new';");
+      //     //   }
+    
+    
+	//if (!query) {
+      //     psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+      //      return false;
+  //  }
+
+  //if (!p_psDBRunQuery(config->dbh, query)) {
+      //     psError(PS_ERR_UNKNOWN, false, "database error %s", query);
+  //     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("addtool", PS_LOG_INFO, "no rows found");
+	//      psFree(output);
+  //     return true;
+	//  }
+  //if (!psDBTransaction(config->dbh)) {
+  //       psError(PS_ERR_UNKNOWN, false, "database error");
+  //       psFree(output);
+  //     return false;
+	//	//  }
+  psString minidvodbpath = "NULL";
+
+
+  // I don't know how to get around the complaints of minidvodb_path can't be null. this 'fixes' it, but someone smarter can fix it properly.
+  if (minidvodb_path) {
+    minidvodbpath = minidvodb_path;
+  }
+
+if (!minidvodbRunInsert(config->dbh,
+            0, // job_id
+            minidvodb_name,
+            minidvodb_group,
+	    minidvodbpath,
+            mergedvodb_path,
+            "new"            
+            )) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+ 
+    psU64 affected = psDBAffectedRows(config->dbh);
+    if (affected != 1) {
+      psError(PS_ERR_UNKNOWN, false,
+            "should have affected one row but %" PRIu64 " rows were modified",
+            affected);
       return false;
-   }
-
+    }
+
+    psS64 minidvodb_id = psDBLastInsertID(config->dbh);
+    printf("%" PRId64 "\n", minidvodb_id);
+    
+    
+    if (!minidvodb_name) {
+      psStringAppend(&minidvodb_name, "%s.%" PRIu64,minidvodb_group,minidvodb_id);
+    }
+
+
+
+    if (!minidvodb_path) {
+      psStringAppend(&minidvodb_path,"%s/%s",mergedvodb_path,minidvodb_name);
+      
+    }
+
+    
+    psString query = NULL;
+
+    psStringAppend(&query, "UPDATE minidvodbRun SET minidvodb_path = '%s', minidvodb_name = '%s' where minidvodb_id = %" PRIu64";", minidvodb_path, minidvodb_name, minidvodb_id);
+    
     if (!p_psDBRunQuery(config->dbh, query)) {
-      psError(PS_ERR_UNKNOWN, false, "database error %s", query);
-        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("addtool", PS_LOG_INFO, "no rows found");
-        psFree(output);
-        return true;
-    }
-if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
-
-return true;
+      psError(PS_ERR_UNKNOWN, false, "database error");
+      psFree(query);
+      return false;
+    }
+
+    
+
+    if (!psDBCommit(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+
+    return true;
 }
 
@@ -940,6 +1001,18 @@
 // and the active - > waiting in one action
 
+
+// the first query looks to find things that are new and where all the fields are filled (ie, ready to be flipped to active)
  
- psString firstquery = psStringCopy("SELECT * from  minidvodbRun where state = 'new' ");
+// start a transaction eraly so it will contain any row level locks
+    if (!psDBTransaction(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+
+
+
+
+ psString firstquery = psStringCopy("SELECT * from  minidvodbRun where state = 'new' and minidvodb_name is NOT NULL and minidvodb_group IS NOT NULL and minidvodb_path IS NOT NULL and mergedvodb_path IS NOT NULL");
 
  psString firstwhereClause = psDBGenerateWhereConditionSQL(where, NULL);
@@ -949,7 +1022,10 @@
 
  if (!p_psDBRunQuery(config->dbh, firstquery)) {
-      psError(PS_ERR_UNKNOWN, false, "database error ");
-        psFree(firstquery);
-        return false;
+   psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+   if (!psDBRollback(config->dbh)) {
+     psError(PS_ERR_UNKNOWN, false, "database error");
+   }
+   return false;
+
     }
  psFree(firstquery);
@@ -985,20 +1061,24 @@
 
  if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-
-if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
-
-
-
-
-
-psString query2 = psStringCopy("UPDATE minidvodbRun SET state = 'active' WHERE state = 'new' ");
+   psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+   if (!psDBRollback(config->dbh)) {
+     psError(PS_ERR_UNKNOWN, false, "database error");
+   }
+   return false;
+
+   
+    }
+
+ //if (!psDBTransaction(config->dbh)) {
+ //      psError(PS_ERR_UNKNOWN, false, "database error");
+ //      psFree(output);
+ //     return false;
+ //  }
+
+
+
+
+
+psString query2 = psStringCopy("UPDATE minidvodbRun SET state = 'active' WHERE state = 'new' AND minidvodb_name is NOT NULL and minidvodb_group IS NOT NULL and minidvodb_path IS NOT NULL and mergedvodb_path IS NOT NULL ");
 
 
@@ -1008,20 +1088,24 @@
 
  if (!p_psDBRunQuery(config->dbh, query2)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query2);
-        return false;
-    }
-
-if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
+   psError(PS_ERR_UNKNOWN, false, "database error");
+   if (!psDBRollback(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+   }
+   psFree(query);
+   return false;
+
+    }
+
+
 
 
 
 if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
+  psError(PS_ERR_UNKNOWN, false, "database error");
+  if (!psDBRollback(config->dbh)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+  }
+  psFree(query);
+  return false;
     }
  psFree(query2);
@@ -1031,4 +1115,81 @@
 
 }
+
+
+static bool checkminidvodbrunaddrunMode(pxConfig *config) {
+  PS_ASSERT_PTR_NON_NULL(config, false);
+  psMetadata *where = psMetadataAlloc();
+  PXOPT_COPY_STR(config->args, where, "-minidvodb_group", "minidvodbRun.minidvodb_group", "==");
+  PXOPT_COPY_STR(config->args, where, "-minidvodb_name", "minidvodbRun.minidvodb_name", "==");
+  PXOPT_COPY_STR(config->args, where, "-state", "minidvodbRun.state", "==");
+  
+
+  PXOPT_LOOKUP_U64(limit,      config->args, "-limit", false, false);
+  PXOPT_LOOKUP_BOOL(all_addrun_states, config->args, "-all_addrun_states", false);
+  PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+  
+  if (!psListLength(where->list)) {
+        psFree(where);
+        psError(PXTOOLS_ERR_CONFIG, false, "search parameters are required");
+        return false;
+  }
+
+  psString query = pxDataGet("addtool_checkminidvodbaddrun.sql");
+  
+  if (!query) {
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+        return false;
+  }
+  
+  
+  if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&query, " WHERE %s", whereClause);
+	psFree(whereClause);
+  }
+
+  if (!all_addrun_states) {
+    psStringAppend(&query, " AND (cnt2 = cnt) ");
+  }
+  
+  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("addtool", PS_LOG_INFO, "no rows found");
+  psFree(output);
+  return true;
+ }
+
+ if (!ippdbPrintMetadatas(stdout, output, "addProcessedExp", !simple)) {
+   psError(PS_ERR_UNKNOWN, false, "failed to print array");
+   psFree(output);
+   return false;
+ }
+
+ psFree(output);
+
+
+  return true;
+}
+
 
 
Index: branches/haf_branches/ipp.20100512/ippTools/src/addtool.h
===================================================================
--- branches/haf_branches/ipp.20100512/ippTools/src/addtool.h	(revision 28058)
+++ branches/haf_branches/ipp.20100512/ippTools/src/addtool.h	(revision 28102)
@@ -44,4 +44,5 @@
     ADDTOOL_MODE_LISTMINIDVODBRUN,
     ADDTOOL_MODE_FLIPMINIDVODBRUN,
+    ADDTOOL_MODE_CHECKMINIDVODBRUNADDRUN,
     ADDTOOL_MODE_ADDMINIDVODBPROCESSED,
     ADDTOOL_MODE_LISTMINIDVODBPROCESSED,
Index: branches/haf_branches/ipp.20100512/ippTools/src/addtoolConfig.c
===================================================================
--- branches/haf_branches/ipp.20100512/ippTools/src/addtoolConfig.c	(revision 28058)
+++ branches/haf_branches/ipp.20100512/ippTools/src/addtoolConfig.c	(revision 28102)
@@ -149,5 +149,5 @@
     psMetadataAddStr(addminidvodbrunArgs, PS_LIST_TAIL, "-set_minidvodb_name",        0, "define minidvodb_name", NULL);
     psMetadataAddStr(addminidvodbrunArgs, PS_LIST_TAIL, "-set_minidvodb_group",        0, "define minidvodb_group (required)", NULL);
-    psMetadataAddStr(addminidvodbrunArgs, PS_LIST_TAIL, "-set_minidvodb_path",        0, "define path for minidvodb (required)", NULL);
+    psMetadataAddStr(addminidvodbrunArgs, PS_LIST_TAIL, "-set_minidvodb_path",        0, "define path for minidvodb", NULL);
     psMetadataAddStr(addminidvodbrunArgs, PS_LIST_TAIL, "-set_mergedvodb_path",        0, "define path for the merged dvodb (required)", NULL);
     psMetadataAddStr(addminidvodbrunArgs, PS_LIST_TAIL, "-set_state",        0, "define state", NULL);
@@ -177,6 +177,14 @@
     //psMetadataAddBool(listminidvodbrunArgs, PS_LIST_TAIL, "-finished_addrun",        0, "limit to minidvodbs with completed addRuns (none in new state)", false);
 
-psMetadata *flipminidvodbrunArgs = psMetadataAlloc();
- psMetadataAddStr(flipminidvodbrunArgs, PS_LIST_TAIL, "-minidvodb_group",     0,    "for the supplied minidvodb_group (required): flip the current 'new' to 'active', the current 'active' to 'waiting'", NULL);
+    psMetadata *flipminidvodbrunArgs = psMetadataAlloc();
+    psMetadataAddStr(flipminidvodbrunArgs, PS_LIST_TAIL, "-minidvodb_group",     0,    "for the supplied minidvodb_group (required): flip the current 'new' to 'active', the current 'active' to 'waiting'", NULL);
+    
+    psMetadata *checkminidvodbrunaddrunArgs = psMetadataAlloc();
+    psMetadataAddStr(checkminidvodbrunaddrunArgs, PS_LIST_TAIL, "-minidvodb_group",     0,    "for the supplied minidvodb_group (required): check if the addRun stage is complete (all in addRun.state = full) ", NULL);
+    psMetadataAddStr(checkminidvodbrunaddrunArgs, PS_LIST_TAIL, "-minidvodb_name",     0,    "for the supplied minidvodb_name: check if the addRun stage is complete (all in addRun.state = full) ", NULL);
+    psMetadataAddStr(checkminidvodbrunaddrunArgs, PS_LIST_TAIL, "-state",     0,    "limit by minidvodbRun state ", NULL);
+    psMetadataAddU64(checkminidvodbrunaddrunArgs, PS_LIST_TAIL, "-limit",        0, "limit to N items", 0);
+    psMetadataAddBool(checkminidvodbrunaddrunArgs, PS_LIST_TAIL, "-simple",        0, "simple output", false);
+    psMetadataAddBool(checkminidvodbrunaddrunArgs, PS_LIST_TAIL, "-all_addrun_states",        0, "list all minidvodbRun.minidvodb_names, not just ones that have complete addRuns", false);
 
     psMetadata *addminidvodbprocessedArgs = psMetadataAlloc();
@@ -226,5 +234,6 @@
     PXOPT_ADD_MODE("-updateminidvodbrun",   "change minidvodb properties",          ADDTOOL_MODE_UPDATEMINIDVODBRUN,     updateminidvodbrunArgs);
     PXOPT_ADD_MODE("-listminidvodbrun",     "list minidvodbs",                      ADDTOOL_MODE_LISTMINIDVODBRUN,       listminidvodbrunArgs);
-PXOPT_ADD_MODE("-flipminidvodbrun",     "flip minidvodbs",                      ADDTOOL_MODE_FLIPMINIDVODBRUN,       flipminidvodbrunArgs);
+    PXOPT_ADD_MODE("-flipminidvodbrun",     "flip minidvodbs",                      ADDTOOL_MODE_FLIPMINIDVODBRUN,       flipminidvodbrunArgs);
+    PXOPT_ADD_MODE("-checkminidvodbrunaddrun",     "check minidvodbs to see if addRuns are completed",                      ADDTOOL_MODE_CHECKMINIDVODBRUNADDRUN,       checkminidvodbrunaddrunArgs);
     PXOPT_ADD_MODE("-addminidvodbprocessed","add a processed minidvodb",            ADDTOOL_MODE_ADDMINIDVODBPROCESSED,  addminidvodbprocessedArgs);
     PXOPT_ADD_MODE("-listminidvodbprocessed","list processed minidvodbs",           ADDTOOL_MODE_LISTMINIDVODBPROCESSED, listminidvodbprocessedArgs);
