940408c6bd688d9a804588cdd80051c73d6d13c2 kate Tue Apr 10 23:45:28 2012 -0700 hgEncodeApi and hgApi cleanup complete diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c index a6cdda5..ae5a8b6 100644 --- src/hg/hgApi/hgApi.c +++ src/hg/hgApi/hgApi.c @@ -10,156 +10,50 @@ jsonp: if present, the returned json is wrapped in a call to the value of the jsonp parameter (e.g. "jsonp=parseResponse"). Supported commands: defaultPos: default position for this assembly metaDb: return list of values for metaDb parameter hgt_mdbVal: return metaDb value control - see code for details tableMetadata: returns an html table with metadata for track parameter codonToPos: returns genomic position for given codon; parameters: codon, table and name (which is gene name). codonToPos: returns genomic position for given exon; parameters: exon, table and name (which is gene name). - -cv: Return list of CV terms for the specified term type; just supporting cellType, dataType, and antibody initially - e.g. http://genome.ucsc.edu/cgi-bin/hgApi?db=hg19&cmd=cv&file=cv.ra&type=dataType - */ #include "common.h" #include "hdb.h" #include "mdb.h" #include "cheapcgi.h" #include "hPrint.h" #include "dystring.h" #include "hui.h" #include "search.h" -#include "encode/encodeExp.h" #include "cv.h" - -static void encodeExpJson(struct dyString *json, struct encodeExp *el) -/* Print out encodeExp in JSON format. Manually converted from autoSql which outputs - * to file pointer. - */ -// TODO: move to lib/encode/encodeExp.c, extend autoSql to support, and use json*() functions -{ -dyStringPrintf(json, "{"); -dyStringPrintf(json, "\"ix\":%u", el->ix); -dyStringPrintf(json, ", "); -dyStringPrintf(json, "\"organism\":\"%s\"", el->organism); -dyStringPrintf(json, ", "); -dyStringPrintf(json, "\"lab\":\"%s\"", el->lab); -dyStringPrintf(json, ", "); -dyStringPrintf(json, "\"dataType\":\"%s\"", el->dataType); -dyStringPrintf(json, ", "); -dyStringPrintf(json, "\"cellType\":\"%s\"", el->cellType); -dyStringPrintf(json, ", "); -/* TODO: expand expVars to elements */ -dyStringPrintf(json, "\"expVars\":\"%s\"", el->expVars); -dyStringPrintf(json, ", "); -dyStringPrintf(json, "\"accession\":\"%s\"", el->accession); -dyStringPrintf(json, "}"); -} - -static void cvTermJson(struct dyString *json, char *type, struct hash *termHash) -/* Print out CV term in JSON format. Currently just supports dataType, cellType, antibody - * and antibody types */ -// TODO: move to lib/cv.c -{ -dyStringPrintf(json, "{"); -dyStringPrintf(json, "\"term\":\"%s\"", (char *)hashFindVal(termHash, "term")); -dyStringPrintf(json, ","); - -if (sameString(type, "dataType")) - { - dyStringPrintf(json, "\"label\":\"%s\"", (char *)hashOptionalVal(termHash, "label", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"dataGroup\":\"%s\"", (char *)hashOptionalVal(termHash, "dataGroup", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"description\":\"%s\"", (char *)hashOptionalVal(termHash, "description", "unknown")); - } -else if (sameString(type, "cellType")) - { - dyStringPrintf(json, "\"description\":\""); - // TODO: handle modularly - dyStringAppendEscapeQuotes(json, (char *)hashOptionalVal(termHash, "description", "unknown"), '"', '\\'); - dyStringPrintf(json, "\","); - dyStringPrintf(json, "\"tier\":\"%s\"", (char *)hashOptionalVal(termHash, "tier", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"karyotype\":\""); - dyStringAppendEscapeQuotes(json, (char *)hashOptionalVal(termHash, "karyotype", "unknown"), '"', '\\'); - dyStringPrintf(json, "\","); - dyStringPrintf(json, "\"organism\":\"%s\"", (char *)hashOptionalVal(termHash, "organism", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"sex\":\"%s\"", (char *)hashOptionalVal(termHash, "sex", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"tissue\":\"%s\"", (char *)hashOptionalVal(termHash, "tissue", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"vendorName\":\"%s\"", (char *)hashOptionalVal(termHash, "vendorName", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"vendorId\":\"%s\"", (char *)hashOptionalVal(termHash, "vendorId", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"lineage\":\"%s\"", (char *)hashOptionalVal(termHash, "lineage", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"termId\":\"%s\"", (char *)hashOptionalVal(termHash, "termId", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"termUrl\":\"%s\"", (char *)hashOptionalVal(termHash, "termUrl", "unknown")); - // TODO: add URL protocol file ? - } -else if (sameString(type, "antibody")) - { - dyStringPrintf(json, "\"target\":\"%s\"", (char *)hashOptionalVal(termHash, "target", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"antibodyDescription\":\"%s\"", (char *)hashOptionalVal(termHash, "antibodyDescription", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"targetDescription\":\"%s\"", (char *)hashOptionalVal(termHash, "targetDescription", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"vendorName\":\"%s\"", (char *)hashOptionalVal(termHash, "vendorName", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"vendorId\":\"%s\"", (char *)hashOptionalVal(termHash, "vendorId", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"lab\":\"%s\"", (char *)hashOptionalVal(termHash, "lab", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"targetId\":\"%s\"", (char *)hashOptionalVal(termHash, "targetId", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"targetUrl\":\"%s\"", (char *)hashOptionalVal(termHash, "targetUrl", "unknown")); - dyStringPrintf(json, ","); - dyStringPrintf(json, "\"orderUrl\":\"%s\"", (char *)hashOptionalVal(termHash, "orderUrl", "unknown")); - // TODO: add validation file(s) ? - } - -dyStringPrintf(json, "}\n"); -} - -static void warnAbortHandler(char *format, va_list args) -/* warnAbort handler that aborts with an HTTP 400 status code. */ -{ -puts("Status: 400\n\n"); -vfprintf(stdout, format, args); -exit(-1); -} +#include "api.h" int main(int argc, char *argv[]) { struct dyString *output = newDyString(10000); cgiSpoof(&argc,argv); -pushWarnHandler(warnAbortHandler); -pushAbortHandler(warnAbortHandler); +pushWarnHandler(apiWarnAbortHandler); +pushAbortHandler(apiWarnAbortHandler); char *database = cgiString("db"); char *cmd = cgiString("cmd"); char *jsonp = cgiOptionalString("jsonp"); if (!hDbExists(database)) errAbort("Invalid database '%s'", database); if (!strcmp(cmd, "defaultPos")) { dyStringPrintf(output, "{\"pos\": \"%s\"}", hDefaultPos(database)); } 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 @@ -296,109 +190,24 @@ 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 if (!strcmp(cmd, "encodeExperiments")) - { - // Return list of ENCODE experiments. Note: database is ignored. - // TODO: add selector for org=human|mouse, retire db= - // e.g. http://genome.ucsc.edu/cgi-bin/hgApi?db=hg18&cmd=encodeExperiments - // NOTE: This table lives only on development and preview servers -- use preview - // if not found on localhost - struct sqlConnection *connExp = sqlConnect(ENCODE_EXP_DATABASE); - if (!sqlTableExists(connExp, ENCODE_EXP_TABLE)) - { - sqlDisconnect(&connExp); - connExp = sqlConnectProfile("preview", ENCODE_EXP_DATABASE); - } - struct encodeExp *exp = NULL, *exps = encodeExpLoadAllFromTable(connExp, ENCODE_EXP_TABLE); - dyStringPrintf(output, "[\n"); - while ((exp = slPopHead(&exps)) != NULL) - { - encodeExpJson(output, exp); - dyStringAppend(output,",\n"); - } - output->string[dyStringLen(output)-2] = '\n'; - output->string[dyStringLen(output)-1] = ']'; - dyStringPrintf(output, "\n"); - sqlDisconnect(&connExp); - } -else if (!strcmp(cmd, "encodeExpId")) - { - // Return list of ENCODE expID's found in a database - struct sqlResult *sr; - char **row; - char query[256]; - struct sqlConnection *conn = hAllocConn(database); - safef(query, sizeof(query), "select distinct(%s) from %s where %s='%s' order by (%s + 0)", - MDB_VAL, MDB_DEFAULT_NAME, MDB_VAR, MDB_VAR_ENCODE_EXP_ID, MDB_VAL); - sr = sqlGetResult(conn, query); - dyStringPrintf(output, "[\n"); - while ((row = sqlNextRow(sr)) != NULL) - { - dyStringPrintf(output, "{\"expId\": \"%s\"},\n", row[0]); - } - output->string[dyStringLen(output)-2] = '\n'; - output->string[dyStringLen(output)-1] = ']'; - dyStringPrintf(output, "\n"); - sqlFreeResult(&sr); - hFreeConn(&conn); - } -else if (!strcmp(cmd, "cv")) - { - // Return list of CV terms for the specified term type - // Just supporting cellType, dataType, and antibody initially - // TODO: retire db= - // e.g. http://genome.ucsc.edu/cgi-bin/hgApi?db=hg19&cmd=cv&file=cv.ra&type=dataType - char *type = cgiString("type"); - char *cvFile = cgiOptionalString("file"); - if (cvFile != NULL) - cvFileDeclare(cvFile); - if (differentString(type, "dataType") && - differentString(type, "cellType") && - differentString(type, "antibody")) - { - warn("Unsupported CV type %s (must be dataType, cellType, antibody)", type); - errAbort("Unsupported 'cmd' parameter"); - } - dyStringPrintf(output, "[\n"); - struct hash *typeHash = (struct hash *)cvTermHash(cvTermNormalized(type)); - struct hashCookie hc = hashFirst(typeHash); - struct hashEl *hel; - while ((hel = hashNext(&hc)) != NULL) - { - cvTermJson(output, type, hel->val); - dyStringAppend(output,","); - } - output->string[dyStringLen(output)-1] = 0; - output->stringSize--; - dyStringPrintf(output, "\n]\n"); - } else { warn("unknown cmd: %s",cmd); errAbort("Unsupported 'cmd' parameter"); } -// It's debatable whether the type should be text/plain, text/javascript or application/javascript; -// text/javascript works with all our supported browsers, so we are using that one. -puts("Content-Type:text/javascript\n"); - -//puts("\n"); -if (jsonp) - printf("%s(%s)", jsonp, dyStringContents(output)); -else - puts(dyStringContents(output)); - +apiOut(dyStringContents(output), jsonp); return 0; }