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);
     }