Index: trunk/ippTools/share/pxadmin_create_tables.sql
===================================================================
--- trunk/ippTools/share/pxadmin_create_tables.sql	(revision 18518)
+++ trunk/ippTools/share/pxadmin_create_tables.sql	(revision 18520)
@@ -719,10 +719,63 @@
 CREATE TABLE diffInputSkyfile (diff_id BIGINT, template TINYINT, stack_id BIGINT, warp_id BIGINT, skycell_id VARCHAR(64), tess_id VARCHAR(64), kind VARCHAR(64), PRIMARY KEY(diff_id, template), KEY(stack_id), KEY(warp_id), KEY(skycell_id), KEY(tess_id), KEY(kind), FOREIGN KEY (diff_id)  REFERENCES  diffRun(diff_id), FOREIGN KEY (stack_id)  REFERENCES  stackSumSkyfile(stack_id), FOREIGN KEY (warp_id, skycell_id, tess_id)  REFERENCES  warpSkyfile(warp_id, skycell_id, tess_id)) ENGINE=innodb DEFAULT CHARSET=latin1;
 CREATE TABLE diffSkyfile (diff_id BIGINT, uri VARCHAR(255), path_base VARCHAR(255), bg DOUBLE, bg_stdev DOUBLE, stamps_num INT, stamps_rms FLOAT, sources INT, dtime_diff FLOAT, hostname VARCHAR(64), good_frac FLOAT, fault SMALLINT, PRIMARY KEY(diff_id), KEY(good_frac), KEY(fault), FOREIGN KEY (diff_id)  REFERENCES  diffRun(diff_id)) ENGINE=innodb DEFAULT CHARSET=latin1;
-CREATE TABLE magicRun (magic_id BIGINT AUTO_INCREMENT, state VARCHAR(64), workdir VARCHAR(255), workdir_state VARCHAR(255), label VARCHAR(64), dvodb VARCHAR(255), registered DATETIME, PRIMARY KEY(magic_id), KEY(magic_id), KEY(state), KEY(workdir_state), KEY(label)) ENGINE=innodb DEFAULT CHARSET=latin1;
-CREATE TABLE magicInputSkyfile (magic_id BIGINT, diff_id BIGINT, node VARCHAR(64), PRIMARY KEY(magic_id, diff_id), FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id), FOREIGN KEY (diff_id)  REFERENCES  diffRun(diff_id)) ENGINE=innodb DEFAULT CHARSET=latin1;
-CREATE TABLE magicTree (magic_id BIGINT, node VARCHAR(64), dep VARCHAR(64), KEY(magic_id), KEY(node), KEY(dep), INDEX(magic_id, node), FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id)) ENGINE=innodb DEFAULT CHARSET=latin1;
-CREATE TABLE magicNodeResult (magic_id BIGINT, node VARCHAR(64), uri VARCHAR(255), PRIMARY KEY(magic_id, node), FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id), FOREIGN KEY (magic_id, node)  REFERENCES  magicTree(magic_id, node)) ENGINE=innodb DEFAULT CHARSET=latin1;
-CREATE TABLE magicMask (magic_id BIGINT, uri VARCHAR(255), PRIMARY KEY(magic_id), FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id)) ENGINE=innodb DEFAULT CHARSET=latin1;
-CREATE TABLE magicSkyfileMask (magic_id BIGINT, diff_id BIGINT, uri VARCHAR(255), PRIMARY KEY(magic_id, diff_id), KEY(uri), FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id), FOREIGN KEY (magic_id, diff_id)  REFERENCES  magicInputSkyfile(magic_id, diff_id), FOREIGN KEY (magic_id)  REFERENCES  magicMask(magic_id)) ENGINE=innodb DEFAULT CHARSET=latin1;
+
+CREATE TABLE magicRun (
+	magic_id BIGINT AUTO_INCREMENT,
+	state VARCHAR(64),
+	workdir VARCHAR(255),
+	workdir_state VARCHAR(255),
+	label VARCHAR(64),
+	dvodb VARCHAR(255),
+	registered DATETIME,
+	fault SMALLINT,
+	PRIMARY KEY(magic_id),
+	KEY(magic_id),
+	KEY(state),
+	KEY(workdir_state),
+	KEY(label),
+	KEY(fault)
+) ENGINE=innodb DEFAULT CHARSET=latin1;
+
+CREATE TABLE magicInputSkyfile (
+	magic_id BIGINT,
+	diff_id BIGINT,
+	node VARCHAR(64),
+	PRIMARY KEY(magic_id, diff_id),
+	FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id),
+	FOREIGN KEY (diff_id)  REFERENCES  diffRun(diff_id)
+) ENGINE=innodb DEFAULT CHARSET=latin1;
+
+CREATE TABLE magicTree (
+	magic_id BIGINT,
+	node VARCHAR(64),
+	dep VARCHAR(64),
+	KEY(magic_id),
+	KEY(node),
+	KEY(dep),
+	INDEX(magic_id, node),
+	FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id)
+) ENGINE=innodb DEFAULT CHARSET=latin1;
+
+CREATE TABLE magicNodeResult (
+	magic_id BIGINT,
+	node VARCHAR(64),
+	uri VARCHAR(255),
+	fault SMALLINT,
+	PRIMARY KEY(magic_id, node),
+	FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id),
+	FOREIGN KEY (magic_id, node)  REFERENCES  magicTree(magic_id, node),
+	KEY(fault)
+) ENGINE=innodb DEFAULT CHARSET=latin1;
+
+CREATE TABLE magicMask (
+	magic_id BIGINT,
+	uri VARCHAR(255),
+	streaks INT,
+	fault SMALLINT,
+	PRIMARY KEY(magic_id),
+	FOREIGN KEY (magic_id)  REFERENCES  magicRun(magic_id),
+	KEY(fault)
+) ENGINE=innodb DEFAULT CHARSET=latin1;
+
 CREATE TABLE calDB (cal_id BIGINT AUTO_INCREMENT, dvodb VARCHAR(64), state VARCHAR(64), PRIMARY KEY(cal_id), KEY(cal_id)) ENGINE=innodb DEFAULT CHARSET=latin1;
 CREATE TABLE calRun (cal_id BIGINT AUTO_INCREMENT, region VARCHAR(64), last_step VARCHAR(64), state VARCHAR(64), PRIMARY KEY(cal_id), KEY(cal_id), KEY(last_step), FOREIGN KEY (cal_id)  REFERENCES  calDB(cal_id)) ENGINE=innodb DEFAULT CHARSET=latin1;
