Index: trunk/ippTools/src/pxtools.c
===================================================================
--- trunk/ippTools/src/pxtools.c	(revision 27417)
+++ trunk/ippTools/src/pxtools.c	(revision 28043)
@@ -46,4 +46,119 @@
     if (!strcmp(state, "scrubbed")) return true;
     return false;
+}
+
+psString pxMergeCodeVersions(psString version1, psString version2) {
+  psString out = NULL;
+
+  bool mod1 = false;
+  bool mod2 = false;
+
+  psS32 num1;
+  psS32 num2;
+  psS32 numO;
+
+  if (!version1) {
+    psStringAppend(&out,version2);
+    return(out);
+  }
+  if (!version2) {
+    psStringAppend(&out,version1);
+    return(out);
+  }
+  
+  if (strchr(version1,'M')) {
+    psStringSubstitute(&version1,"M","");
+    mod1 = true;
+  }
+  if (strchr(version2,'M')) {
+    psStringSubstitute(&version2,"M","");
+    mod2 = true;
+  }
+
+  num1 = strtol(version1,NULL,10);
+  num2 = strtol(version2,NULL,10);
+
+  if (num1 >= num2) {
+    numO = num1;
+  }
+  else {
+    numO = num2;
+  }
+  
+  psStringAppend(&out,"%" PRId32,numO);
+  if (mod1 || mod2) {
+    psStringAppend(&out,"M");
+  }
+  return(out);
+}
+
+bool pxCoalesceRunStatus(pxConfig *config, const psString dbQFile, psS64 stage_id, psString *software_ver,
+			 psS32 *maskfrac_npix, psF32 *maskfrac_static, psF32 *maskfrac_dynamic,
+			 psF32 *maskfrac_magic, psF32 *maskfrac_advisory) {
+  psString query = pxDataGet(dbQFile);
+/*   psString text_id = NULL; */
+/*   psStringAppend(&text_id," %" PRId64,stage_id); */
+/*   psStringSubstitute(&query,text_id,"@STAGE_ID@"); */
+/*   psFree(text_id); */
+  if (!p_psDBRunQueryF(config->dbh, query, stage_id)) {
+    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);
+  }
+  
+  for (long i = 0; i < psArrayLength(output); i++) {
+    psMetadata *row = output->data[i];
+
+    psS32 this_npix = psMetadataLookupS32(NULL, row, "maskfrac_npix");
+    psF32 this_static = psMetadataLookupF32(NULL, row, "maskfrac_static");
+    psF32 this_dynamic = psMetadataLookupF32(NULL, row, "maskfrac_dynamic");
+    psF32 this_magic = psMetadataLookupF32(NULL, row, "maskfrac_magic");
+    psF32 this_advisory = psMetadataLookupF32(NULL, row, "maskfrac_advisory");
+    psString this_version = psMetadataLookupStr(NULL, row, "software_ver");
+
+    *software_ver = pxMergeCodeVersions(*software_ver,this_version);
+
+    *maskfrac_static = ((*maskfrac_static * *maskfrac_npix) + (this_npix * this_static)) / (this_npix + *maskfrac_npix);
+    *maskfrac_dynamic = ((*maskfrac_dynamic * *maskfrac_npix) + (this_npix * this_dynamic)) / (this_npix + *maskfrac_npix);
+    *maskfrac_magic = ((*maskfrac_magic * *maskfrac_npix) + (this_npix * this_magic)) / (this_npix + *maskfrac_npix);
+    *maskfrac_advisory = ((*maskfrac_advisory * *maskfrac_npix) + (this_npix * this_advisory)) / (this_npix + *maskfrac_npix);
+    *maskfrac_npix += this_npix;
+  }
+  psFree(output);
+  return(true);
+}
+
+bool pxSetRunSoftware(pxConfig *config, const psString tableName, const psString stage_id_name, const psS64 stage_id,
+		      psString software_ver) {
+  char *query = "UPDATE %s SET software_ver = '%s' WHERE %s = %" PRId64;
+  printf(query,tableName,software_ver,stage_id_name,stage_id);
+  if (!p_psDBRunQueryF(config->dbh,query,tableName,software_ver,stage_id_name,stage_id)) {
+    psError(PS_ERR_UNKNOWN, false,
+	    "failed to set software version for %s %" PRId64,stage_id_name,stage_id);
+    return(false);
+  }
+  
+  return(true);
+}
+bool pxSetRunMaskfrac(pxConfig *config, const psString tableName, const psString stage_id_name, const psS64 stage_id,
+		      psS32 maskfrac_npix, psF32 maskfrac_static, psF32 maskfrac_dynamic,
+		      psF32 maskfrac_magic, psF32 maskfrac_advisory) {
+  char *query = "UPDATE %s SET maskfrac_npix = %d, maskfrac_static = %f, maskfrac_dynamic = %f, maskfrac_magic = %f, maskfrac_advisory = %f WHERE %s = %" PRId64;
+  if (!p_psDBRunQueryF(config->dbh,query,tableName,maskfrac_npix,maskfrac_static,
+		       maskfrac_dynamic, maskfrac_magic,maskfrac_advisory,stage_id_name,stage_id)) {
+    psError(PS_ERR_UNKNOWN, false,
+	    "failed to set maskfrac stats for %s %" PRId64,stage_id_name,stage_id);
+    return(false);
+  }
+  
+
+
+  return(true);
 }
 
