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