48c5bcc0735d09367f9853ebbd053aea3f94b262 chmalee Fri May 15 10:37:48 2020 -0700 Fix bug in hub searching where a hub being down at the time we are trying to display it's search results caused a segfault, also removing remnants of hgHubConnect needing a special udcCache, which the CGI has not been using for months now, refs #25574 diff --git src/hg/hgHubConnect/hgHubConnect.c src/hg/hgHubConnect/hgHubConnect.c index e588f73..0afb3c4 100644 --- src/hg/hgHubConnect/hgHubConnect.c +++ src/hg/hgHubConnect/hgHubConnect.c @@ -1263,63 +1263,61 @@ /* Given a hub's info and a structure listing the search hits within the hub, first print * a basic line of hub information with a "connect" button. Then, if the search results * are non-NULL, write out information about the genomes and tracks from the search hits that * match the db filter. * If there are no search results to print, the basic hub lines are combined into a single HTML table * that is defined outside this function. * Otherwise, each hub line is printed in its own table followed by a <ul> containing details * about the search results. */ { if (hubSearchResult != NULL) printf("<table class='hubList'><tbody>\n"); outputPublicTableRow(hubInfo, count); if (hubSearchResult != NULL) { printf("</tbody></table>\n"); + struct trackHub *hub = fetchTrackHub(hubInfo); + if (hub != NULL) + { printf("<div class=\"hubTdbTree\">\n"); printf("<div id='tracks%d'></div>", hubInfo->id); // div for the jstree for this hub's search result(s) printf("</div>\n"); - struct trackHub *hub = fetchTrackHub(hubInfo); struct hubOutputStructure *hubOut = buildHubSearchOutputStructure(hub, hubSearchResult); if (dyStringIsEmpty(hubOut->descriptionMatch) && (hubOut->genomes == NULL)) return; // no detailed search results; hit must have been to hub short label or something printHubOutputStructure(hubOut, hubInfo); } } +} int hubEntryCmp(const void *va, const void *vb) /* Compare to sort based on shortLabel */ { const struct hubEntry *a = *((struct hubEntry **)va); const struct hubEntry *b = *((struct hubEntry **)vb); return strcasecmp(a->shortLabel, b->shortLabel); } void printHubList(struct slName *hubsToPrint, struct hash *hubLookup, struct hash *searchResultHash) /* Print out a list of hubs, possibly along with search hits to those hubs. * hubLookup takes hub URLs to struct hubEntry * searchResultHash takes hub URLs to struct hubSearchText * (list of hits on that hub) */ { int count = 0; -int udcTimeoutVal = udcCacheTimeout(); -char *udcOldDir = cloneString(udcDefaultDir()); -char *searchUdcDir = cfgOptionDefault("hgHubConnect.cacheDir", udcOldDir); -udcSetDefaultDir(searchUdcDir); -udcSetCacheTimeout(1<<30); struct hubEntry *hubList = NULL; struct hubEntry *hubInfo; long slTime; long printOutputForHubTime; boolean measureTiming = cartUsualBoolean(cart, "measureTiming", FALSE); if (hubsToPrint != NULL) { printHubListHeader(); if (searchResultHash == NULL) // if not displaying search results, join the hub <tr>s into one table printf("<table class='hubList'><tbody>\n"); struct slName *thisHubName = NULL; for (thisHubName = hubsToPrint; thisHubName != NULL; thisHubName = thisHubName->next) { hubInfo = (struct hubEntry *) hashFindVal(hubLookup, thisHubName->name); @@ -1339,32 +1337,30 @@ { struct hubSearchText *searchResult = NULL; if (searchResultHash != NULL) { searchResult = (struct hubSearchText *) hashMustFindVal(searchResultHash, hubInfo->hubUrl); } printOutputForHub(hubInfo, searchResult, count); count++; } printOutputForHubTime = clock1000(); if (measureTiming) printf("hgHubConnect: printOutputForHubTime before js execution: %lu millis<BR>\n", printOutputForHubTime - slTime); if (searchResultHash == NULL) printf("</tbody></table>\n"); } -udcSetCacheTimeout(udcTimeoutVal); -udcSetDefaultDir(udcOldDir); if (hubsToPrint != NULL) { /* Write out the list of hubs in a single table inside a div that will be hidden by * javascript. This table is used (before being hidden) to set common column widths for * the individual hub tables when they're split by detailed search results. */ printf("<div id='hideThisDiv'>\n"); printf("<table class='hubList' id='hideThisTable'><tbody>\n"); for (hubInfo = hubList; hubInfo != NULL; hubInfo = hubInfo->next) { printOutputForHub(hubInfo, NULL, count); count++; } printf("</tbody></table>\n"); printf("</div>\n"); }