Index: trunk/ippTools/src/difftool.c
===================================================================
--- trunk/ippTools/src/difftool.c	(revision 34503)
+++ trunk/ippTools/src/difftool.c	(revision 34538)
@@ -97,6 +97,6 @@
         MODECASE(DIFFTOOL_MODE_DEFINEWARPWARP,        definewarpwarpMode);
         MODECASE(DIFFTOOL_MODE_DEFINESTACKSTACK,      definestackstackMode);
-	MODECASE(DIFFTOOL_MODE_TOSUMMARY,             tosummaryMode);
-	MODECASE(DIFFTOOL_MODE_ADDSUMMARY,            addsummaryMode);
+        MODECASE(DIFFTOOL_MODE_TOSUMMARY,             tosummaryMode);
+        MODECASE(DIFFTOOL_MODE_ADDSUMMARY,            addsummaryMode);
         MODECASE(DIFFTOOL_MODE_PENDINGCLEANUPRUN,     pendingcleanuprunMode);
         MODECASE(DIFFTOOL_MODE_PENDINGCLEANUPSKYFILE, pendingcleanupskyfileMode);
@@ -170,10 +170,10 @@
             exposure,
             false,
-	    NULL, // software version
-	    0,    // mask stat npix
-	    NAN,    // static
-	    NAN,    // dynamic
-	    NAN,    // magic
-	    NAN,    // advisory
+            NULL, // software version
+            0,    // mask stat npix
+            NAN,    // static
+            NAN,    // dynamic
+            NAN,    // magic
+            NAN,    // advisory
             diff_mode,
             note
@@ -579,7 +579,7 @@
     PXOPT_LOOKUP_F32(maskfrac_magic, config->args, "-maskfrac_magic", false, false);
     PXOPT_LOOKUP_F32(maskfrac_advisory, config->args, "-maskfrac_advisory", false, false);
