30d1f8c9ab3cc2a09c22e35ed257ab51f6bad901
tdreszer
  Tue Sep 13 11:26:57 2011 -0700
Added mdbPrint option to output ordered table of vars.
diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c
index d596093..8ee8fc0 100644
--- src/hg/lib/mdb.c
+++ src/hg/lib/mdb.c
@@ -1581,30 +1581,106 @@
 // prints objs and var=val pairs as formatted metadata lines or ra style
 {
 mdbObjPrintToStream(mdbObjs, raStyle, stdout);
 }
 
 void mdbObjPrintToFile(struct mdbObj *mdbObjs,boolean raStyle, char *file)
 // prints (to file) objs and var=val pairs as formatted metadata lines or ra style
 {
 FILE *f = mustOpen(file, "w");
 
 mdbObjPrintToStream(mdbObjs, raStyle, f);
 
 fclose(f);
 }
 
+void mdbObjPrintOrderedToStream(FILE *outF,struct mdbObj **mdbObjs,char *order, char *seperator, boolean header)
+// prints mdbObjs as a table, but only the vars listed in comma delimited order.
+// Examples of seperator: " " "\t\t" or "<TD>", in which case this is an HTML table.
+// mdbObjs list will be reordered. Sort fails when vars are missing in objs.
+{
+if (seperator == NULL)
+    seperator = " ";
+boolean html = FALSE;
+if (startsWith(seperator,"<T") || startsWith(seperator,"<t"))
+    {
+    if(!endsWith(seperator,">"))
+        errAbort("mdbObjPrintOrdered() seperator is invalid HTML '%s'.\n",seperator);
+    html = TRUE;
+    }
+
+if (!startsWithWordByDelimiter("obj"       ,',',order)
+&&  !startsWithWordByDelimiter("objName"   ,',',order)
+&&  !startsWithWordByDelimiter("metaObject",',',order))
+    mdbObjsSortOnVars(mdbObjs, order);
+
+struct slName *vars = slNameListFromString(order, ',');
+struct slName *var = NULL;
+
+if (html)
+    fprintf(outF, "<table>");
+if (header)
+    {
+    if (html)
+        fprintf(outF, "<tr>");
+    for (var = vars;var != NULL; var = var->next)
+        {
+        if (html)
+            fprintf(outF, "%s%s",seperator,var->name); // <td> is first
+        else
+            fprintf(outF, "%s%s",var->name,seperator);
+        if (html)
+            fprintf(outF, "</td>");
+        }
+    if (html)
+        fprintf(outF, "</tr>");
+    fprintf(outF, "\n");
+    }
+
+struct mdbObj *mdbObj = *mdbObjs;
+for (;mdbObj != NULL; mdbObj = mdbObj->next)
+    {
+    if (html)
+        fprintf(outF, "<tr>");
+    for (var = vars;var != NULL; var = var->next)
+        {
+        char *val = mdbObjFindValue(mdbObj, var->name);
+        if (val == NULL)
+            {
+            /*if (sameWord(var->name,"obj") || sameWord(var->name,"objName") || sameWord(var->name,"metaObject"))
+                val = mdbObj->obj;
+            else*/ if (html)
+                val = "&nbsp;";
+            else
+                val = " ";
+            }
+        if (html)
+            fprintf(outF, "%s%s",seperator,val); // <td> is first
+        else
+            fprintf(outF, "%s%s",val,seperator);
+        if (html)
+            fprintf(outF, "</td>");
+        }
+    if (html)
+        fprintf(outF, "</tr>");
+    fprintf(outF, "\n");
+    }
+
+if (html)
+    fprintf(outF, "</table>\n");
+}
+
 int mdbObjPrintToTabFile(struct mdbObj *mdbObjs, char *file)
 // prints all objs as tab delimited obj var val into file for SQL LOAD DATA.  Returns count.
 {
 FILE *tabFile = mustOpen(file, "w");
 int count = 0;
 
 struct mdbObj *mdbObj = NULL;
 for(mdbObj=mdbObjs;mdbObj!=NULL;mdbObj=mdbObj->next)
     {
     if(mdbObj->obj == NULL)
         continue;
 
     struct mdbVar *mdbVar = NULL;
     for(mdbVar=mdbObj->vars;mdbVar!=NULL;mdbVar=mdbVar->next)
         {
@@ -1752,31 +1828,35 @@
             break;
         }
     }
 if(mdbVar == NULL)
     return NULL;
 
 return mdbVar;
 }
 
 char *mdbObjFindValue(struct mdbObj *mdbObj, char *var)
 // Finds the val associated with the var or retruns NULL
 {
 struct mdbVar *mdbVar = mdbObjFind(mdbObj, var);
 
 if(mdbVar == NULL)
+    {
+    if (sameWord(var,"obj") || sameWord(var,"objName") || sameWord(var,"metaObject"))
+        return mdbObj->obj;
     return NULL;
+    }
 
 return mdbVar->val;
 }
 
 struct slName *mdbObjsFindAllVals(struct mdbObj *mdbObjs, char *var)
 // Returns a list of all vals in mdbObjs for a requested var
 {
 struct slName *vals = NULL;
 struct mdbObj *mdbObj = mdbObjs;
 for (;mdbObj != NULL;mdbObj = mdbObj->next)
     {
     char *val = mdbObjFindValue(mdbObj,var);
     if (val != NULL)
         slNameStore(&vals, val);
     }