8695074bfeb982a137f6788a5d04685564a9a1a4 chmalee Mon Nov 14 14:50:45 2022 -0800 Small change to check for hgFindSpec table existence for mirrors, refs Michael Hiller email diff --git src/hg/lib/hgFind.c src/hg/lib/hgFind.c index 8f54454..3062b24 100644 --- src/hg/lib/hgFind.c +++ src/hg/lib/hgFind.c @@ -2718,62 +2718,67 @@ return el; return NULL; } static void myLoadFindSpecs(char *db, struct searchCategory *categories, struct hgFindSpec **quickList, struct hgFindSpec **fullList) /* Get all find specs where the search table or search name is what we want */ { struct hgFindSpec *shortList = NULL, *longList = NULL; struct dyString *clause = dyStringNew(0); struct searchCategory *categ; struct sqlConnection *conn = hAllocConn(db); struct sqlResult *sr = NULL; struct slName *tbl, *tblList = hTrackDbList(); for (tbl = tblList; tbl != NULL; tbl = tbl->next) { + dyStringClear(clause); char *tblName = replaceChars(tbl->name, "trackDb", "hgFindSpec"); + if (hTableExists(db, tblName)) + { sqlDyStringPrintf(clause, "select * from %s where searchName in (", tblName); for (categ = categories; categ != NULL; categ = categ->next) { sqlDyStringPrintf(clause, "'%s'", categ->id); if (categ->next) sqlDyStringPrintf(clause, ","); } sqlDyStringPrintf(clause, ") or searchTable in ("); for (categ = categories; categ != NULL; categ = categ->next) { if (sameString(categ->id, "mrna")) sqlDyStringPrintf(clause, "'all_mrna'"); else sqlDyStringPrintf(clause, "'%s'", categ->id); if (categ->next) sqlDyStringPrintf(clause, ","); } sqlDyStringPrintf(clause, ")"); - sr = sqlGetResult(conn, dyStringCannibalize(&clause)); + sr = sqlGetResult(conn, dyStringContents(clause)); char **row = NULL; while ((row = sqlNextRow(sr)) != NULL) { struct hgFindSpec *hfs = hgFindSpecLoad(row); if (hfs->shortCircuit) slAddHead(&shortList, hfs); else slAddHead(&longList, hfs); } sqlFreeResult(&sr); } + } hFreeConn(&conn); +dyStringFree(&clause); if (quickList != NULL) { slSort(&shortList, hgFindSpecPriCmp); *quickList = shortList; } else hgFindSpecFreeList(&shortList); if (fullList != NULL) { slSort(&longList, hgFindSpecPriCmp); *fullList = longList; } else hgFindSpecFreeList(&longList); @@ -2860,30 +2865,32 @@ } static struct searchableTrack *getSearchableTracks(struct cart *cart, char *database) /* Return the list of all tracks with an hgFindSpec available */ { if (trackHubDatabase(database)) return NULL; struct searchableTrack *ret = NULL; struct sqlConnection *conn = hAllocConn(database); struct slName *tbl, *tblList = hTrackDbList(); for (tbl = tblList; tbl != NULL; tbl = tbl->next) { char *tdbName, *findSpecName; tdbName = tbl->name; findSpecName = replaceChars(tbl->name, "trackDb", "hgFindSpec"); + if (hTableExists(database, findSpecName)) + { char query[1024]; sqlSafef(query, sizeof(query), "select distinct " "tableName,shortLabel,longLabel,searchDescription,priority " "from %s join %s on " "%s.searchTable=%s.tableName or " "%s.searchName=%s.tableName or " "%s.searchTable = concat('all_', %s.tableName) " "where searchTable !='knownGene' and searchName != 'knownGene' " "order by priority,shortLabel", findSpecName, tdbName, findSpecName, tdbName, findSpecName, tdbName, findSpecName, tdbName); struct sqlResult *sr = sqlGetResult(conn, query); char **row = NULL; struct trackDb *tdb = NULL; while ( (row = sqlNextRow(sr)) != NULL) { @@ -2891,30 +2898,31 @@ { struct searchableTrack *track = NULL; AllocVar(track); track->track = cloneString(row[0]); track->shortLabel = cloneString(row[1]); track->longLabel = cloneString(row[2]); track->description = cloneString(row[3]); track->visibility = isTrackVisible(cart, tdb); track->priority = sqlDouble(row[4]); track->grp = tdb->grp; slAddHead(&ret, track); } } sqlFreeResult(&sr); } + } hFreeConn(&conn); slReverse(&ret); return ret; } static struct trackDb *hubCategoriesToTdbList(struct searchCategory *categories) /* Make a list of trackDbs for the selected tracks */ { struct trackDb *ret = NULL; struct searchCategory *categ; for (categ = categories; categ != NULL; categ = categ->next) { if (startsWith("hub_", categ->id)) slAddHead(&ret, categ->tdb); }