Index: /tags/ipp-20100823/ippTools/share/difftool_listrun.sql
===================================================================
--- /tags/ipp-20100823/ippTools/share/difftool_listrun.sql	(revision 29137)
+++ /tags/ipp-20100823/ippTools/share/difftool_listrun.sql	(revision 29138)
@@ -12,7 +12,5 @@
     diffRun.bothways,
     warp1,
-    stack1,
     warp2,
-    stack2,
     -- The following are only valid for warps
     -- XXX This needs to be more clever to handle diffs between stacks
Index: /tags/ipp-20100823/ippTools/share/magicdstool_completed_runs.sql
===================================================================
--- /tags/ipp-20100823/ippTools/share/magicdstool_completed_runs.sql	(revision 29137)
+++ /tags/ipp-20100823/ippTools/share/magicdstool_completed_runs.sql	(revision 29138)
@@ -1,4 +1,5 @@
 SELECT DISTINCT
     magic_ds_id,
+    magicked,
     re_place,
     label
@@ -7,7 +8,9 @@
 -- raw stage
 SELECT
-    magicDSRun.*
+    magicDSRun.*,
+    rawExp.magicked
     FROM magicDSRun
     JOIN rawImfile ON stage_id = rawImfile.exp_id
+    JOIN rawExp using(exp_id)
     LEFT JOIN magicDSFile
         ON magicDSRun.magic_ds_id = magicDSFile.magic_ds_id
@@ -25,7 +28,9 @@
 -- chip stage
 SELECT
-    magicDSRun.*
+    magicDSRun.*,
+    chipRun.magicked
     FROM magicDSRun
-    JOIN chipProcessedImfile ON stage_id = chip_id
+    JOIN chipRun ON stage_id = chip_id
+    JOIN chipProcessedImfile USING(chip_id)
     LEFT JOIN magicDSFile
         ON magicDSFile.magic_ds_id = magicDSRun.magic_ds_id
@@ -44,7 +49,9 @@
 -- camera stage
 SELECT
-    magicDSRun.*
+    magicDSRun.*,
+    camRun.magicked
     FROM magicDSRun
-    JOIN camProcessedExp ON stage_id = camProcessedExp.cam_id
+    JOIN camRun ON stage_id = camRun.cam_id
+    JOIN camProcessedExp ON camRun.cam_id = camProcessedExp.cam_id
     LEFT JOIN magicDSFile
         ON magicDSFile.magic_ds_id = magicDSRun.magic_ds_id
@@ -61,7 +68,9 @@
 -- warp stage
 SELECT
-    magicDSRun.*
+    magicDSRun.*,
+    warpRun.magicked
     FROM magicDSRun
-    JOIN warpSkyfile on stage_id = warp_id
+    JOIN warpRun on stage_id = warp_id
+    JOIN warpSkyfile USING(warp_id)
     LEFT JOIN magicDSFile
         ON magicDSRun.magic_ds_id = magicDSFile.magic_ds_id
@@ -81,10 +90,13 @@
 -- diff stage
 SELECT DISTINCT
-    magicDSRun.*
+    magicDSRun.*,
+    diffRun.magicked
     FROM magicDSRun
     JOIN magicRun USING (magic_id)
     JOIN magicInputSkyfile USING(magic_id)
+    JOIN diffRun
+        ON magicRun.diff_id = diffRun.diff_id
     JOIN diffSkyfile
-        ON magicRun.diff_id = diffSkyfile.diff_id
+        ON diffRun.diff_id = diffSkyfile.diff_id
         AND magicInputSkyfile.node = diffSkyfile.skycell_id
     LEFT JOIN magicDSFile
Index: /tags/ipp-20100823/ippTools/src/magicdstool.c
===================================================================
--- /tags/ipp-20100823/ippTools/src/magicdstool.c	(revision 29137)
+++ /tags/ipp-20100823/ippTools/src/magicdstool.c	(revision 29138)
@@ -933,4 +933,11 @@
     }
 
+    // treat limit == 0 as "no limit"
+    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");
@@ -950,22 +957,29 @@
         return true;
     }
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
     for (long i = 0; i < psArrayLength(output); i++) {
         psMetadata *row = output->data[i];
 
         psS64 magic_ds_id = psMetadataLookupS64(NULL, row, "magic_ds_id");
+        psS64 magicked =  psMetadataLookupS64(NULL, row, "magicked");
+        if (!psDBTransaction(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            return false;
+        }
 
         // if re_place, set stageRun.magicked
         bool setmagicked = psMetadataLookupBool(NULL, row, "re_place");
-        if (setmagicked && !setRunMagicked(config, magic_ds_id)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to change stageRun.magicked for magic_ds_id: %" PRId64,
-                magic_ds_id);
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
+        if (setmagicked) {
+            if (magicked <= 0) { 
+                if (!setRunMagicked(config, magic_ds_id)) {
+                    psError(PS_ERR_UNKNOWN, false, "failed to change stageRun.magicked for magic_ds_id: %" PRId64,
+                        magic_ds_id);
+                    if (!psDBRollback(config->dbh)) {
+                        psError(PS_ERR_UNKNOWN, false, "database error");
+                    }
+                    return false;
+                }
+            } else {
+                fprintf(stderr, "run is already marked as destreaked for magic_ds_id %" PRId64 "\n", magic_ds_id);
             }
-            return false;
         }
 
@@ -980,8 +994,8 @@
             return false;
         }
-    }
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
+        if (!psDBCommit(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            return false;
+        }
     }
 
