src/hg/hgTracks/simpleTracks.c 1.82

1.82 2009/06/02 07:00:25 markd
added cache to avoid repeated databases queries for organism name for xeno items, 4.28x speedup
Index: src/hg/hgTracks/simpleTracks.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/hgTracks/simpleTracks.c,v
retrieving revision 1.81
retrieving revision 1.82
diff -b -B -U 4 -r1.81 -r1.82
--- src/hg/hgTracks/simpleTracks.c	20 May 2009 20:50:52 -0000	1.81
+++ src/hg/hgTracks/simpleTracks.c	2 Jun 2009 07:00:25 -0000	1.82
@@ -5076,18 +5076,27 @@
 return shortOrg;
 }
 
 char *getOrganism(struct sqlConnection *conn, char *acc)
-/* lookup the organism for an mrna, or NULL if not found.
- * WARNING: static return */
+/* lookup the organism for an mrna, or NULL if not found */
 {
-static char orgBuf[256];
-char query[256], *org;
-sprintf(query, "select organism.name from gbCdnaInfo,organism where gbCdnaInfo.acc = '%s' and gbCdnaInfo.organism = organism.id", acc);
-org = sqlQuickQuery(conn, query, orgBuf, sizeof(orgBuf));
-if ((org != NULL) && (org[0] == '\0'))
+// cache results, as this can be called a lot of times trying to pack tracks and test
+// for row overflow
+static struct hash *cache = NULL;
+if (cache == NULL)
+    cache = hashNew(0);
+// N.B. NULL is a valid value in the cache
+struct hashEl *cacheEl = hashLookup(cache, acc);
+if (cacheEl == NULL)
+    {
+    char query[256];
+    sprintf(query, "select organism.name from gbCdnaInfo,organism where gbCdnaInfo.acc = '%s' and gbCdnaInfo.organism = organism.id", acc);
+    char *org = sqlQuickString(conn, query);
+    if ((org != NULL) && (org[0] == '\0'))
     org = NULL;
-return org;
+    cacheEl = hashAdd(cache, acc, org);
+    }
+return cacheEl->val;
 }
 
 char *getOrganismShort(struct sqlConnection *conn, char *acc)
 /* lookup the organism for an mrna, or NULL if not found.  This will