0042a4fea15ed7f06067f0b3a17761f1b37257da hiram Fri Apr 26 22:53:23 2019 -0700 correctly exit when specified genome is not found in hub for list/chromosomes function refs #18869 diff --git src/hg/hubApi/list.c src/hg/hubApi/list.c index 10d3a7a..1bf49dd 100644 --- src/hg/hubApi/list.c +++ src/hg/hubApi/list.c @@ -190,31 +190,30 @@ struct chromInfo *ci = NULL; /* might be a track hub on a UCSC database */ if (isEmpty(foundGenome->twoBitPath)) { struct sqlConnection *conn = hAllocConnMaybe(foundGenome->trackHub->defaultDb); if (NULL == conn) apiErrAbort(err400, err400Msg, "can not find database 'genome=%s' for endpoint '/list/chromosomes", foundGenome->trackHub->defaultDb); else hFreeConn(&conn); ci = createChromInfoList(NULL, foundGenome->trackHub->defaultDb); } else { ci = trackHubAllChromInfo(foundGenome->name); } -fprintf(stderr, "# DBG: sorting ci length: %d\n", slCount(ci)); slSort(ci, chromInfoCmp); jsonWriteNumber(jw, "chromCount", (long long)slCount(ci)); jsonWriteObjectStart(jw, "chromosomes"); struct chromInfo *el = ci; for ( ; el != NULL; el = el->next ) { jsonWriteNumber(jw, el->chrom, (long long)el->size); } jsonWriteObjectEnd(jw); /* chromosomes */ } apiFinishOutput(0, NULL, jw); } static void chromInfoJsonOutput(FILE *f, char *db) /* for given db, if there is a track, list the chromosomes in that track, @@ -325,44 +324,47 @@ } } jsonWriteObjectEnd(jw); } if (tdb->subtracks) { struct trackDb *el = NULL; for (el = tdb->subtracks; el != NULL; el = el->next ) { recursiveTrackList(jw, el); } } } /* static void recursiveTrackList() */ + +#ifdef NOT static int trackDbTrackCmp(const void *va, const void *vb) /* Compare to sort based on 'track' name; use shortLabel as secondary sort key. * Note: parallel code to hgTracks.c:tgCmpPriority */ { const struct trackDb *a = *((struct trackDb **)va); const struct trackDb *b = *((struct trackDb **)vb); int dif = strcmp(a->track, b->track); if (dif < 0) return -1; else if (dif == 0.0) return strcasecmp(a->shortLabel, b->shortLabel); else return 1; } +#endif static void trackDbJsonOutput(char *db, FILE *f) /* return track list from specified UCSC database name */ { struct sqlConnection *conn = hAllocConnMaybe(db); if (NULL == conn) apiErrAbort(err400, err400Msg, "can not find database 'db=%s' for endpoint '/list/tracks", db); char *dataTime = sqlTableUpdate(conn, "trackDb"); time_t dataTimeStamp = sqlDateToUnixTime(dataTime); replaceChar(dataTime, ' ', 'T'); /* ISO 8601 */ hFreeConn(&conn); struct trackDb *tdbList = obtainTdb(NULL, db); struct jsonWrite *jw = apiStartOutput(); jsonWriteString(jw, "db", db); @@ -430,46 +432,45 @@ if (isEmpty(hubUrl) && isEmpty(db)) apiErrAbort(err400, err400Msg, "ERROR: missing hubUrl or db name for endpoint /list/tracks"); if (isEmpty(hubUrl)) // missing hubUrl implies UCSC database { trackDbJsonOutput(db, stdout); // only need db for this function return; } if (isEmpty(genome) || isEmpty(hubUrl)) { if (isEmpty(genome)) apiErrAbort(err400, err400Msg, "ERROR: must supply genome='someName' the name of a genome in a hub for /list/tracks\n"); if (isEmpty(hubUrl)) apiErrAbort(err400, err400Msg, "ERROR: must supply hubUrl='http:...' some URL to a hub for /list/tracks"); } struct trackHub *hub = errCatchTrackHubOpen(hubUrl); - if (hub->genomeList) - { - struct trackDb *tdbList = obtainTdb(hub->genomeList, NULL); - slSort(tdbList, trackDbTrackCmp); + struct trackHubGenome *hubGenome = findHubGenome(hub, genome, + "/list/tracks", hubUrl); + struct trackDb *tdbList = obtainTdb(hubGenome, NULL); +// slSort(tdbList, trackDbTrackCmp); struct jsonWrite *jw = apiStartOutput(); jsonWriteString(jw, "hubUrl", hubUrl); jsonWriteObjectStart(jw, genome); struct trackDb *el = NULL; for (el = tdbList; el != NULL; el = el->next ) { recursiveTrackList(jw, el); } jsonWriteObjectEnd(jw); apiFinishOutput(0, NULL, jw); } - } else if (sameWord("chromosomes", words[1])) { char *hubUrl = cgiOptionalString("hubUrl"); char *genome = cgiOptionalString("genome"); char *db = cgiOptionalString("db"); if (isNotEmpty(db)) { struct sqlConnection *conn = hAllocConnMaybe(db); if (NULL == conn) apiErrAbort(err400, err400Msg, "can not find database 'db=%s' for endpoint '/list/chromosomes", db); else hFreeConn(&conn); } if (isEmpty(hubUrl) && isEmpty(db)) apiErrAbort(err400, err400Msg, "must supply hubUrl or db name for endpoint '/list/chromosomes", hubUrl, db);