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