7e0e8240e609a7ef43b3dccd39bc2b1de0266343 larrym Tue Feb 8 21:44:47 2011 -0800 support codonToPos and exonToPos diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c index cdaa9c3..42f5a33 100644 --- src/hg/hgApi/hgApi.c +++ src/hg/hgApi/hgApi.c @@ -39,32 +39,30 @@ 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); } -#define MDB_VAL_TRUNC_AT 64 - 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"); @@ -195,30 +193,60 @@ 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'", table, 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) + // change to using JSON. + dyStringPrintf(output, "%s:%d-%d", gp->chrom, start + 1, end); + } + else + errAbort("Couldn't find name: %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));