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