792699d7c080a26288f50741fbfeca218d3ef2b5
larrym
  Wed Feb 9 10:02:10 2011 -0800
use return json for codonToPos and exonToPos
diff --git src/hg/hgApi/hgApi.c src/hg/hgApi/hgApi.c
index 42f5a33..8672362 100644
--- src/hg/hgApi/hgApi.c
+++ src/hg/hgApi/hgApi.c
@@ -203,47 +203,48 @@
             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);
+    safef(query, sizeof(query), "select name, chrom, strand, txStart, txEnd, cdsStart, cdsEnd, exonCount, exonStarts, exonEnds from %s where name = '%s'", sqlEscapeString(table), sqlEscapeString(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);
+            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
-        errAbort("Couldn't find name: %s", name);
+        dyStringPrintf(output, "{\"error\": \"Couldn't find item: %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)