3d00d8348e1cb6eafec60cc3d7321f6de7e669be
braney
Mon Dec 12 13:09:49 2022 -0800
be smarter about showing the user error messages
diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c
index 05ff98f..503a1e7 100644
--- src/hg/lib/hubConnect.c
+++ src/hg/lib/hubConnect.c
@@ -134,30 +134,31 @@
struct trackHubGenome *genomes = hub->genomeList; /* List of associated genomes. */
for(; genomes; genomes = genomes->next)
if (sameString(genomes->name, database))
return TRUE;
}
return FALSE;
}
static struct trackHub *fetchHub(struct hubConnectStatus *hubStatus, char **errorMessage)
{
struct errCatch *errCatch = errCatchNew();
struct trackHub *tHub = NULL;
boolean gotWarning = FALSE;
char *url = hubStatus->hubUrl;
+*errorMessage = NULL;
char hubName[64];
safef(hubName, sizeof(hubName), "hub_%d", hubStatus->id);
if (errCatchStart(errCatch))
tHub = trackHubOpen(url, cloneString(hubName)); // open hub
errCatchEnd(errCatch);
if (errCatch->gotError)
{
gotWarning = TRUE;
*errorMessage = cloneString(errCatch->message->string);
}
errCatchFree(&errCatch);
if (gotWarning)
@@ -182,49 +183,50 @@
struct hubConnectStatus *hubConnectStatusForId(struct sqlConnection *conn, int id)
{
struct hubConnectStatus *hub = NULL;
char query[1024];
sqlSafef(query, sizeof(query),
"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];
+ hub->shortLabel = cloneString(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);
+ // commenting this out, but leaving it in the source because we might use it later.
+ //else
+ //warn("Could not connect to hub \"%s\": %s", hub->shortLabel, hub->errorMessage);
}
}
}
sqlFreeResult(&sr);
return hub;
}
struct hubConnectStatus *hubConnectStatusListFromCartAll(struct cart *cart)
/* Return list of all track hubs that are referenced by cart. */
{
struct hubConnectStatus *hubList = NULL, *hub;
struct slPair *pair, *pairList = cartVarsWithPrefix(cart, hgHubConnectHubVarPrefix);
struct sqlConnection *conn = hConnectCentral();
for (pair = pairList; pair != NULL; pair = pair->next)
{
@@ -505,30 +507,32 @@
errAbort("opened hub, but could not get it out of the hubStatus table");
}
}
/* allocate a hub */
struct hubConnectStatus *hub = NULL;
AllocVar(hub);
hub->id = id;
hub->hubUrl = cloneString(url);
/* new fetch the contents of the hub to fill in the status table */
struct trackHub *tHub = fetchHub( hub, &errorMessage);
if (tHub != NULL)
hub->trackHub = tHub;
+if (errorMessage != NULL)
+ hub->errorMessage = cloneString(errorMessage);
/* update the status table with the lastest label and database information */
hubUpdateStatus( errorMessage, hub);
/* if we're turning on the hub, set the cart variable */
if (set)
{
char hubName[32];
safef(hubName, sizeof(hubName), "%s%u", hgHubConnectHubVarPrefix, id);
cartSetString(cart, hubName, "1");
}
return hub;
}
@@ -622,30 +626,32 @@
if ((wantFirstDb != NULL) && (hub->trackHub != NULL)) // choose the first db
newDatabase = hub->trackHub->defaultDb;
else if (assemblyDb != NULL)
{
// Check to see if the user specified an assembly within
// an assembly hub.
struct trackHub *trackHub = hub->trackHub;
if (trackHub != NULL)
{
struct trackHubGenome *genomeList = trackHub->genomeList;
for(; genomeList; genomeList = genomeList->next)
{
if (sameString(assemblyDb, hubConnectSkipHubPrefix(genomeList->name)))
{
+ if (hub->errorMessage)
+ errAbort("Hub error: %s", hub->errorMessage);
newDatabase = genomeList->name;
break;
}
}
}
}
}
}
cartRemove(cart, hgHubDataClearText);
cartRemove(cart, hgHubDataText);
cartRemove(cart, hgHubDoFirstDb);
cartRemove(cart, hgHubGenome);
return newDatabase;
}
@@ -786,31 +792,31 @@
if (doCache)
trackDbHubCloneTdbListToSharedMem(hubGenome->trackDbFile, tdbList, memCheckPoint(), incFiles->string);
}
}
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);
+grp->label = cloneString(hub->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. Returned group list is reversed. */
{
// return the cached copy if it exists
static struct trackDb *hubTrackDbs;
static struct grp *hubGroups;
if (hubTrackDbs != NULL)
{
if (pGroupList != NULL)
*pGroupList = hubGroups;
@@ -833,30 +839,37 @@
errCatchEnd(errCatch);
if (errCatch->gotError)
{
warn("%s", errCatch->message->string);
hubUpdateStatus( errCatch->message->string, hub);
}
else
{
struct grp *grp = grpFromHub(hub);
slAddHead(&hubGroups, grp);
hubUpdateStatus(NULL, hub);
}
errCatchFree(&errCatch);
}
+ else
+ {
+ /* create an empty group to hold the error message. */
+ struct grp *grp = grpFromHub(hub);
+ grp->errMessage = hub->errorMessage;
+ slAddHead(&hubGroups, grp);
+ }
}
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;
}
@@ -1005,31 +1018,36 @@
char *path = &dir[sizeof hubCuratedPrefix - 1];
char url[4096];
safef(url, sizeof url, "%s/%s/hub.txt", path, curatedHubPrefix);
struct hubConnectStatus *status = getAndSetHubStatus( cart, url, TRUE);
if (status && isEmpty(status->errorMessage))
{
char buffer[4096];
safef(buffer, sizeof buffer, "hub_%d_%s", status->id, db);
dbOveride = cloneString(buffer);
return status->id;
}
else
+ {
+ if (!isEmpty(status->errorMessage))
+ errAbort("Hub error: url %s: error %s.", url, status->errorMessage);
+ else
errAbort("Cannot open hub %s.", url);
+ }
}
return 0;
}
char *hubConnectLoadHubs(struct cart *cart)
/* load the track data hubs. Set a static global to remember them */
{
int newCuratedHubId = 0;
char *dbSpec = cartOptionalString(cart, "db");
char *curatedHubPrefix = cfgOption("curatedHubPrefix");
if (isEmpty(curatedHubPrefix))
curatedHubPrefix = "public";
if (dbSpec != NULL)