4a030195664cbdd1d3c1a4b81b1ed41dbf6d9bc5 angie Fri Feb 15 14:02:58 2019 -0800 Prevent hgFind lib (specifically genomePos -> hgPositionsHtml) from opening a web page; instead, pass up results and warning messages to the calling CGI so it can open the page its own way. refs #22945 hgTracks, hgTables and hgVai used to call findGenomePos{,Web} to resolve positions; hgTables and hgVai had to detect after the fact whether an HTML page had been started (with warnings and/or multiple results). In fact, hgPositionsHtml called webEnd which could cause conflicts with what the CGI was doing afterwards. Now, instead of findGenomePos{,Web} there is hgFindSearch which returns hgp and also warning messages, if any, via a dyString parameter. The calling CGI decides how to open the page if necessary (for hgTracks, it's already open) and displays warnings/multiple results -- or just proceeds as usual with the single position result. diff --git src/hg/checkHgFindSpec/checkHgFindSpec.c src/hg/checkHgFindSpec/checkHgFindSpec.c index 07e4a88..2c5e444 100644 --- src/hg/checkHgFindSpec/checkHgFindSpec.c +++ src/hg/checkHgFindSpec/checkHgFindSpec.c @@ -57,31 +57,30 @@ " the target table for the search). Search for it.\n" " -makeExamples Print out an HTML table of example positions\n" " (suitable for a gateway description.html).\n" */ ); } boolean reportSearch(char *termToSearch) /* Show the list of tables that will be searched, and how long it took to * figure that out. Then do the search; show results and time required. */ //#*** this doesn't handle ; in termToSearch (until the actual search) { struct hgFindSpec *shortList = NULL, *longList = NULL; struct hgFindSpec *hfs = NULL; -struct hgPositions *hgp = NULL; int startMs = 0, endMs = 0; boolean gotError = FALSE; char *chrom = NULL; int chromStart = 0, chromEnd = 0; hgFindSpecGetAllSpecs(database, &shortList, &longList); puts("\n"); startMs = clock1000(); for (hfs = shortList; hfs != NULL; hfs = hfs->next) { boolean matches = TRUE; boolean tablesExist = hTableOrSplitExists(database, hfs->searchTable); if (isNotEmpty(termToSearch) && isNotEmpty(hfs->termRegex)) matches = regexMatchNoCase(termToSearch, hfs->termRegex); if (isNotEmpty(hfs->xrefTable)) @@ -124,46 +123,54 @@ isNotEmpty(hfs->xrefTable) ? " and/or " : "", isNotEmpty(hfs->xrefTable) ? hfs->xrefTable : ""); } else { verbose(2, "no match %s: %s\n", hfs->searchName, hfs->termRegex); } } endMs = clock1000(); printf("\nTook %dms to determine multiple/additive searches.\n" "(These won't happen if it short-circuits.)\n\n", endMs - startMs); if (isNotEmpty(termToSearch)) { + cartSetString(cart, "db", database); + char *position = cloneString(termToSearch); + struct dyString *dyWarn = dyStringNew(0); startMs = clock1000(); - hgp = findGenomePos(database, termToSearch, &chrom, &chromStart, &chromEnd, cart); + struct hgPositions *hgp = hgFindSearch(cart, &position, &chrom, &chromStart, &chromEnd, + "checkHgFindSpec", dyWarn); endMs = clock1000(); - if (hgp != NULL && hgp->singlePos != NULL) + if (isNotEmpty(dyWarn->string)) + warn("%s", dyWarn->string); + if (hgp->singlePos != NULL) { struct hgPos *pos = hgp->singlePos; char *table = "[No reported table!]"; char *name = pos->name ? pos->name : ""; char *browserName = pos->browserName ? pos->browserName : ""; char *description = pos->description ? pos->description : ""; if (hgp->tableList != NULL) table = hgp->tableList->name; printf("\nSingle result for %s from %s: %s:%d-%d [%s | %s | %s]\n", termToSearch, table, chrom, chromStart+1, chromEnd, name, browserName, description); } + else + hgPositionsHtml(database, hgp, "checkHgFindSpec", cart); printf("\nTook %dms to search for %s.\n\n", endMs - startMs, termToSearch); } hgFindSpecFreeList(&shortList); hgFindSpecFreeList(&longList); return(gotError); } static char *getFieldFromQuery(char *query, char *searchName) /* Get the value of the field that's being searched in query. */ { char *ptr = strstr(query, " where "); char *field = NULL; if (ptr == NULL)