64cd3197e8c5507c2a3c0f1c4a5b28627183fd8b
tdreszer
Fri Mar 11 16:11:55 2011 -0800
Changed mdb API required this change.
diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c
index a220ec6..a4ff12d 100644
--- src/hg/hgApi/hgApi.c
+++ src/hg/hgApi/hgApi.c
@@ -1,248 +1,248 @@
/* 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;
}
static void trackJson(struct dyString *json, struct trackDb *tdb, int *count, int indent)
{
char tabs[100];
makeIndent(tabs, sizeof(tabs), indent);
if((*count)++)
dyStringPrintf(json, ",\n");
dyStringPrintf(json, "%s{\n", tabs);
makeIndent(tabs, sizeof(tabs), indent + 1);
dyStringPrintf(json, "%s\"track\": \"%s\",\n%s\"shortLabel\": \"%s\",\n%s\"longLabel\": \"%s\",\n%s\"group\": \"%s\"",
tabs, tdb->track,
tabs, tdb->shortLabel, tabs, tdb->longLabel,
tabs, tdb->grp);
if(tdbIsComposite(tdb) && tdb->subtracks != NULL)
{
struct trackDb *ptr;
dyStringPrintf(json, ",\n%s\"subtracks\":\n%s[\n", tabs, tabs);
int count = 0;
for (ptr = tdb->subtracks; ptr != NULL; ptr = ptr->next)
{
trackJson(json, ptr, &count, indent + 2);
}
dyStringPrintf(json, "\n%s]", tabs);
}
makeIndent(tabs, sizeof(tabs), indent);
dyStringPrintf(json, "\n%s}", tabs);
}
int main(int argc, char *argv[])
{
struct dyString *output = newDyString(10000);
char *database = cgiOptionalString("db");
char *cmd = cgiOptionalString("cmd");
char *jsonp = cgiOptionalString("jsonp");
if(database)
{
database = sqlEscapeString(database);
if(!hDbExists(database))
fail("Invalid database");
}
else
fail("Missing 'db' parameter");
if(!cmd)
fail("Missing 'cmd' parameter");
if(!strcmp(cmd, "trackList"))
{
// Return trackList for this assembly
// e.g. http://genome.ucsc.edu/hgApi?db=hg18&cmd=trackList
struct trackDb *tdb, *tdbList = NULL;
tdbList = hTrackDb(database);
dyStringPrintf(output, "[\n");
int count = 0;
for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
{
trackJson(output, tdb, &count, 1);
count++;
}
dyStringAppend(output, "\n]\n");
}
else if(!strcmp(cmd, "metaDb"))
{
// Return list of values for given metaDb var
// e.g. http://genome.ucsc.edu/hgApi?db=hg18&cmd=metaDb&var=cell
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");
- struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, TRUE, FALSE); // Tables not files
+ struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, FALSE, TRUE, FALSE); // not tags, yes 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(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)
{
- struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, TRUE, FALSE); // Tables not files
+ struct slPair *pairs = mdbValLabelSearch(conn, var, MDB_VAL_STD_TRUNCATION, FALSE, TRUE, FALSE); // not tags, yes tables, not files
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,"",
name);
}
- //else if (searchBy == cvsSearchByDateRange || searchBy == cvsSearchByDateRange)
- // {
- // // TO BE IMPLEMENTED
- // }
+ else if (searchBy == cvsSearchByDateRange || searchBy == cvsSearchByIntegerRange)
+ {
+ // 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
char *trackName = cgiOptionalString("track");
boolean showLonglabel = (NULL != cgiOptionalString("showLonglabel"));
boolean showShortLabel = (NULL != cgiOptionalString("showShortLabel"));
if (trackName != NULL)
{
struct trackDb *tdb = hTrackDbForTrackAndAncestors(database, trackName); // Doesn't get whole track list
if (tdb != NULL)
{
char * html = metadataAsHtmlTable(database,tdb,showLonglabel,showShortLabel,NULL);
if (html)
{
dyStringAppend(output,html);
freeMem(html);
}
else
dyStringPrintf(output,"No metadata found for track %s.",trackName);
}
else
dyStringPrintf(output,"Track %s not found",trackName);
}
else
dyStringAppend(output,"No track variable found");
}
else if(sameString(cmd, "codonToPos") || sameString(cmd, "exonToPos"))
{
char query[256];
struct sqlResult *sr;
char **row;
struct genePred *gp;
char *name = cgiString("name");
char *table = cgiString("table");
int num = cgiInt("num");
struct sqlConnection *conn = hAllocConn(database);
safef(query, sizeof(query), "select name, chrom, strand, txStart, txEnd, cdsStart, cdsEnd, exonCount, exonStarts, exonEnds from %s where name = '%s'", sqlEscapeString(table), sqlEscapeString(name));
sr = sqlGetResult(conn, query);
if ((row = sqlNextRow(sr)) != NULL)
{
gp = genePredLoad(row);
boolean found;
int start, end;
if(sameString(cmd, "codonToPos"))
found = codonToPos(gp, num, &start, &end);
else
found = exonToPos(gp, num, &start, &end);
if(found)
dyStringPrintf(output, "{\"pos\": \"%s:%d-%d\"}", gp->chrom, start + 1, end);
else
dyStringPrintf(output, "{\"error\": \"%d is an invalid %s for this gene\"}", num, sameString(cmd, "codonToPos") ? "codon" : "exon");
}
else
dyStringPrintf(output, "{\"error\": \"Couldn't find item: %s\"}", name);
sqlFreeResult(&sr);
hFreeConn(&conn);
}
else
{
warn("unknwon cmd: %s",cmd);
fail("Unsupported 'cmd' parameter");
}
// It's debatable whether the type should be text/plain, text/javascript or application/javascript; I think
// any of the types containing "javascript" don't work with IE6, so I'm using text/plain
puts("Content-Type:text/javascript\n");
//puts("\n");
if(jsonp)
printf("%s(%s)", jsonp, dyStringContents(output));
else
puts(dyStringContents(output));
return 0;
}