a345d17f7912a5f0e121951f6d261b496cce608b
braney
  Fri May 10 09:25:54 2013 -0700
first cut at track item search in track hubs that have bigBed files with a searchIndex field refs #10426
diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c
index 921d141..f601e5f 100644
--- src/hg/lib/hubConnect.c
+++ src/hg/lib/hubConnect.c
@@ -669,66 +669,80 @@
 /* Make up a grp structur from hub */
 {
 struct grp *grp;
 AllocVar(grp);
 char name[16];
 safef(name, sizeof(name), "hub_%d", hub->id);
 grp->name = cloneString(name);
 grp->label = cloneString(hub->trackHub->shortLabel);
 return grp;
 }
 
 struct trackDb *hubCollectTracks( char *database,  struct grp **pGroupList)
 /* Generate trackDb structures for all the tracks in attached hubs.  
  * Make grp structures for each hub. */
 {
+// return the cached copy if it exists
+static struct trackDb *hubTrackDbs;
+static struct grp *hubGroups;
+
+if (hubTrackDbs != NULL)
+    {
+    if (pGroupList != NULL)
+	*pGroupList = hubGroups;
+    return hubTrackDbs;
+    }
+
 struct hubConnectStatus *hub, *hubList =  hubConnectGetHubs();
 struct trackDb *tdbList = NULL;
 for (hub = hubList; hub != NULL; hub = hub->next)
     {
     if (isEmpty(hub->errorMessage))
 	{
         /* error catching in so it won't just abort  */
         struct errCatch *errCatch = errCatchNew();
         if (errCatchStart(errCatch))
 	    {
 	    struct trackDb *thisList = hubAddTracks(hub, database);
 	    tdbList = slCat(tdbList, thisList);
 	    }
         errCatchEnd(errCatch);
         if (errCatch->gotError)
 	    {
 	    warn("%s", errCatch->message->string);
 	    hubUpdateStatus( errCatch->message->string, hub);
 	    }
 	else
 	    {
 	    if (!trackHubDatabase(database))
 		{
 		struct grp *grp = grpFromHub(hub);
-		slAddHead(pGroupList, grp);
+		slAddHead(&hubGroups, grp);
 		}
 	    hubUpdateStatus(NULL, hub);
 	    }
 
 	// we're going to free the hubConnectStatus list
 	hub->trackHub = NULL;
         errCatchFree(&errCatch);
 	}
     }
 hubConnectStatusFreeList(&hubList);
 
+hubTrackDbs = tdbList;
+if (pGroupList != NULL)
+    *pGroupList = hubGroups;
 return tdbList;
 }
 
 static struct hubConnectStatus *globalHubList;
 
 struct hubConnectStatus *hubConnectGetHubs()
 /* return the static global to the track data hubs */
 {
 return globalHubList;
 }
 
 struct hubConnectStatus * hubConnectLoadHubs(struct cart *cart)
 /* load the track data hubs.  Set a static global to remember them */
 {
 hubCheckForNew( cart);