Index: trunk/ippTools/src/magictool.c
===================================================================
--- trunk/ippTools/src/magictool.c	(revision 18518)
+++ trunk/ippTools/src/magictool.c	(revision 18520)
@@ -41,6 +41,4 @@
 static bool tomaskMode(pxConfig *config);
 static bool addmaskMode(pxConfig *config);
-static bool toskyfilemaskMode(pxConfig *config);
-static bool addskyfilemaskMode(pxConfig *config);
 
 static bool setmagicRunState(pxConfig *config, psS64 magic_id, const char *state);
@@ -75,6 +73,4 @@
         MODECASE(MAGICTOOL_MODE_TOMASK,         tomaskMode);
         MODECASE(MAGICTOOL_MODE_ADDMASK,        addmaskMode);
-        MODECASE(MAGICTOOL_MODE_TOSKYFILEMASK,  toskyfilemaskMode);
-        MODECASE(MAGICTOOL_MODE_ADDSKYFILEMASK, addskyfilemaskMode);
         default:
             psAbort("invalid option (this should not happen)");
@@ -211,5 +207,6 @@
                 NULL,       // label
                 NULL,       // dvodb
-                NULL        // registered
+                NULL,       // registered
+                0           // fault
         );
         if (!run) {
@@ -262,5 +259,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required 
+    // required
     PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
 
@@ -278,15 +275,16 @@
             label,
             dvodb,
-            registered
+            registered,
+            0
     );
     psFree(registered);
     if (!run) {
         psError(PS_ERR_UNKNOWN, false, "failed to alloc magicRun object");
-        return true;
+        return false;
     }
     if (!magicRunInsertObject(config->dbh, run)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(run);
-        return true;
+        return false;
     }
 
@@ -444,5 +442,5 @@
         return false;
     }
-    
+
     return true;
 }
@@ -491,5 +489,5 @@
         return false;
     }
-    
+
     return true;
 }
@@ -589,5 +587,5 @@
         return true;
     }
-     
+
     psHash *forest = psHashAlloc(psArrayLength(magicTree));
 
@@ -642,10 +640,16 @@
     PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
     PXOPT_LOOKUP_STR(node, config->args, "-node", true, false);
