Index: trunk/ippTools/src/magictool.c
===================================================================
--- trunk/ippTools/src/magictool.c	(revision 14689)
+++ trunk/ippTools/src/magictool.c	(revision 15188)
@@ -296,22 +296,4 @@
 
 
-pxNode *pxTreeFromMagicTreeRows(psArray *rows)
-{
-    psHash *nodeNames = psHashAlloc(10);
-
-    for (long i = 0; i < psArrayLength(rows); i++) {
-        magicTreeRow *row = rows->data[i];
-        pxNode *parent = psHashLookup(nodeNames, row->dep);
-        pxNode *node = pxNodeAlloc(row->node, parent);
-        psHashAdd(nodeNames, row->node, node);
-        psFree(node);
-    }
-
-    pxNode *root = psHashLookup(nodeNames, "root");
-    psFree(nodeNames);
-
-    return root;
-}
-
 static bool toprocessMode(pxConfig *config)
 {
@@ -325,19 +307,57 @@
     }
 
-    psMetadata *where = NULL;
+    psString query = pxDataGet("magictool_toprocess.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+
     if (magic_id) {
         psMetadata *where = psMetadataAlloc();
         psMetadataAddS64(where, PS_LIST_TAIL, "magic_id", 0, "==", (psS64)atoll(magic_id));
-    }
-
-    psArray *rows = magicTreeSelectRowObjects(
-        config->dbh,
-        where,
-        0 // limit
-    );
-    psFree(where);
-
-    pxNode *root = pxTreeFromMagicTreeRows(rows);
-    psFree(rows);
+        psString whereClause = psDBGenerateWhereSQL(where, NULL);
+        psFree(where);
+        psStringAppend(&query, " %s", whereClause);
+        psFree(whereClause);
+    }
+
+    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;
+    }
+
+    psMetadata *deps = psMetadataAlloc();
+    // convert the array of metadata into a single flat metadata
+    for (long i = 0; i < psArrayLength(output); i++) {
+        psMetadataCopy(deps, output->data[i]);
+    }
+    psFree(output);
+
+    pxNode *root = pxTreeFromMetadata(deps);
+    psFree(deps);
+
     // silence unused warnings...
     if (root) {}
