7ecb25c2270135eabfeb50aeaca073cf9d899ccb
hiram
  Tue Sep 17 14:49:38 2019 -0700
correct list chromosomes for a big* track from database where bigDataUrl is in a table refs #23589

diff --git src/hg/hubApi/list.c src/hg/hubApi/list.c
index 095359e..65e26ca 100644
--- src/hg/hubApi/list.c
+++ src/hg/hubApi/list.c
@@ -386,30 +386,44 @@
     apiErrAbort(err400, err400Msg, "failed to find bigDataUrl for specified track=%s in genome=%s for endpoint '/list/schema'  given hubUrl='%s'", track, genome, hubUrl);
 char *indexFileOrUrl = hReplaceGbdb(trackDbSetting(tdb, "bigDataIndex"));
 struct bbiFile *bbi = bigFileOpen(thisTrack->type, bigDataUrl);
 long long itemCount = bbiItemCount(bigDataUrl, thisTrack->type, indexFileOrUrl);
 
 outputTrackDbVars(jw, thisTrack, itemCount);
 
 struct asObject *as = bigBedAsOrDefault(bbi);
 struct sqlFieldType *fiList = sqlFieldTypesFromAs(as);
 bigColumnTypes(jw, fiList, as);
 
 apiFinishOutput(0, NULL, jw);
 }	/* static void hubSchemaJsonOutput(FILE *f, char *hubUrl,
 	 *	char *genome, char *track) */
 
+static char *bigDataUrlFromTable(struct sqlConnection *conn, char *table)
+/* perhaps there is a bigDataUrl in a database table */
+{
+char *bigDataUrl = NULL;
+char query[4096];
+char quickReturn[2048];
+
+sqlSafef(query, sizeof(query), "select fileName from %s", table);
+if (sqlQuickQuery(conn, query, quickReturn, sizeof(quickReturn)))
+    bigDataUrl = hReplaceGbdb(cloneString(quickReturn));
+
+return bigDataUrl;
+}
+
 static void schemaJsonOutput(FILE *f, char *db, char *track)
 /* for given db and track, output the schema for the associated table */
 {
 struct sqlConnection *conn = hAllocConnMaybe(db);
 if (NULL == conn)
     apiErrAbort(err400, err400Msg, "can not find 'genome=%s' for endpoint '/list/schema", db);
 
 struct trackDb *tdb = obtainTdb(NULL, db);
 struct trackDb *thisTrack = findTrackDb(track, tdb);
 if (NULL == thisTrack)	/* OK to work with tables without trackDb definitions */
     {
     if (! sqlTableExists(conn, track))
 	apiErrAbort(err400, err400Msg, "failed to find specified track=%s in genome=%s for endpoint '/list/schema'", track, db);
     }
 
@@ -441,43 +455,34 @@
     char *defaultChrom = hDefaultChrom(db);
     char fullTableName[256];
     safef(fullTableName, sizeof(fullTableName), "%s_%s", defaultChrom, hti->rootName);
     freeMem(sqlTableName);
     sqlTableName = cloneString(fullTableName);
     splitTableName = cloneString(fullTableName);
     }
 else
     {
     splitTableName = sqlTableName;
     }
 
 struct bbiFile *bbi = NULL;
 if (thisTrack && startsWith("big", thisTrack->type))
     {
+    if (isEmpty(bigDataUrl))
+        bigDataUrl = bigDataUrlFromTable(conn, splitTableName);
     if (bigDataUrl)
 	bbi = bigFileOpen(thisTrack->type, bigDataUrl);
-    else
-	{
-	char query[4096];
-	char quickReturn[2048];
-	sqlSafef(query, sizeof(query), "select fileName from %s", splitTableName);
-	if (sqlQuickQuery(conn, query, quickReturn, sizeof(quickReturn)))
-	    {
-	    bigDataUrl = hReplaceGbdb(cloneString(quickReturn));
-	    bbi = bigFileOpen(thisTrack->type, bigDataUrl);
-	    }
-	}
     if (NULL == bbi)
 	apiErrAbort(err400, err400Msg, "failed to find bigDataUrl=%s for track=%s in database=%s for endpoint '/getData/schema'", bigDataUrl, track, db);
     }
 
 char *dataTime = sqlTableUpdate(conn, splitTableName);
 
 time_t dataTimeStamp = sqlDateToUnixTime(dataTime);
 replaceChar(dataTime, ' ', 'T');	/* ISO 8601 */
 struct jsonWrite *jw = apiStartOutput();
 jsonWriteString(jw, "genome", db);
 jsonWriteString(jw, "track", track);
 jsonWriteString(jw, "dataTime", dataTime);
 jsonWriteNumber(jw, "dataTimeStamp", (long long)dataTimeStamp);
 freeMem(dataTime);
 
@@ -558,30 +563,32 @@
 struct sqlConnection *conn = hAllocConnMaybe(db);
 if (NULL == conn)
     apiErrAbort(err400, err400Msg, "can not find 'genome=%s' for endpoint '/list/chromosomes", db);
 
 if (table)
     chromName = validChromName(conn, db, table, &splitSqlTable, &tableInfo);
 
 /* given track can't find a chromName, maybe it is a bigDataUrl */
 if (table && ! chromName)
     {
     /* 'track' name in trackDb usually refers to a SQL 'table' */
     struct trackDb *tdb = obtainTdb(NULL, db);
     thisTrack = findTrackDb(table,tdb);
     /* might have a bigDataUrl */
     bigDataUrl = trackDbSetting(thisTrack, "bigDataUrl");
+    if (isEmpty(bigDataUrl))
+        bigDataUrl = bigDataUrlFromTable(conn, table);
     }
 
 /* in trackDb language: track == table */
 /* punting on split tables, just return chromInfo */
 if (table && chromName && ! (tableInfo && tableInfo->isSplit) )
     {
     if (! sqlTableExists(conn, splitSqlTable))
 	apiErrAbort(err400, err400Msg, "can not find specified 'track=%s' for endpoint: /list/chromosomes?genome=%s;track=%s", table, db, table);
 
     if (sqlColumnExists(conn, splitSqlTable, chromName))
 	{
 	char *dataTime = sqlTableUpdate(conn, splitSqlTable);
 	time_t dataTimeStamp = sqlDateToUnixTime(dataTime);
 	replaceChar(dataTime, ' ', 'T');	/* ISO 8601 */
         struct jsonWrite *jw = apiStartOutput();