-    
+
     psTrace("czw.test",1,"Received versions: pslib %s psmodules %s psphot %s ppstats %s ppsub %s streaks %s\n",
-	    ver_pslib,ver_psmodules,ver_psphot,ver_ppstats,ver_ppsub,ver_streaks);
+            ver_pslib,ver_psmodules,ver_psphot,ver_ppstats,ver_ppsub,ver_streaks);
     psString ver_code = NULL;
     if ((ver_pslib)&&(ver_psmodules)) {
@@ -631,11 +631,11 @@
                            fault,
                            quality,
-			   magicked,
-			   ver_code,
-			   maskfrac_npix,
-			   maskfrac_static,
-			   maskfrac_dynamic,
-			   maskfrac_magic,
-			   maskfrac_advisory
+                           magicked,
+                           ver_code,
+                           maskfrac_npix,
+                           maskfrac_static,
+                           maskfrac_dynamic,
+                           maskfrac_magic,
+                           maskfrac_advisory
           )) {
         if (!psDBRollback(config->dbh)) {
@@ -726,48 +726,48 @@
         psS64 magicked = psMetadataLookupS64(NULL, row, "magicked");
 
-	psString software_ver = NULL;
-	psS64 maskfrac_npix = 0;
-	psF32 maskfrac_static = 0;
-	psF32 maskfrac_dynamic = 0;
-	psF32 maskfrac_magic = 0;
-	psF32 maskfrac_advisory = 0;
-
-	// Calculate run level masking and software state
-	if (!pxCoalesceRunStatus(config,"difftool_coalesce_run.sql",diff_id,
-				 &software_ver,&maskfrac_npix,
-				 &maskfrac_static,&maskfrac_dynamic,
-				 &maskfrac_magic,&maskfrac_advisory)) {
-	  psError(PS_ERR_UNKNOWN, false, "failed to generate run level statistics");
-	  psFree(output);
-	  if (!psDBRollback(config->dbh)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	  }
-	  return(false);
-	}
-	// Set diffRun.software_ver to the appropriate value
-	if (software_ver) {
-	  if (!pxSetRunSoftware(config, "diffRun", "diff_id", diff_id, software_ver)) {
-	    psError(PS_ERR_UNKNOWN, false, "failed to set diffRun.software_ver for diff_id: %" PRId64,
-		    diff_id);
-	    psFree(output);
-	    if (!psDBRollback(config->dbh)) {
-	      psError(PS_ERR_UNKNOWN, false, "database error");
-	    }
-	    return(false);
-	  }
-	}
-	// Set diffRun.maskfrac* to the appropriate values.
-	if (maskfrac_npix) {
-	  if (!pxSetRunMaskfrac(config, "diffRun", "diff_id", diff_id, maskfrac_npix, maskfrac_static,
-				maskfrac_dynamic, maskfrac_magic, maskfrac_advisory)) {
-	    psError(PS_ERR_UNKNOWN, false, "failed to set diffRun.software_ver for diff_id: %" PRId64,
-		    diff_id);
-	    psFree(output);
-	    if (!psDBRollback(config->dbh)) {
-	      psError(PS_ERR_UNKNOWN, false, "database error");
-	    }
-	    return(false);
-	  }
-	}
+        psString software_ver = NULL;
+        psS64 maskfrac_npix = 0;
+        psF32 maskfrac_static = 0;
+        psF32 maskfrac_dynamic = 0;
+        psF32 maskfrac_magic = 0;
+        psF32 maskfrac_advisory = 0;
+
+        // Calculate run level masking and software state
+        if (!pxCoalesceRunStatus(config,"difftool_coalesce_run.sql",diff_id,
+                                 &software_ver,&maskfrac_npix,
+                                 &maskfrac_static,&maskfrac_dynamic,
+                                 &maskfrac_magic,&maskfrac_advisory)) {
+          psError(PS_ERR_UNKNOWN, false, "failed to generate run level statistics");
+          psFree(output);
+          if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+          }
+          return(false);
+        }
+        // Set diffRun.software_ver to the appropriate value
+        if (software_ver) {
+          if (!pxSetRunSoftware(config, "diffRun", "diff_id", diff_id, software_ver)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to set diffRun.software_ver for diff_id: %" PRId64,
+                    diff_id);
+            psFree(output);
+            if (!psDBRollback(config->dbh)) {
+              psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return(false);
+          }
+        }
+        // Set diffRun.maskfrac* to the appropriate values.
+        if (maskfrac_npix) {
+          if (!pxSetRunMaskfrac(config, "diffRun", "diff_id", diff_id, maskfrac_npix, maskfrac_static,
+                                maskfrac_dynamic, maskfrac_magic, maskfrac_advisory)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to set diffRun.software_ver for diff_id: %" PRId64,
+                    diff_id);
+            psFree(output);
+            if (!psDBRollback(config->dbh)) {
+              psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return(false);
+          }
+        }
         // set diffRun.state to 'full'
         if (!setdiffRunState(config, diff_id, "full", magicked)) {
@@ -857,5 +857,5 @@
         }
     }
-            
+
     // treat limit == 0 as "no limit"
     if (limit) {
@@ -1092,10 +1092,10 @@
             false,
             0,       // magicked
-	    NULL, // software version
-	    0,    // mask stat npix
-	    NAN,    // static
-	    NAN,    // dynamic
-	    NAN,    // magic
-	    NAN,    // advisory
+            NULL, // software version
+            0,    // mask stat npix
+            NAN,    // static
+            NAN,    // dynamic
+            NAN,    // magic
+            NAN,    // advisory
             diff_mode, // diff_mode
             note
@@ -1475,19 +1475,19 @@
         }
 
