src/hg/near/hgNear/go.c 1.22

1.22 2010/05/07 03:37:41 galt
using htmlEncode via new function hPrintEncodeNonBreak to protect against problems with <>;" in output, problem was recently uncovered by hgNearTest
Index: src/hg/near/hgNear/go.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/near/hgNear/go.c,v
retrieving revision 1.21
retrieving revision 1.22
diff -b -B -U 1000000 -r1.21 -r1.22
--- src/hg/near/hgNear/go.c	3 May 2007 21:31:58 -0000	1.21
+++ src/hg/near/hgNear/go.c	7 May 2010 03:37:41 -0000	1.22
@@ -1,247 +1,247 @@
 /* go - Gene Ontology stuff. */
 
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "jksql.h"
 #include "cart.h"
 #include "hdb.h"
 #include "hCommon.h"
 #include "obscure.h"
 #include "hgNear.h"
 #include "spDb.h"
 
 static char const rcsid[] = "$Id$";
 
 static boolean goExists(struct column *col, struct sqlConnection *conn)
 /* This returns true if go database and goaPart table exists. */
 {
 boolean gotIt = FALSE;
 col->goConn = sqlMayConnect("go");
 if (col->goConn != NULL)
     {
     gotIt = sqlTableExists(col->goConn, "goaPart");
     }
 return gotIt;
 }
 
 static char *goCellVal(struct column *col, struct genePos *gp, 
    	struct sqlConnection *conn)
 /* Get go terms as comma separated string. */
 {
 struct dyString *dy = dyStringNew(256);
 char *result = NULL;
 struct sqlResult *sr;
 char **row;
 char query[256];
 boolean gotOne = FALSE;
 struct hash *hash = newHash(6);
 
 if (gp->protein != NULL && gp->protein[0] != 0)
     {
     struct sqlConnection *spConn = sqlConnect(UNIPROT_DB_NAME);
     char *proteinAcc;
     
     if (kgVersion == KG_III)
     	{
     	proteinAcc = spFindAcc(spConn, lookupProtein(conn, gp->name));
 	}
     else
     	{
     	proteinAcc = spFindAcc(spConn, gp->protein);
         }
     
     safef(query, sizeof(query), 
 	    "select term.name from goaPart,term where goaPart.%s = '%s' and goaPart.goId = term.acc", col->goaIdColumn, proteinAcc);
     sr = sqlGetResult(col->goConn, query);
     while ((row = sqlNextRow(sr)) != NULL)
         {
 	char *name = row[0];
 	if (!hashLookup(hash, name))
 	    {
 	    hashAdd(hash, name, NULL);
 	    gotOne = TRUE;
 	    dyStringAppend(dy, "'");
 	    dyStringAppend(dy, name);
 	    dyStringAppend(dy, "'");
 	    dyStringAppendC(dy, ',');
 	    }
 	}
     sqlFreeResult(&sr);
     sqlDisconnect(&spConn);
     }
 if (gotOne)
     result = cloneString(dy->string);
 dyStringFree(&dy);
 return result;
 }
 
 static void goCellPrint(struct column *col, struct genePos *gp, 
    	struct sqlConnection *conn)
 /* Get go terms as comma separated string. */
 {
 struct sqlResult *sr;
 char **row;
 char query[256];
 boolean gotOne = FALSE;
 struct hash *hash = newHash(6);
 
 hPrintf("<TD>");
 if (gp->protein != NULL && gp->protein[0] != 0)
     {
     struct sqlConnection *spConn = sqlConnect(UNIPROT_DB_NAME);
     char *proteinAcc;
     
     if (kgVersion == KG_III)
     	{
     	proteinAcc = spFindAcc(spConn, lookupProtein(conn, gp->name));
 	}
     else
     	{
     	proteinAcc = spFindAcc(spConn, gp->protein);
         }
 
     safef(query, sizeof(query), 
 	    "select term.name,term.acc from goaPart,term "
 	    "where goaPart.%s = '%s' "
 	    "and goaPart.goId = term.acc", 
 	    col->goaIdColumn, proteinAcc);
     sr = sqlGetResult(col->goConn, query);
     while ((row = sqlNextRow(sr)) != NULL)
         {
 	char *name = row[0];
 	if (!hashLookup(hash, name))
 	    {
 	    hashAdd(hash, name, NULL);
 	    if (!gotOne)
 		gotOne = TRUE;
 	    else
 		hPrintf("&nbsp;");
 	    hPrintf("'");
 	    
 	    hPrintf("<A HREF=\"http://amigo.geneontology.org/cgi-bin/amigo/go.cgi?view=details&search_constraint=terms&depth=0&query=%s\" TARGET=_blank>", row[1]);
 	    // hPrintf("<A HREF=\"http://www.ebi.ac.uk/ego/GSearch?query=%s&mode=id\" TARGET=_blank>", row[1]);
 	    // hPrintf("<A HREF=\"http://www.ebi.ac.uk/ego/DisplayGoTerm?id=%s&viz=tree\" TARGET=_blank>", row[1]);
 
-	    hPrintNonBreak(row[0]);
+	    hPrintEncodedNonBreak(row[0]);
 	    hPrintf("</A>");
 	    hPrintf("'");
 	    }
 	}
     sqlFreeResult(&sr);
     sqlDisconnect(&spConn);
     }
 if (!gotOne)
     hPrintf("n/a");
 hPrintf("</TD>");
 }
 
 static struct genePos *goAdvFilter(struct column *col, 
 	struct sqlConnection *conn, struct genePos *list)
 /* Do advanced filter on position. */
 {
 char *searchString = advFilterVal(col, "terms");
 if (searchString != NULL )
     {
     char query[256];
     struct sqlResult *sr;
     char **row;
     boolean orLogic = advFilterOrLogic(col, "logic", FALSE);
     struct slName *term, *termList = stringToSlNames(searchString);
     struct hash *proteinHash = newHash(16); /* protein IDs of matching terms. */
     struct hash *prevHash = NULL;
     struct genePos *newList = NULL, *gp, *next;
 
     /* First make hash of protein's of terms that match. */
     for (term = termList; term != NULL; term = term->next)
 	{
 	if (startsWith("GO:", term->name))
 	    {
 	    safef(query, sizeof(query),
 		"select %s from goaPart "
 		"where goId = '%s'", col->goaIdColumn, term->name);
 	    }
 	else
 	    {
 	    safef(query, sizeof(query), 
 		    "select goaPart.%s from goaPart,term "
 		    "where term.name = '%s' and term.acc = goaPart.goId"
 		    , col->goaIdColumn, term->name);
 	    }
 	sr = sqlGetResult(col->goConn, query);
 	while ((row = sqlNextRow(sr)) != NULL)
 	    {
 	    if (prevHash == NULL || hashLookup(prevHash, row[0]) != NULL)
                 {
 		hashStore(proteinHash, row[0]);
 		}
 	    }
 	sqlFreeResult(&sr);
 
 	if (!orLogic)
 	    {
 	    hashFree(&prevHash);
 	    if (term->next != NULL)
 		{
 		prevHash = proteinHash;
 		proteinHash = newHash(17);
 		}
 	    }
 	}
 
     /* Now whittle down list to only include those with correct protein. */
     struct sqlConnection *spConn = sqlConnect(UNIPROT_DB_NAME);
     for (gp = list; gp != NULL; gp = next)
 	{
 	next = gp->next;
         char *proteinAcc;
     
         if (kgVersion == KG_III)
     	    {
     	    proteinAcc = spFindAcc(spConn, lookupProtein(conn, gp->name));
 	    }
         else
     	    {
     	    proteinAcc = spFindAcc(spConn, gp->protein);
             }
 
         if (proteinAcc && hashLookup(proteinHash, proteinAcc))
              {
              slAddHead(&newList, gp);
              }
 	}
     sqlDisconnect(&spConn);
     slReverse(&newList);
     list = newList;
     hashFree(&prevHash);
     hashFree(&proteinHash);
     slFreeList(&termList);
     }
 return list;
 }
 
 static void goFilterControls(struct column *col, struct sqlConnection *conn)
 /* Print out controls for advanced filter. */
 {
 hPrintf("<A HREF=\"%s\">", "http://www.geneontology.org");
 hPrintf("Gene Ontology</A> search.  Enclose term in single quotes if it "
         "contains multiple words.<BR>You may search with IDs (<em>e.g.</em> "
 	"GO:0005884) as well as terms (<em>e.g.</em> 'actin filament').<BR>");
 hPrintf("Term(s): ");
 advFilterRemakeTextVar(col, "terms", 35);
 hPrintf(" Include if ");
 advFilterAnyAllMenu(col, "logic", FALSE);
 hPrintf("terms match");
 }
 
 void setupColumnGo(struct column *col, char *parameters)
 /* Set up gene ontology column. */
 {
 col->exists = goExists;
 col->cellVal = goCellVal;
 col->cellPrint = goCellPrint;
 col->filterControls = goFilterControls;
 col->advFilter = goAdvFilter;
 col->goaIdColumn = columnRequiredSetting(col, "goaIdColumn");
 }