-    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+
+    // optional
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
+
+    // default values
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     if (!magicNodeResultInsert(config->dbh,
-                (psS64)atoll(magic_id),
-                node,
-                uri
+                               (psS64)atoll(magic_id),
+                               node,
+                               uri,
+                               code
         )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -726,93 +730,17 @@
     // required
     PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
-    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+
+    // optional
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
+    PXOPT_LOOKUP_S32(streaks, config->args, "-streaks", false, false);
+
+    // default values
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     if (!magicMaskInsert(config->dbh,
-                (psS64)atoll(magic_id),
-                uri
-        )) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-
-static bool toskyfilemaskMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-
-    psString query = pxDataGet("magictool_toskyfilemask.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    // 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");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
-
-    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");
-            case PS_ERR_DB_SERVER:
-                psError(PXTOOLS_ERR_PROG, false, "database error");
-            default:
-                psError(PXTOOLS_ERR_PROG, false, "unknown error");
-        }
-
-        return false;
-    }
-    if (!psArrayLength(output)) {
-        psTrace("magictool", PS_LOG_INFO, "no rows found");
-        psFree(output);
-        return true;
-    }
-
-    if (psArrayLength(output)) {
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "toskyfilemask", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool addskyfilemaskMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
-    PXOPT_LOOKUP_STR(diff_id, config->args, "diff_id", true, false);
-    PXOPT_LOOKUP_STR(uri, config->args, "uri", true, false);
-
-    if (!magicSkyfileMaskInsert(config->dbh,
-                (psS64)atoll(magic_id),
-                (psS64)atoll(diff_id),
-                uri
+                         (psS64)atoll(magic_id),
+                         uri,
+                         streaks,
+                         code
         )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
Index: trunk/ippTools/src/magictool.h
===================================================================
--- trunk/ippTools/src/magictool.h	(revision 18518)
+++ trunk/ippTools/src/magictool.h	(revision 18520)
@@ -35,6 +35,4 @@
     MAGICTOOL_MODE_TOMASK,
     MAGICTOOL_MODE_ADDMASK,
-    MAGICTOOL_MODE_TOSKYFILEMASK,
-    MAGICTOOL_MODE_ADDSKYFILEMASK,
 } MAGICtoolMode;
 
Index: trunk/ippTools/src/magictoolConfig.c
===================================================================
--- trunk/ippTools/src/magictoolConfig.c	(revision 18518)
+++ trunk/ippTools/src/magictoolConfig.c	(revision 18520)
@@ -104,4 +104,5 @@
     psMetadataAddStr(inputtreeArgs, PS_LIST_TAIL, "-dep_file", 0,
             "order of operations dep. file (required)", NULL);
+    psMetadataAddS16(inputtreeArgs, PS_LIST_TAIL, "-code",  0, "set fault code", 0);
 
     // -tooprocess
@@ -121,5 +122,6 @@
             "define symbolic node name (required)", NULL);
     psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-uri",  0,
-            "define URI (required)", NULL);
+            "define URI", NULL);
+    psMetadataAddS16(addresultArgs, PS_LIST_TAIL, "-code",  0, "set fault code", 0);
 
     // -tomask
@@ -134,24 +136,6 @@
     psMetadataAddStr(addmaskArgs, PS_LIST_TAIL, "-magic_id", 0,
             "define magictool ID (required)", NULL);
-    psMetadataAddStr(addmaskArgs, PS_LIST_TAIL, "-uri",  0,
-            "define URI (required)", NULL);
-
-    // -toskyfilemask
-    psMetadata *toskyfilemaskArgs = psMetadataAlloc();
-    psMetadataAddStr(toskyfilemaskArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "search by magic ID", NULL);
-    psMetadataAddU64(toskyfilemaskArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(toskyfilemaskArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-
-    // -addskyfilemask
-    psMetadata *addskyfilemaskArgs = psMetadataAlloc();
-    psMetadataAddStr(addskyfilemaskArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "define magictool ID (required)", NULL);
-    psMetadataAddStr(addskyfilemaskArgs, PS_LIST_TAIL, "-diff_id",  0,
-            "define difftool ID (required)", NULL);
-    psMetadataAddStr(addskyfilemaskArgs, PS_LIST_TAIL, "-uri",  0,
-            "define URI (required)", NULL);
+    psMetadataAddStr(addmaskArgs, PS_LIST_TAIL, "-uri",  0, "define URI", NULL);
+    psMetadataAddS32(addmaskArgs, PS_LIST_TAIL, "-uri",  0, "define number of streaks", 0);
 
     psFree(now);
@@ -170,6 +154,4 @@
     PXOPT_ADD_MODE("-tomask",          "", MAGICTOOL_MODE_TOMASK,          tomaskArgs);
     PXOPT_ADD_MODE("-addmask",         "", MAGICTOOL_MODE_ADDMASK,         addmaskArgs);
-    PXOPT_ADD_MODE("-toskyfilemask",   "", MAGICTOOL_MODE_TOSKYFILEMASK,   toskyfilemaskArgs);
-    PXOPT_ADD_MODE("-addskyfilemask",  "", MAGICTOOL_MODE_ADDSKYFILEMASK,  addskyfilemaskArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
