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 = " "; + 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); }