-	psString warp_data_group = psMetadataLookupStr(&mdok, row, "data_group");
-	if (!mdok) {
-	  psError(PXTOOLS_ERR_PROG, false, "warp data_group not found");
-	  psFree(warp2Query);
-	  psFree(stackQuery);
-	  psFree(skycell_query);
-	  if (!psDBRollback(config->dbh)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	  }
-	  return false;
-	}
-	if (!data_group && warp_data_group) {
-	  data_group = warp_data_group;
-	}
-	
+        psString warp_data_group = psMetadataLookupStr(&mdok, row, "data_group");
+        if (!mdok) {
+          psError(PXTOOLS_ERR_PROG, false, "warp data_group not found");
+          psFree(warp2Query);
+          psFree(stackQuery);
+          psFree(skycell_query);
+          if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+          }
+          return false;
+        }
+        if (!data_group && warp_data_group) {
+          data_group = warp_data_group;
+        }
+
         if (!p_psDBRunQueryF(config->dbh, skycell_query, stackQuery, warp_id, filter, warp2Query)) {
             psError(PS_ERR_UNKNOWN, false, "database error");
@@ -1515,6 +1515,6 @@
         // ok we've got one create the diffRun
         diffRunRow *run = diffRunRowAlloc(
-                0,	      // ID
-                "reg",	      // state
+                0,            // ID
+                "reg",        // state
                 workdir,
                 label,
@@ -1522,16 +1522,16 @@
                 dist_group,
                 reduction,
-                NULL,	      // dvodb
+                NULL,         // dvodb
                 registered,
                 tess_id,
                 bothways,     // bothways (default is false)
-                true,	      // exposure
-                0,	      // magicked
-		NULL,	      // software version
-		0,	      // mask stat npix
-		NAN,	      // static
-		NAN,	      // dynamic
-		NAN,	      // magic
-		NAN,	      // advisory
+                true,         // exposure
+                0,            // magicked
+                NULL,         // software version
+                0,            // mask stat npix
+                NAN,          // static
+                NAN,          // dynamic
+                NAN,          // magic
+                NAN,          // advisory
                 IPP_DIFF_MODE_WARP_STACK,
                 note
@@ -1562,5 +1562,6 @@
         psFree(query);
         query = NULL;
-        psStringAppend(&query, "INSERT INTO diffInputSkyfile SELECT * from skycellsToDiff");
+        psStringAppend(&query,
+                       "INSERT INTO diffInputSkyfile(diff_id, skycell_id, warp1, stack1, warp2, stack2, tess_id) SELECT diff_id, skycell_id, warp1, stack1, warp2, stack2, tess_id from skycellsToDiff");
         if (!p_psDBRunQuery(config->dbh, query)) {
             psError(PS_ERR_UNKNOWN, false, "database error");
@@ -1868,8 +1869,8 @@
         const char *template = psMetadataLookupStr(NULL, row, "template_warp_id");
         const char *tess_id = psMetadataLookupStr(NULL, row, "tess_id");
-	psString input_data_group = psMetadataLookupStr(NULL, row, "input_data_group");
-	if (!data_group) {
-	  data_group = input_data_group;
-	}
+        psString input_data_group = psMetadataLookupStr(NULL, row, "input_data_group");
+        if (!data_group) {
+          data_group = input_data_group;
+        }
 
         if (!input_id || !template || !tess_id) {
@@ -1883,5 +1884,5 @@
             return false;
         }
-	
+
         diffRunRow *run = diffRunRowAlloc(0,
                                           "reg",
@@ -1897,10 +1898,10 @@
                                           true,  // exposure
                                           false, // magicked
-					  NULL, // software version
-					  0,    // mask stat npix
-					  NAN,    // static
-					  NAN,    // dynamic
-					  NAN,    // magic
-					  NAN,    // advisory					 
+                                          NULL, // software version
+                                          0,    // mask stat npix
+                                          NAN,    // static
+                                          NAN,    // dynamic
+                                          NAN,    // magic
+                                          NAN,    // advisory
                                           IPP_DIFF_MODE_WARP_WARP,
                                           note); // Run to insert
@@ -1958,7 +1959,7 @@
             // seem to be a way to pass in NULL for skycell_id, stack1 and stack2
             psString dummyQuery = NULL;
-            psStringAppend(&dummyQuery, 
+            psStringAppend(&dummyQuery,
               "INSERT INTO diffInputSkyfile VALUES(%" PRId64 ", NULL, %s, NULL, %s, NULL, '%s', 0)",
-                    run->diff_id, 
+                    run->diff_id,
                     input,                      // warp1
                     template,                   // warp2
@@ -1980,5 +1981,5 @@
             psFree(dummyQuery);
             psString finishQuery = NULL;
-            psStringAppend( &finishQuery, 
+            psStringAppend( &finishQuery,
                 "UPDATE diffRun set state ='full', dist_group = NULL, note = 'dummy run - no overlap' WHERE diff_id = %" PRId64,
                 run->diff_id);
@@ -2063,5 +2064,5 @@
 
     if (!(label)) {
-	PXOPT_LOOKUP_STR(label,config->args, "-input_label",true,false);
+        PXOPT_LOOKUP_STR(label,config->args, "-input_label",true,false);
     }
 
@@ -2071,36 +2072,36 @@
 
     if (psListLength(stack1Where->list)) {
-	psString whereClause = psDBGenerateWhereConditionSQL(stack1Where, NULL);
-	psStringAppend(&stack1Query, "AND %s", whereClause);
-	psFree(whereClause);
-    } 
+        psString whereClause = psDBGenerateWhereConditionSQL(stack1Where, NULL);
+        psStringAppend(&stack1Query, "AND %s", whereClause);
+        psFree(whereClause);
+    }
     psFree(stack1Where);
 
     if (psListLength(stack2Where->list)) {
-	psString whereClause = psDBGenerateWhereConditionSQL(stack2Where, NULL);
-	psStringAppend(&stack2Query, "AND %s", whereClause);
-	psFree(whereClause);
-    } 
+        psString whereClause = psDBGenerateWhereConditionSQL(stack2Where, NULL);
+        psStringAppend(&stack2Query, "AND %s", whereClause);
+        psFree(whereClause);
+    }
     psFree(stack2Where);
-  
+
     // don't queue for stacks that have already been diffed unless requested
     psString diffQuery0 = NULL;
     psString diffQuery1 = NULL;
     if (! (reRun || newTemplates) ) {
-	psStringAppend(&diffQuery0, "AND diffExp.diff_id IS NULL");
-	psStringAppend(&diffQuery1, "HAVING n_diff = 0");
-    } 
+        psStringAppend(&diffQuery0, "AND diffExp.diff_id IS NULL");
+        psStringAppend(&diffQuery1, "HAVING n_diff = 0");
+    }
 
     // find the distinct set of data_groups and filters
     psString query = pxDataGet("difftool_definestackstack_part0.sql");
     if (!query) {
-	psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
-	return(false);
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+        return(false);
     }
     psTrace("difftool",1,query,stack2Query,stack1Query,diffQuery0,stack1Query);
 
     if (!psDBTransaction(config->dbh)) {
-	psError(PS_ERR_UNKNOWN, false, "database error");
-	return(false);
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return(false);
     }
 
@@ -2110,10 +2111,10 @@
 
     if (!p_psDBRunQuery(config->dbh, query)) {
-	psError(PS_ERR_UNKNOWN, false, "database error");
-	psFree(query);
-	if (!psDBRollback(config->dbh)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	}
-	return false;
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        return false;
     }
 
@@ -2122,41 +2123,41 @@
     psArray *output = p_psDBFetchResult(config->dbh);
     if (!output) {
-	psErrorCode err = psErrorCodeLast();
-	switch (err) {
-	  case PS_ERR_DB_CLIENT:
-	    psError(PXTOOLS_ERR_SYS, false, "database error");
-	    break;
-	  case PS_ERR_DB_SERVER:
-	    psError(PXTOOLS_ERR_PROG, false, "database error");
-	    break;
-	  default:
-	    psError(PXTOOLS_ERR_PROG, false, "unknown error");
-	    break;
-	}
-	if (!psDBRollback(config->dbh)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	}
-	return false;
+        psErrorCode err = psErrorCodeLast();
+        switch (err) {
+          case PS_ERR_DB_CLIENT:
+            psError(PXTOOLS_ERR_SYS, false, "database error");
+            break;
+          case PS_ERR_DB_SERVER:
+            psError(PXTOOLS_ERR_PROG, false, "database error");
+            break;
+          default:
+            psError(PXTOOLS_ERR_PROG, false, "unknown error");
+            break;
+        }
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        return false;
     }
     if (!psArrayLength(output)) {
-	psTrace("difftool", PS_LOG_INFO, "no rows found");
-	psFree(output);
-	if (!psDBCommit(config->dbh)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	    return false;
-	}
-	return true;
-    }
-
-    
+        psTrace("difftool", PS_LOG_INFO, "no rows found");
+        psFree(output);
+        if (!psDBCommit(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            return false;
+        }
+        return true;
+    }
+
+
     if (pretend) {
-	// negative simple so the default is true
-	if (!ippdbPrintMetadatas(stdout, output, "diffRunTemp", !simple)) {
-	    psError(PS_ERR_UNKNOWN, false, "failed to print array");
-	    psFree(output);
-	    return false;
-	}
-	psFree(output);
-	return true;
+        // negative simple so the default is true
+        if (!ippdbPrintMetadatas(stdout, output, "diffRunTemp", !simple)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print array");
+            psFree(output);
+            return false;
+        }
+        psFree(output);
+        return true;
     }
 
@@ -2165,168 +2166,168 @@
       query = pxDataGet("difftool_definestackstack_part1.sql");
 
-   
-	psMetadata *row = output->data[i]; // Output row from query
-	bool mdok;                      // Status of MD lookup
-
-	// psMetadataPrint(stderr, row, 1);
-
-	psString tess_id = psMetadataLookupStr(&mdok,row,"INPUT_tess_id");
-	psString this_data_group = psMetadataLookupStr(&mdok,row,"INPUT_data_group");
-	psString this_dist_group = psMetadataLookupStr(&mdok,row,"INPUT_dist_group");
-	psString this_label = psMetadataLookupStr(&mdok,row,"INPUT_label");
-
-	psString this_stack1Query = psStringCopy(stack1Query);
-
-	psString thisWhere = psDBGenerateWhereConditionSQL(row,NULL);
-	psStringSubstitute(&thisWhere,"stackRun.","INPUT_");
-	psStringAppend(&this_stack1Query,"AND %s", thisWhere);
-	psFree(thisWhere);
-
-	psStringSubstitute(&query, this_stack1Query, "@STACK1_QUERY@");
-	psStringSubstitute(&query, stack2Query,      "@STACK2_QUERY@");
-	psStringSubstitute(&query, diffQuery1,       "@DIFF1_QUERY@");
-
-	psTrace("difftool", 1, "%s", query);
-	if (!psDBTransaction(config->dbh)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	    return(false);
-	}
-
-	if (!p_psDBRunQuery(config->dbh, query)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	    psFree(query);
-	    if (!psDBRollback(config->dbh)) {
-		psError(PS_ERR_UNKNOWN, false, "database error");
-	    }
-	    return false;
-	}
-	psFree(this_stack1Query);
-
-	psArray *diff_id_output = p_psDBFetchResult(config->dbh);
-	if (!diff_id_output) {
-	    psErrorCode err = psErrorCodeLast();
-	    switch (err) {
-	      case PS_ERR_DB_CLIENT:
-		psError(PXTOOLS_ERR_SYS, false, "database error");
-		break;
-	      case PS_ERR_DB_SERVER:
-		psError(PXTOOLS_ERR_PROG, false, "database error");
-		break;
-	      default:
-		psError(PXTOOLS_ERR_PROG, false, "unknown error");
-		break;
-	    }
-	    if (!psDBRollback(config->dbh)) {
-		psError(PS_ERR_UNKNOWN, false, "database error");
-	    }
-	    return false;
-	}
-	if (!psArrayLength(diff_id_output)) {
-	    psTrace("difftool", PS_LOG_INFO, "no rows found");
-	    psFree(diff_id_output);
-	    if (!psDBCommit(config->dbh)) {
-		psError(PS_ERR_UNKNOWN, false, "database error");
-		return false;
-	    }
-	    return true;
-	}
-
-	// ok we've got one create the diffRun
-	diffRunRow *run = diffRunRowAlloc(
-	    0,          // ID
-	    "reg",      // state
-	    workdir,
-	    label ? label : this_label,
-	    data_group ? data_group : this_data_group,
-	    dist_group ? dist_group : this_dist_group,
-	    reduction,
-	    NULL,       // dvodb
-	    registered,
-	    tess_id,
-	    bothways,               // bothways
-	    false,                 // exposure
-	    0,       // magicked
-	    NULL, // software version
-	    0,    // mask stat npix
-	    NAN,    // static
-	    NAN,    // dynamic
-	    NAN,    // magic
-	    NAN,    // advisory				     
-	    IPP_DIFF_MODE_STACK_STACK, // diff_mode
-	    note
-	    );
-	// Commit to database
-	if (!diffRunInsertObject(config->dbh, run)) {
-	    psError(PS_ERR_UNKNOWN, false, "database error");
-	    psFree(run);
-	    if (!psDBRollback(config->dbh)) {
-		psError(PS_ERR_UNKNOWN, false, "database error");
-	    }
-	    return false;
-	}
-	// diffRunPrintObject(stdout,run,1);
-	run->diff_id = psDBLastInsertID(config->dbh);
-
-	for (long j = 0; j < diff_id_output->n; j++) {
-	    psMetadata *input_row = diff_id_output->data[j]; // Output row from query
-	    bool mdok;
-	    psString in_skycell_id  = psMetadataLookupStr(&mdok,input_row,"skycell_id");
-	    psS64 in_input_stack_id = psMetadataLookupS64(&mdok,input_row,"stack_id");
-	    psS64 in_template_stack_id = psMetadataLookupS64(&mdok,input_row,"max_stack_id");
-	    psString in_tess_id = psMetadataLookupStr(&mdok,input_row,"tess_id");
-	    psTrace("difftool",1,"%s %" PRId64 " %" PRId64 " %s\n",
-		    in_skycell_id, in_input_stack_id, in_template_stack_id, in_tess_id);
-	    diffInputSkyfileRow *input = diffInputSkyfileRowAlloc(
-		run->diff_id,   // ID
-		in_skycell_id,
-		PS_MAX_S64, // warp1_id -> NULL
-		in_input_stack_id, // stack1
-		PS_MAX_S64, // warp2_id -> NULL
-		in_template_stack_id, // stack2
-		in_tess_id,
-		0 // diff_skyfile_id
-		);
-
-	    // Commit to database the input
-	    if (!diffInputSkyfileInsertObject(config->dbh, input)) {
-		psError(PS_ERR_UNKNOWN, false, "database error");
-		psFree(input);
-		if (!psDBRollback(config->dbh)) {
-		    psError(PS_ERR_UNKNOWN, false, "database error");
-		}
-		return false;
-	    }
+
+        psMetadata *row = output->data[i]; // Output row from query
+        bool mdok;                      // Status of MD lookup
+
+        // psMetadataPrint(stderr, row, 1);
+
+        psString tess_id = psMetadataLookupStr(&mdok,row,"INPUT_tess_id");
+        psString this_data_group = psMetadataLookupStr(&mdok,row,"INPUT_data_group");
+        psString this_dist_group = psMetadataLookupStr(&mdok,row,"INPUT_dist_group");
+        psString this_label = psMetadataLookupStr(&mdok,row,"INPUT_label");
+
+        psString this_stack1Query = psStringCopy(stack1Query);
+
+        psString thisWhere = psDBGenerateWhereConditionSQL(row,NULL);
+        psStringSubstitute(&thisWhere,"stackRun.","INPUT_");
+        psStringAppend(&this_stack1Query,"AND %s", thisWhere);
+        psFree(thisWhere);
+
+        psStringSubstitute(&query, this_stack1Query, "@STACK1_QUERY@");
+        psStringSubstitute(&query, stack2Query,      "@STACK2_QUERY@");
+        psStringSubstitute(&query, diffQuery1,       "@DIFF1_QUERY@");
+
+        psTrace("difftool", 1, "%s", query);
+        if (!psDBTransaction(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            return(false);
+        }
+
+        if (!p_psDBRunQuery(config->dbh, query)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            psFree(query);
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+        psFree(this_stack1Query);
+
+        psArray *diff_id_output = p_psDBFetchResult(config->dbh);
+        if (!diff_id_output) {
+            psErrorCode err = psErrorCodeLast();
+            switch (err) {
+              case PS_ERR_DB_CLIENT:
+                psError(PXTOOLS_ERR_SYS, false, "database error");
+                break;
+              case PS_ERR_DB_SERVER:
+                psError(PXTOOLS_ERR_PROG, false, "database error");
+                break;
+              default:
+                psError(PXTOOLS_ERR_PROG, false, "unknown error");
+                break;
+            }
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+        if (!psArrayLength(diff_id_output)) {
+            psTrace("difftool", PS_LOG_INFO, "no rows found");
+            psFree(diff_id_output);
+            if (!psDBCommit(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+                return false;
+            }
+            return true;
+        }
+
+        // ok we've got one create the diffRun
+        diffRunRow *run = diffRunRowAlloc(
+            0,          // ID
+            "reg",      // state
+            workdir,
+            label ? label : this_label,
+            data_group ? data_group : this_data_group,
+            dist_group ? dist_group : this_dist_group,
+            reduction,
+            NULL,       // dvodb
+            registered,
+            tess_id,
+            bothways,               // bothways
+            false,                 // exposure
+            0,       // magicked
+            NULL, // software version
+            0,    // mask stat npix
+            NAN,    // static
+            NAN,    // dynamic
+            NAN,    // magic
+            NAN,    // advisory
+            IPP_DIFF_MODE_STACK_STACK, // diff_mode
+            note
+            );
+        // Commit to database
+        if (!diffRunInsertObject(config->dbh, run)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            psFree(run);
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+        // diffRunPrintObject(stdout,run,1);
+        run->diff_id = psDBLastInsertID(config->dbh);
+
+        for (long j = 0; j < diff_id_output->n; j++) {
+            psMetadata *input_row = diff_id_output->data[j]; // Output row from query
+            bool mdok;
+            psString in_skycell_id  = psMetadataLookupStr(&mdok,input_row,"skycell_id");
+            psS64 in_input_stack_id = psMetadataLookupS64(&mdok,input_row,"stack_id");
+            psS64 in_template_stack_id = psMetadataLookupS64(&mdok,input_row,"max_stack_id");
+            psString in_tess_id = psMetadataLookupStr(&mdok,input_row,"tess_id");
+            psTrace("difftool",1,"%s %" PRId64 " %" PRId64 " %s\n",
+                    in_skycell_id, in_input_stack_id, in_template_stack_id, in_tess_id);
+            diffInputSkyfileRow *input = diffInputSkyfileRowAlloc(
+                run->diff_id,   // ID
+                in_skycell_id,
+                PS_MAX_S64, // warp1_id -> NULL
+                in_input_stack_id, // stack1
+                PS_MAX_S64, // warp2_id -> NULL
+                in_template_stack_id, // stack2
+                in_tess_id,
+                0 // diff_skyfile_id
+                );
+
+            // Commit to database the input
+            if (!diffInputSkyfileInsertObject(config->dbh, input)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+                psFree(input);
+                if (!psDBRollback(config->dbh)) {
+                    psError(PS_ERR_UNKNOWN, false, "database error");
+                }
+                return false;
+            }
 
 /*       diffInputSkyfilePrintObject(stdout,input,1); */
-	    psFree(input);
-	}
-
-	if (!setdiffRunState(config, run->diff_id, "new", false)) {
-	    psError(PS_ERR_UNKNOWN, false, "failed to change diffRun.state for diff_id: %" PRId64, run->diff_id);
-	    psFree(stack1Query);
-	    psFree(stack2Query);
-	    psFree(diffQuery0);
-	    psFree(diffQuery1);
-	    psFree(run);
-	    psFree(list);
-	    if (!psDBRollback(config->dbh)) {
-		psError(PS_ERR_UNKNOWN, false, "database error");
-	    }
-	    return false;
-	}
-	psArrayAdd(list, list->n, run);
-	psFree(run);
+            psFree(input);
+        }
+
+        if (!setdiffRunState(config, run->diff_id, "new", false)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to change diffRun.state for diff_id: %" PRId64, run->diff_id);
+            psFree(stack1Query);
+            psFree(stack2Query);
+            psFree(diffQuery0);
+            psFree(diffQuery1);
+            psFree(run);
+            psFree(list);
+            if (!psDBRollback(config->dbh)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+            }
+            return false;
+        }
+        psArrayAdd(list, list->n, run);
+        psFree(run);
     }
 
     if (!psDBCommit(config->dbh)) {
-	psError(PS_ERR_UNKNOWN, false, "database error");
-	psFree(list);
-	return false;
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(list);
+        return false;
     }
 
     if (!diffRunPrintObjects(stdout, list, !simple)) {
-	psError(PS_ERR_UNKNOWN, false, "failed to print object");
-	psFree(list);
-	return false;
+        psError(PS_ERR_UNKNOWN, false, "failed to print object");
+        psFree(list);
+        return false;
     }
 
@@ -2340,7 +2341,7 @@
 
     if (!psDBCommit(config->dbh)) {
-	psError(PS_ERR_UNKNOWN, false, "database error");
-	psFree(list);
-	return false;
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(list);
+        return false;
     }
 
@@ -2350,5 +2351,5 @@
 static bool tosummaryMode(pxConfig *config) {
   PS_ASSERT_PTR_NON_NULL(config, NULL);
-  
+
   psMetadata *where = psMetadataAlloc();
   PXOPT_COPY_S64(config->args, where, "-warp_id",    "diffSkyfile.warp_id", "==");
@@ -2366,5 +2367,5 @@
   PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
   PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-  
+
   // find all rawImfiles matching the default query
   psString query = pxDataGet("difftool_tosummary.sql");
@@ -2381,5 +2382,5 @@
     return false;
   }
-  
+
   if (psListLength(where->list)) {
     psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
@@ -2390,5 +2391,5 @@
     return false;
   }
-  
+
   if (where2) {
     if (psListLength(where->list)) {
@@ -2406,5 +2407,5 @@
     psFree(limitString);
   }
-  
+
   if (!p_psDBRunQuery(config->dbh, query)) {
     psError(PS_ERR_UNKNOWN, false, "database error");
@@ -2425,5 +2426,5 @@
       psError(PXTOOLS_ERR_PROG, false, "unknown error");
     }
-    
+
     return false;
   }
@@ -2433,5 +2434,5 @@
     return true;
   }
-  
+
   if (psArrayLength(output)) {
     // negative simple so the default is true
@@ -2442,5 +2443,5 @@
     }
   }
-  
+
   psFree(output);
   return(true);
@@ -2464,5 +2465,5 @@
   }
   psS64 numUpdated = psDBAffectedRows(config->dbh);
-  
+
   if (numUpdated != 1) {
     psError(PS_ERR_UNKNOWN, false, "should have affected 1 row");
@@ -2470,9 +2471,9 @@
     return false;
   }
-  
+
   psFree(query);
 
   // Print anything here?
-  
+
   return(true);
 }
@@ -2514,5 +2515,5 @@
         psString limitString = psDBGenerateLimitSQL(limit);
         psStringAppend(&query, " %s", limitString);
-	psStringSubstitute(&query,limitString,"@INNERLIMITS@");
+        psStringSubstitute(&query,limitString,"@INNERLIMITS@");
         psFree(limitString);
 
@@ -3028,5 +3029,5 @@
 
     PXOPT_COPY_S64(config->args, where, "-template_exp_id", "rawTemplate.exp_id", "==");
-    
+
     PXOPT_LOOKUP_BOOL(template, config->args, "-template", false);
     if (!template) {
@@ -3083,5 +3084,5 @@
         }
     }
-            
+
     // treat limit == 0 as "no limit"
     if (limit) {
@@ -3148,5 +3149,5 @@
     PXOPT_LOOKUP_F64(mjd_obs_begin, config->args, "-mjd_obs_begin", false, false);
     PXOPT_LOOKUP_F64(mjd_obs_end, config->args, "-mjd_obs_end", false, false);
-    
+
     PXOPT_LOOKUP_BOOL(template, config->args, "-template", false);
 
@@ -3200,5 +3201,5 @@
         }
     }
-            
+
     // treat limit == 0 as "no limit"
     if (limit) {
