7b6f3754b360c658474379263645fd8e91d6f46d
braney
  Wed Dec 6 16:49:47 2023 -0800
add fixTrackDb program that will prune a trackDb table of tracks that
have no data

diff --git src/hg/lib/hdb.c src/hg/lib/hdb.c
index ceb1502..b37a1e6 100644
--- src/hg/lib/hdb.c
+++ src/hg/lib/hdb.c
@@ -3836,31 +3836,31 @@
  * that may be split and/or * binned. */
 {
 return hExtendedChromQuery(conn, rootTable, chrom, extraWhere,
 	FALSE, NULL, retRowOffset);
 }
 
 boolean hTrackOnChrom(struct trackDb *tdb, char *chrom)
 /* Return TRUE if track exists on this chromosome. */
 {
 boolean chromOk = TRUE;
 if (tdb->restrictCount > 0 && chrom != NULL)
     chromOk =  (stringArrayIx(chrom, tdb->restrictList, tdb->restrictCount)) >= 0;
 return chromOk;
 }
 
-static boolean loadOneTrackDb(char *db, char *where, char *tblSpec,
+boolean loadOneTrackDb(char *db, char *where, char *tblSpec,
                               struct trackDb **tdbList, struct hash *loaded)
 /* Load a trackDb table, including handling profiles:tbl. Returns
  * TRUE if table exists */
 {
 char *tbl;
 boolean exists;
 // when using dbProfiles and a list of trackDb entries, it's possible that the
 // database doesn't exist in one of servers.
 struct sqlConnection *conn = hAllocConnProfileTblMaybe(db, tblSpec, &tbl);
 if ((exists = ((conn != NULL) && sqlTableExists(conn, tbl))))
     {
     struct trackDb *oneTable = trackDbLoadWhere(conn, tbl, where), *oneRow;
     while ((oneRow = slPopHead(&oneTable)) != NULL)
         {
         if (!hashLookup(loaded, oneRow->track))
@@ -3871,31 +3871,31 @@
             char *profileName = getTrackProfileName(oneRow);
             if (profileName != NULL)
                 tableListProcessTblProfile(profileName, db);
 	    }
         else
 	    {
             trackDbFree(&oneRow);
 	    }
         }
     }
 
 hFreeConn(&conn);
 return exists;
 }
 
-static struct trackDb *loadTrackDb(char *db, char *where)
+struct trackDb *loadTrackDb(char *db, char *where)
 /* Load each trackDb table.  Will put supertracks in parent field of given tracks but
  * these are still in track list. */
 {
 if (trackHubDatabase(db))
     return NULL;
 
 struct trackDb *tdbList = NULL;
 struct slName *tableList = hTrackDbList(), *one;
 boolean foundOne = FALSE;
 struct hash *loaded = hashNew(0);
 for (one = tableList; one != NULL; one = one->next)
     {
     if (loadOneTrackDb(db, where, one->name, &tdbList, loaded))
         foundOne = TRUE;
     }