a7ad12187330204f9657482c84bebc349905bcc0 chmalee Tue May 27 16:22:26 2025 -0700 Make hgApi use the cart. This makes db=hub_id work on requests to allow genark bigGenePred zoomToExon/Codon to work, refs #35799 diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c index 25236948dab..bab23310ca7 100644 --- src/hg/hgApi/hgApi.c +++ src/hg/hgApi/hgApi.c @@ -30,38 +30,40 @@ #include "common.h" #include "hdb.h" #include "mdb.h" #include "cheapcgi.h" #include "htmshell.h" #include "hPrint.h" #include "dystring.h" #include "hui.h" #include "search.h" #include "cv.h" #include "api.h" #include "chromAlias.h" #include "bigBed.h" #include "trackHub.h" +#include "cart.h" -int main(int argc, char *argv[]) +struct hash *oldVars = NULL; + +void doMiddle(struct cart *cart) { long enteredMainTime = clock1000(); struct dyString *output = dyStringNew(10000); setUdcCacheDir(); -cgiSpoof(&argc, argv); pushWarnHandler(htmlVaBadRequestAbort); pushAbortHandler(htmlVaBadRequestAbort); char *database = cgiString("db"); char *cmd = cgiString("cmd"); char *jsonp = cgiOptionalString("jsonp"); if (!trackHubDatabase(database) && !hDbExists(database)) errAbort("Invalid database '%s'", database); if (!strcmp(cmd, "defaultPos")) { dyStringPrintf(output, "{\"pos\": \"%s\"}", hDefaultPos(database)); } else if (!strcmp(cmd, "metaDb")) { @@ -185,31 +187,31 @@ 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 = NULL; char *name = cgiString("name"); char *table = cgiString("table"); char *chrom = cgiString("chrom"); int num = cgiInt("num"); - struct sqlConnection *conn; + struct sqlConnection *conn = NULL; if (!trackHubDatabase(database)) conn = hAllocConn(database); struct trackDb *tdb = tdbForTrack(database, table, NULL); if (sameString(tdb->type, "genePred")) { sqlSafef(query, sizeof(query), "select name, chrom, strand, txStart, txEnd, cdsStart, cdsEnd, exonCount, exonStarts, exonEnds from %s where name = '%s' and chrom='%s'", table, name, chrom); sr = sqlGetResult(conn, query); row = sqlNextRow(sr); gp = genePredLoad(row); sqlFreeResult(&sr); } else if (sameString(tdb->type, "bigGenePred") || startsWith("bigGenePred", tdb->type)) // makes knownGene work { // TODO: what bigBed types can we even support? bigBed12 at a minimum for the blocks? @@ -233,17 +235,28 @@ 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"); hFreeConn(&conn); } else { warn("unknown cmd: %s",cmd); errAbort("Unsupported 'cmd' parameter"); } apiOut(dyStringContents(output), jsonp); cgiExitTime("hgApi", enteredMainTime); +} + +/* Null terminated list of CGI Variables we don't want to save + * permanently. */ +char *excludeVars[] = {"fileSearch", "var", "showShortLabel", "showLongLabel", "track", "table", "name", "chrom", "cmd", "num", NULL,}; + +int main(int argc, char *argv[]) +/* Process command line. */ +{ +cgiSpoof(&argc, argv); +cartEmptyShellNoContent(doMiddle, hUserCookie(), excludeVars, oldVars); return 0; }