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/hgTables/hgTables.c src/hg/hgTables/hgTables.c index e12fb9f..2cf93db 100644 --- src/hg/hgTables/hgTables.c +++ src/hg/hgTables/hgTables.c @@ -366,82 +366,41 @@ sr = sqlGetResult(conn, NOSQLINJ "select chrom,chromStart,chromEnd,name from encodeRegions order by name desc"); while ((row = sqlNextRow(sr)) != NULL) { AllocVar(region); region->chrom = cloneString(row[0]); region->start = atoi(row[1]); region->end = atoi(row[2]); region->name = cloneString(row[3]); /* encode region name */ slAddHead(&list, region); } sqlFreeResult(&sr); hFreeConn(&conn); return list; } -boolean searchPosition(char *range, struct region *region) -/* Try and fill in region via call to hgFind. Return FALSE - * if it can't find a single position. */ -{ -struct hgPositions *hgp = NULL; -char retAddr[512]; -char position[512]; -safef(retAddr, sizeof(retAddr), "%s", getScriptName()); -hgp = findGenomePosWeb(database, range, ®ion->chrom, ®ion->start, ®ion->end, - cart, TRUE, retAddr); -if (hgp != NULL && hgp->singlePos != NULL) - { - safef(position, sizeof(position), - "%s:%d-%d", region->chrom, region->start+1, region->end); - cartSetString(cart, hgtaRange, position); - return TRUE; - } -else if (region->start == 0) /* Confusing way findGenomePosWeb says pos not found. */ - { - cartSetString(cart, hgtaRange, hDefaultPos(database)); - return FALSE; - } -else - return FALSE; -} - -boolean lookupPosition() -/* Look up position (aka range) if need be. Return FALSE if it puts - * up multiple positions. */ +struct hgPositions *lookupPosition(struct dyString *dyWarn) +/* Look up position (aka range) if need be. Return a container of matching tables and positions. + * Warnings/errors are appended to dyWarn. */ { char *range = windowsToAscii(cloneString(cartUsualString(cart, hgtaRange, ""))); -boolean isSingle = TRUE; range = trimSpaces(range); -if (range[0] != 0) - { - struct region r; - cartSetLastPosition(cart, range, oldVars); - isSingle = searchPosition(range, &r); - if (!isSingle) - { - // In case user manually edits the browser location as described in #13009, - // revert the position. If they instead choose from the list as we expect, - // that will set the position to their choice. - char *lastPosition = cartUsualString(cart, "lastPosition", hDefaultPos(database)); - cartSetString(cart, "position", lastPosition); - } - } -else - { - cartSetString(cart, hgtaRange, hDefaultPos(database)); - } -return isSingle; +if (isEmpty(range)) + range = hDefaultPos(database); +struct hgPositions *hgp = hgFindSearch(cart, &range, NULL, NULL, NULL, getScriptName(), dyWarn); +cartSetString(cart, hgtaRange, range); +return hgp; } struct region *getRegions() /* Consult cart to get list of regions to work on. */ { char *regionType = cartUsualString(cart, hgtaRegionType, "genome"); struct region *regionList = NULL, *region; if (sameString(regionType, hgtaRegionTypeGenome)) { regionList = getRegionsFullGenome(); } else if (sameString(regionType, hgtaRegionTypeRange)) { char *range = cartString(cart, hgtaRange); boolean parseOk = FALSE; @@ -1791,45 +1750,54 @@ if (backgroundStatus) { getBackgroundStatus(backgroundStatus); exit(0); } char *backgroundExec = cgiUsualString("backgroundExec", NULL); if (sameOk(backgroundExec,"gsSendToDM")) { gsSendToDM(); exit(0); } /* Init track and group lists and figure out what page to put up. */ initGroupsTracksTables(); -if (lookupPosition()) +struct dyString *dyWarn = dyStringNew(0); +struct hgPositions *hgp = lookupPosition(dyWarn); +if (hgp->singlePos && isEmpty(dyWarn->string)) { if (cartUsualBoolean(cart, hgtaDoGreatOutput, FALSE)) doGetGreatOutput(dispatch); else dispatch(); } else { + cartWebStartHeader(cart, database, "Table Browser"); + if (isNotEmpty(dyWarn->string)) + warn("%s", dyWarn->string); + if (hgp->posCount > 1) + hgPositionsHtml(database, hgp, hgTablesName(), cart); + else + { struct sqlConnection *conn = NULL; if (!trackHubDatabase(database)) conn = curTrack ? hAllocConnTrack(database, curTrack) : hAllocConn(database); - webPushErrHandlersCartDb(cart, database); mainPageAfterOpen(conn); hFreeConn(&conn); + } cartWebEnd(); } textOutClose(&compressPipeline, &saveStdout); if (doGenomeSpace()) { if (gsTemp) { cartSetString(cart, "gsTemp", gsTemp); char *workUrl = NULL; startBackgroundWork("./hgTables backgroundExec=gsSendToDM", &workUrl); htmlOpen("Uploading Output to GenomeSpace");