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);