b85df0a600a946623bbe3e5b41e1dc6785e2f59c
braney
Thu Apr 15 17:20:43 2021 -0700
if a track hub specifies a database that's not native, look for in among
the attached hubs, and if it's not there, look on genark
diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c
index 108a6ef..18505fc 100644
--- src/hg/lib/hubConnect.c
+++ src/hg/lib/hubConnect.c
@@ -185,30 +185,32 @@
"select hubUrl,status, errorMessage,lastNotOkTime, shortLabel from %s where id=%d", getHubStatusTableName(), id);
struct sqlResult *sr = sqlGetResult(conn, query);
char **row = sqlNextRow(sr);
if (row != NULL)
{
AllocVar(hub);
hub->id = id;
hub->hubUrl = cloneString(row[0]);
hub->status = sqlUnsigned(row[1]);
hub->errorMessage = cloneString(row[2]);
char *shortLabel = row[4];
if (isEmpty(row[2]) || hubTimeToCheck(hub, row[3]))
{
char *errorMessage = NULL;
hub->trackHub = fetchHub( hub, &errorMessage);
+ if (hub->trackHub)
+ hub->trackHub->hubStatus = hub;
hub->errorMessage = cloneString(errorMessage);
hubUpdateStatus( hub->errorMessage, hub);
if (!isEmpty(hub->errorMessage))
{
boolean isCollection = (strstr(hub->hubUrl, "hgComposite") != NULL);
if (isCollection)
warn("You created a Track "
"Collection that has expired and been removed. Track Collections "
"expire 48 hours after their last use. "
"Save your session to preserve collections long-term and to allow sharing.");
else
warn("Could not connect to hub \"%s\": %s", shortLabel, hub->errorMessage);
}
}
}
@@ -858,36 +860,122 @@
}
struct trackHub *hubConnectGetHubForDb(char *db)
/* Return the connected hub for db, or NULL if not found. Do not free result. */
{
unsigned hubId = hubIdFromTrackName(db);
struct hubConnectStatus *status;
for (status = globalHubList; status != NULL; status = status->next)
{
if (status->id == hubId)
return status->trackHub;
}
return NULL;
}
+static unsigned lookForUndecoratedDb(char *name)
+// Look for this undecorated in the attached assembly hubs
+{
+struct trackHubGenome *genome = trackHubGetGenomeUndecorated(name);
+
+if (genome == NULL)
+ return FALSE;
+
+struct trackHub *trackHub = genome->trackHub;
+
+if (trackHub != NULL)
+ return trackHub->hubStatus->id;
+return 0;
+}
+
+static boolean lookForLonelyHubs(struct cart *cart, struct hubConnectStatus *hubList, char **newDatabase, char *genarkPrefix)
+// We go through the hubs and see if any of them reference an assembly
+// that is NOT currently loaded, but we know a URL to load it.
+{
+struct sqlConnection *conn = hConnectCentral();
+boolean added = FALSE;
+
+struct hubConnectStatus *hub;
+for(hub = hubList; hub; hub = hub->next)
+ {
+ struct trackHub *tHub = hub->trackHub;
+ if (tHub == NULL)
+ continue;
+
+ struct trackHubGenome *genomeList = tHub->genomeList, *genome;
+
+ for(genome = genomeList; genome; genome = genome->next)
+ {
+ char *name = genome->name;
+
+ if (!hDbIsActive(name) )
+ {
+ char buffer[4096];
+ unsigned newId = 0;
+
+ // look with undecorated name for an attached assembly hub
+ if (!(newId = lookForUndecoratedDb(name)))
+ {
+ // see if genark has this assembly
+ char query[4096];
+ sqlSafef(query, sizeof query, "select hubUrl from genark where gcAccession='%s'", name);
+ if (sqlQuickQuery(conn, query, buffer, sizeof buffer))
+ {
+ char url[4096];
+ safef(url, sizeof url, "%s/%s", genarkPrefix, buffer);
+
+ struct hubConnectStatus *status = getAndSetHubStatus( cart, url, TRUE);
+
+ if (status)
+ {
+ newId = status->id;
+ added = TRUE;
+ }
+ }
+ }
+
+ // if we found an id, change some names to use it as a decoration
+ if (newId)
+ {
+ safef(buffer, sizeof buffer, "hub_%d_%s", newId, name);
+
+ genome->name = cloneString(buffer);
+
+ // if our new database is an undecorated db, decorate it
+ if (*newDatabase && sameString(*newDatabase, name))
+ *newDatabase = cloneString(buffer);
+ }
+
+ }
+ }
+ }
+
+hDisconnectCentral(&conn);
+return added;
+}
+
char *hubConnectLoadHubs(struct cart *cart)
/* load the track data hubs. Set a static global to remember them */
{
char *newDatabase = checkForNew( cart);
cartSetString(cart, hgHubConnectRemakeTrackHub, "on");
struct hubConnectStatus *hubList = hubConnectStatusListFromCart(cart);
+
+char *genarkPrefix = cfgOption("genarkHubPrefix");
+if (genarkPrefix && lookForLonelyHubs(cart, hubList, &newDatabase, genarkPrefix))
+ hubList = hubConnectStatusListFromCart(cart);
+
globalHubList = hubList;
return newDatabase;
}
char *hubNameFromUrl(char *hubUrl)
/* Given the URL for a hub, return its hub_# name. */
{
char query[PATH_LEN*4];
sqlSafef(query, sizeof(query), "select concat('hub_', id) from %s where hubUrl = '%s'",
getHubStatusTableName(), hubUrl);
struct sqlConnection *conn = hConnectCentral();
char *name = sqlQuickString(conn, query);
hDisconnectCentral(&conn);
return name;