src/hg/near/hgNear/colTemplate.c 1.4

1.4 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/colTemplate.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/near/hgNear/colTemplate.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -b -B -U 1000000 -r1.3 -r1.4
--- src/hg/near/hgNear/colTemplate.c	12 Sep 2007 23:41:37 -0000	1.3
+++ src/hg/near/hgNear/colTemplate.c	7 May 2010 03:37:41 -0000	1.4
@@ -1,144 +1,152 @@
 /* colTemplate - example template for a new type of column. To convert to 
  * your own column type as a starting point replace "xyz" with your column
  * type name.  The code here is a simpler version of the "lookup" column,
  * which just looks up a gene in a database table. */
 
 #include "common.h"
 #include "hash.h"
 #include "linefile.h"
 #include "cheapcgi.h"
 #include "localmem.h"
 #include "dystring.h"
 #include "obscure.h"
 #include "jksql.h"
 #include "hdb.h"
 #include "hgNear.h"
 
 boolean xyzExists(struct column *col, struct sqlConnection *conn)
 /* This returns true if all tables this depends on exists. */
 {
 return sqlTableExists(conn, col->table);
 }
 
 char *xyzCellVal(struct column *col, struct genePos *gp, 
 	struct sqlConnection *conn)
 /* Make comma separated list of matches to association table. */
 {
 char query[1000];
 safef(query, sizeof(query), "select %s from %s where %s = '%s'",
       col->valField, col->table, col->keyField, gp->name);
 return sqlQuickString(conn, query);
 }
 
 static void xyzCellPrint(struct column *col, struct genePos *gp, 
 	struct sqlConnection *conn)
 /* Print cell in xyz table. */
 {
 char *string = xyzCellVal(col, gp, conn);
 hPrintf("<TD>");
-if (col->xyzItalics)
-    hPrintf("<I>%s</I>", naForNull(string));
+if (string == NULL) 
+    {
+    hPrintf("n/a");
+    }
+else if (col->xyzItalics)
+    {
+    hPrintf("<I>");
+    hPrintEncodedNonBreak(string);
+    hPrintf("</I>");
+    }
 else
-    hPrintf("%s", naForNull(string));
+    hPrintEncodedNonBreak(string);
 hPrintf("</TD>");
 freeMem(string);
 }
 
 static void xyzConfigControls(struct column *col)
 /* Print out configuration column */
 {
 hPrintf("<TD>");
 char *italicsVarName = configVarName(col, "italics");
 cgiMakeCheckBox(italicsVarName, cartUsualBoolean(cart, italicsVarName, TRUE));
 hPrintf("italics");
 hPrintf("</TD>");
 }
 
 struct searchResult *xyzSimpleSearch(struct column *col, 
     struct sqlConnection *conn, char *search)
 /* Search xyz type column. */
 {
 struct searchResult *resList = NULL, *res;
 
 /* Construct query */
 char query[1000];
 safef(query, sizeof(query), "select %s,%s from %s where %s='%s'", 
 	col->keyField, col->valField, col->table, col->valField, search);
 
 /* Get results from database and store in results list. */
 struct sqlResult *sr = sqlGetResult(conn, query);
 char **row;
 while ((row = sqlNextRow(sr)) != NULL)
     {
     AllocVar(res);
     res->gp.name = cloneString(row[0]);
     res->matchingId = cloneString(row[1]);
     slAddHead(&resList, res);
     }
 sqlFreeResult(&sr);
 
 /* Clean up and go home. */
 slReverse(&resList);
 return resList;
 }
 
 
 static void xyzFilterControls(struct column *col, 
 	struct sqlConnection *conn)
 /* Print out controls for advanced filter. */
 {
 hPrintf("Term to match exactly: ");
 advFilterRemakeTextVar(col, "term", 20);
 }
 
 static struct genePos *xyzAdvFilter(struct column *col, 
 	struct sqlConnection *conn, struct genePos *list)
 /* Do advanced filter on xyz type column. */
 {
 char *term = advFilterVal(col, "term");
 if (term != NULL)
     {
     /* Construct a hash of all genes that pass filter. */
     struct hash *passHash = newHash(17);
     char query[1000];
     char **row;
     struct sqlResult *sr;
     safef(query, sizeof(query), "select %s from %s where %s='%s'", 
 	col->keyField, col->table, col->valField, term);
     sr = sqlGetResult(conn, query);
     while ((row = sqlNextRow(sr)) != NULL)
 	hashAdd(passHash, row[0], NULL);
     sqlFreeResult(&sr);
 
     /* Remove non-passing genes. */
     list = weedUnlessInHash(list, passHash);
     hashFree(&passHash);
     }
 return list;
 }
 
 void setupColumnXyz(struct column *col, char *parameters)
 /* Set up a xyz type column. */
 {
 /* Read configuration variables and store in column. */
 char *varName = configVarName(col, "italics");
 col->xyzItalics = cartUsualBoolean(cart, varName, TRUE);
 
 col->table = cloneString(nextWord(&parameters));  // Assume have a table parameter first
 col->keyField = cloneString(nextWord(&parameters));  // Then key field
 col->valField = cloneString(nextWord(&parameters));  // Then value field
 if (col->valField == NULL)
     errAbort("Not enough fields in type for %s", col->name);
 col->exists = xyzExists;		    // Required for all columns
 col->cellVal = xyzCellVal;		    // Required for all columns
 
 // The rest of these methods are optional.  Typically the system will do something
 // sensible if they are missing.  Generally you do want to implement the filters.
 col->cellPrint = xyzCellPrint;
 // col->labelPrint = xyzLabelPrint;
 // col->tableColumns = xyzLabelColumns;
 col->configControls = xyzConfigControls;
 col->simpleSearch = xyzSimpleSearch;
 col->filterControls = xyzFilterControls;
 col->advFilter = xyzAdvFilter;
 }