70a63381600c33bf1d140d823f1043a5765fe2b9
hiram
  Wed Oct 6 11:59:00 2010 -0700
trying a cache of loadTrackDb result
diff --git src/hg/lib/hdb.c src/hg/lib/hdb.c
index 8f632b3..2a807e1 100644
--- src/hg/lib/hdb.c
+++ src/hg/lib/hdb.c
@@ -3378,7 +3378,7 @@
 return tdbList;
 }
 
-static void addTrackIfDataAccessible(char *database, struct trackDb *tdb, char *chrom,
+static void addTrackIfDataAccessible(char *database, struct trackDb *tdb,
                            boolean privateHost, struct trackDb **tdbRetList)
 /* check if a trackDb entry should be included in display, and if so
  * add it to the list, otherwise free it */
@@ -3489,7 +3489,7 @@
 
 
 static struct trackDb *pruneEmpties(struct trackDb *tdbList, char *db,
-	char *chrom, boolean privateHost, int level)
+	boolean privateHost, int level)
 /* Remove tracks without data.  For parent tracks data in any child is sufficient to keep
  * them alive. */
 {
@@ -3499,7 +3499,7 @@
     next = tdb->next;
     if (tdb->subtracks != NULL)
 	{
-	tdb->subtracks = pruneEmpties(tdb->subtracks, db, chrom, privateHost, level+1);
+	tdb->subtracks = pruneEmpties(tdb->subtracks, db, privateHost, level+1);
 	}
     if (tdb->subtracks != NULL)
         {
@@ -3507,7 +3507,7 @@
 	}
     else
         {
-        addTrackIfDataAccessible(db, tdb, chrom, privateHost, &newList);
+        addTrackIfDataAccessible(db, tdb, privateHost, &newList);
 	}
     }
 slReverse(&newList);
@@ -3561,12 +3561,19 @@
  * incompatible with the returned list).
  * Returns list sorted by priority */
 {
-struct trackDb *tdbList = loadTrackDb(db, NULL);
+static char *existingDb = NULL;
+static struct trackDb *tdbList = NULL;
+if (differentStringNullOk(existingDb, db))
+    {
+    tdbList = loadTrackDb(db, NULL);
 tdbList = trackDbLinkUpGenerations(tdbList);
-tdbList = pruneEmpties(tdbList, db, chrom, hIsPrivateHost(), 0);
+    freeMem(existingDb);
+    existingDb = cloneString(db);
+    tdbList = pruneEmpties(tdbList, db, hIsPrivateHost(), 0);
 trackDbContainerMarkup(NULL, tdbList);
 rInheritFields(tdbList);
 slSort(&tdbList, trackDbCmp);
+    }
 return tdbList;
 }