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;
 }