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