58a3bf5fbc986db7c8b17589c9720b4bc6708133 tdreszer Tue Mar 8 16:44:22 2011 -0800 Moved a few functions common to track search and file search into library code. Redesigned a few things to standardize on slPair lists of vals and labels. diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c index a53df8a..a220ec6 100644 --- src/hg/hgApi/hgApi.c +++ src/hg/hgApi/hgApi.c @@ -1,24 +1,25 @@ /* hgApi - provide a JSON based API to the browser. */ #include "common.h" #include "hdb.h" #include "mdb.h" #include "cheapcgi.h" #include "hPrint.h" #include "dystring.h" #include "hui.h" +#include "searchTracks.h" static char const rcsid[] = "$Id: hgApi.c,v 1.3 2010/05/30 21:11:47 larrym Exp $"; static void fail(char *msg) { puts("Status: 400\n\n"); puts(msg); exit(-1); } void makeIndent(char *buf, int bufLen, int indent) { indent = min(indent, bufLen - 2); memset(buf, '\t', indent); buf[indent] = 0; @@ -94,87 +95,82 @@ boolean metaDbExists = sqlTableExists(conn, "metaDb"); if(metaDbExists) { char *var = cgiOptionalString("var"); if(var) var = sqlEscapeString(var); else fail("Missing var parameter"); struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, TRUE, FALSE); // Tables not files struct slPair *pair; dyStringPrintf(output, "[\n"); for (pair = pairs; pair != NULL; pair = pair->next) { if(pair != pairs) dyStringPrintf(output, ",\n"); - dyStringPrintf(output, "['%s','%s']", javaScriptLiteralEncode(pair->name), javaScriptLiteralEncode(pair->val)); + dyStringPrintf(output, "['%s','%s']", javaScriptLiteralEncode(mdbPairLabel(pair)), javaScriptLiteralEncode(mdbPairVal(pair))); } dyStringPrintf(output, "\n]\n"); } else fail("Assembly does not support metaDb"); } // TODO: move to lib since hgTracks and hgApi share #define METADATA_VALUE_PREFIX "hgt_mdbVal" else if(startsWith(METADATA_VALUE_PREFIX, cmd)) { // Returns metaDb value control: drop down or free text, with or without help link. // e.g. http://genome.ucsc.edu/hgApi?db=hg18&cmd=hgt_mdbVal3&var=cell // TODO: Move guts to lib, so that hgTracks::searchTracks.c and hgApi.c can share struct sqlConnection *conn = hAllocConn(database); boolean metaDbExists = sqlTableExists(conn, "metaDb"); if(metaDbExists) { char *var = cgiOptionalString("var"); if(var) var = sqlEscapeString(var); else fail("Missing var parameter"); int ix = atoi(cmd+strlen(METADATA_VALUE_PREFIX)); // 1 based index if(ix == 0) // fail("Unsupported 'cmd' parameter"); enum mdbCvSearchable searchBy = mdbCvSearchMethod(var); + char name[128]; + safef(name,sizeof name,"%s%i",METADATA_VALUE_PREFIX,ix); if (searchBy == cvsSearchBySingleSelect || searchBy == cvsSearchByMultiSelect) { - dyStringPrintf(output,"\n"); + if (slCount(pairs) > 0) + { + char *dropDownHtml = cgiMakeSelectDropList((searchBy == cvsSearchByMultiSelect), + name, pairs,NULL, ANYLABEL,"mdbVal", "style='min-width: 200px; font-size: .9em;' onchange='findTracksMdbValChanged(this);'"); + if (dropDownHtml) + { + dyStringAppend(output,dropDownHtml); + freeMem(dropDownHtml); + } slPairFreeList(&pairs); } + } else if (searchBy == cvsSearchByFreeText) { - dyStringPrintf(output,"", - METADATA_VALUE_PREFIX, ix); + dyStringPrintf(output,"", + name); } //else if (searchBy == cvsSearchByDateRange || searchBy == cvsSearchByDateRange) // { // // TO BE IMPLEMENTED // } else fail("Metadata variable not searchable"); dyStringPrintf(output," ",ix); } else fail("Assembly does not support metaDb"); } else if(!strcmp(cmd, "tableMetadata")) { // returns an html table with metadata for a given track