77da195bc4b0f335574943a2daca3afd4677e8b8 braney Fri Apr 26 14:47:29 2013 -0700 libify the connection to all the hubs by request of Angie. diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c index c7262f7..d014e2a 100644 --- src/hg/lib/hubConnect.c +++ src/hg/lib/hubConnect.c @@ -6,30 +6,31 @@ #include "common.h" #include "linefile.h" #include "hash.h" #include "dystring.h" #include "sqlNum.h" #include "jksql.h" #include "hdb.h" #include "net.h" #include "trackHub.h" #include "hubConnect.h" #include "hui.h" #include "errCatch.h" #include "obscure.h" #include "hgConfig.h" +#include "grp.h" boolean isHubTrack(char *trackName) /* Return TRUE if it's a hub track. */ { return startsWith(hubTrackPrefix, trackName); } static char *hubStatusTableName = NULL; static char *getHubStatusTableName() /* return the hubStatus table name from the environment, * or hg.conf, or use the default. Cache the result */ { if (hubStatusTableName == NULL) @@ -655,30 +656,85 @@ struct trackHubGenome *hubGenome = trackHubFindGenome(trackHub, database); if (hubGenome != NULL) { tdbList = trackHubTracksForGenome(trackHub, hubGenome); tdbList = trackDbLinkUpGenerations(tdbList); tdbList = trackDbPolishAfterLinkup(tdbList, database); trackDbPrioritizeContainerItems(tdbList); trackHubPolishTrackNames(trackHub, tdbList); if (tdbList != NULL) slAddHead(pHubList, trackHub); } } return tdbList; } +static struct grp *grpFromHub(struct hubConnectStatus *hub) +/* 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 trackHub **pHubList, struct grp **pGroupList) +/* Generate trackDb structures for all the tracks in attached hubs. + * Make grp structures for each hub. */ +{ +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, pHubList); + 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); + } + hubUpdateStatus(NULL, hub); + } + + // we're going to free the hubConnectStatus list + hub->trackHub = NULL; + errCatchFree(&errCatch); + } + } +hubConnectStatusFreeList(&hubList); + +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); cartSetString(cart, hgHubConnectRemakeTrackHub, "on"); struct hubConnectStatus *hubList = hubConnectStatusListFromCart(cart); globalHubList = hubList;