Index: /trunk/ippTools/src/magictool.c
===================================================================
--- /trunk/ippTools/src/magictool.c	(revision 14688)
+++ /trunk/ippTools/src/magictool.c	(revision 14689)
@@ -296,7 +296,51 @@
 
 
+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)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    bool status = false;
+    psString magic_id = psMetadataLookupStr(&status, config->args, "-magic_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magic_id");
+        return false;
+    }
+
+    psMetadata *where = NULL;
+    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);
+    // silence unused warnings...
+    if (root) {}
+
     return true;
 }
