7fdfab0ba90789194773f2bbd31bcc6ab161631a
galt
  Tue Aug 5 10:57:28 2014 -0700
Fixes #12559. GenomeSpace support added to hgTables.
diff --git src/hg/hgTables/hgTables.c src/hg/hgTables/hgTables.c
index 058b83d..becef50 100644
--- src/hg/hgTables/hgTables.c
+++ src/hg/hgTables/hgTables.c
@@ -24,30 +24,31 @@
 #include "customTrack.h"
 #include "pipeline.h"
 #include "hgFind.h"
 #include "hgTables.h"
 #include "joiner.h"
 #include "bedCart.h"
 #include "hgMaf.h"
 #include "gvUi.h"
 #include "wikiTrack.h"
 #include "trackHub.h"
 #include "hubConnect.h"
 #include "hgConfig.h"
 #include "udc.h"
 #include "chromInfo.h"
 #include "knetUdc.h"
+#include "trashDir.h"
 
 void usage()
 /* Explain usage and exit. */
 {
 errAbort(
   "hgTables - Get table data associated with tracks and intersect tracks\n"
   "usage:\n"
   "   hgTables XXX\n"
   "options:\n"
   "   -xxx=XXX\n"
   );
 }
 
 /* Global variables. */
 struct cart *cart;	/* This holds cgi and other variables between clicks. */
@@ -58,30 +59,33 @@
 struct grp *fullGroupList;	/* List of all groups. */
 struct grp *curGroup;	/* Currently selected group. */
 struct trackDb *fullTrackList;	/* List of all tracks in database. */
 struct hash *fullTrackHash;     /* Hash of all tracks in fullTrackList keyed by ->track field. */
 #ifdef UNUSED
 struct hash *fullTrackAndSubtrackHash;  /* All tracks and subtracks keyed by tdb->track field. */
 #endif /* UNUSED */
 struct hash *fullTableToTdbHash;        /* All tracks and subtracks keyed by tdb->table field. */
 struct trackDb *forbiddenTrackList; /* List of tracks with 'tableBrowser off' setting. */
 struct trackDb *curTrack;	/* Currently selected track. */
 char *curTable;		/* Currently selected table. */
 struct joiner *allJoiner;	/* Info on how to join tables. */
 
 static struct pipeline *compressPipeline = (struct pipeline *)NULL;
 
+char *gsTemp = NULL;
+int saveStdout = -1;
+
 boolean allowAllTables(void)
 /* determine if all tables should is allowed by configuration */
 {
 return !cfgOptionBooleanDefault("hgta.disableAllTables", FALSE);
 }
 
 /* --------------- HTML Helpers ----------------- */
 
 void hPrintSpaces(int count)
 /* Print a number of non-breaking spaces. */
 {
 int i;
 for (i=0; i<count; ++i)
     hPrintf("&nbsp;");
 }
@@ -177,30 +181,31 @@
 pushWarnHandler(errAbortHandler);
 }
 
 void htmlOpen(char *format, ...)
 /* Start up a page that will be in html format. */
 {
 va_list args;
 va_start(args, format);
 vaHtmlOpen(format, args);
 va_end(args);
 }
 
 void htmlClose()
 /* Close down html format page. */
 {
+popWarnHandler();
 cartWebEnd();
 }
 
 
 void explainWhyNoResults(FILE *f)
 /* Put up a little explanation to user of why they got nothing. */
 {
 if (f == NULL)
     f = stdout;
 fprintf(f, "# No results");
 if (identifierFileName() != NULL)
     fprintf(f, " matching identifier list");
 if (anyFilter())
     fprintf(f, " passing filter");
 if (!fullGenomeRegion())
@@ -217,41 +222,52 @@
     return curTrack->shortLabel;
 else
     return curTable;
 }
 
 char *getScriptName()
 /* returns script name from environment or hardcoded for command line */
 {
 char *script = cgiScriptName();
 if (script != NULL)
     return script;
 else
     return hgTablesName();
 }
 
+
 void textOpen()
 /* Start up page in text format. (No need to close this).
  *	In case of pipeline output to a compressor, it is closed
  *	at main() exit.
  */
 {
 char *fileName = cartUsualString(cart, hgtaOutFileName, "");
 char *compressType = cartUsualString(cart, hgtaCompressType,
 				     textOutCompressNone);
 
-compressPipeline = textOutInit(fileName, compressType);
+if (doGenomeSpace())
+    {
+    char hgsid[64];
+    struct tempName tn;
+    safef(hgsid, sizeof(hgsid), "%s", cartSessionId(cart));
+    trashDirFile(&tn, "genomeSpace", hgsid, ".tmp");
+    gsTemp = cloneString(tn.forCgi);
+    fileName = gsTemp;
+    }
+
+compressPipeline = textOutInit(fileName, compressType, &saveStdout);
 }
 
 
 void dbOverrideFromTable(char buf[256], char **pDb, char **pTable)
 /* If *pTable includes database, overrider *pDb with it, using
  * buf to hold string. */
 {
 char *s;
 safef(buf, 256, "%s", *pTable);
 s = strchr(buf, '.');
 if (s != NULL)
     {
     *pDb = buf;
     *s++ = 0;
     *pTable = s;
@@ -1683,30 +1699,35 @@
 	{
 	/* display disclaimer and add flag to cart, program exits from here */
 	htmlStart("Table Browser");
 	gvDisclaimer();
 	}
     else if (sameString(track->table, "gvPos") &&
 	     sameString(cartString(cart, "gvDisclaimer"), "Disagree"))
 	{
 	cartRemove(cart, "gvDisclaimer");
 	cartRemove(cart, hgtaDoTopSubmit);
 	cartSetString(cart, hgtaDoMainPage, "return to table browser");
 	dispatch();
 	return;
 	}
     }
+if (doGenomeSpace())
+    {
+    if (!checkGsReady())
+	return;
+    }
 if (doGreat())
     verifyGreatFormat(output);
 if (sameString(output, outPrimaryTable))
     {
     if (doGalaxy() && !cgiOptionalString(hgtaDoGalaxyQuery))
         sendParamsToGalaxy(hgtaDoTopSubmit, "get output");
     else
         doOutPrimaryTable(table, conn);
     }
 else if (sameString(output, outSelectedFields))
     doOutSelectedFields(table, conn);
 else if (sameString(output, outSequence))
     doOutSequence(conn);
 else if (sameString(output, outMicroarrayNames))
     doOutMicroarrayNames(track);
@@ -1900,30 +1921,35 @@
     doSubtrackMergeSubmit(conn);
 else if (cartVarExists(cart, hgtaDoSubtrackMergePage))
     doSubtrackMergePage(conn);
 else if (cartVarExists(cart, hgtaDoLookupPosition))
     doLookupPosition(conn);
 else if (cartVarExists(cart, hgtaDoSetUserRegions))
     doSetUserRegions(conn);
 else if (cartVarExists(cart, hgtaDoSubmitUserRegions))
     doSubmitUserRegions(conn);
 else if (cartVarExists(cart, hgtaDoClearSetUserRegionsText))
     doClearSetUserRegionsText(conn);
 else if (cartVarExists(cart, hgtaDoClearUserRegions))
     doClearUserRegions(conn);
 else if (cartVarExists(cart, hgtaDoMetaData))
     doMetaData(conn);
+else if (cartVarExists(cart, hgtaDoGsLogin))
+    {
+    doGsLogin(conn);
+    dispatch();
+    }
 else	/* Default - put up initial page. */
     doMainPage(conn, FALSE);
 cartRemovePrefix(cart, hgtaDo);
 hFreeConn(&conn);
 }
 
 char *excludeVars[] = {"Submit", "submit", NULL};
 
 static void rAddTablesToHash(struct trackDb *tdbList, struct hash *hash)
 /* Add tracks in list to hash, keyed by tdb->table*/
 {
 struct trackDb *tdb;
 for (tdb = tdbList; tdb != NULL; tdb = tdb->next)
     {
     hashAdd(hash, tdb->table, tdb);
@@ -1964,74 +1990,117 @@
     curGroup = fullGroupList;
 if (sameString(curGroup->name, "allTables"))
     curTrack = NULL;
 curTable    = findSelectedTable(curTrack, hgtaTable);
 if (curTrack == NULL)
     {
     struct trackDb *tdb  = hTrackDbForTrack(database, curTable);
     struct trackDb *cTdb = hCompositeTrackDbForSubtrack(database, tdb);
     if (cTdb)
         curTrack = cTdb;
     else
         curTrack = tdb;
     }
 }
 
+
 void hgTables()
 /* hgTables - Get table data associated with tracks and intersect tracks.
  * Here we set up cart and some global variables, dispatch the command,
  * and put away the cart when it is done. */
 {
+
 char *clade = NULL;
 
 setUdcCacheDir();
+
 oldVars = hashNew(10);
 
 /* Sometimes we output HTML and sometimes plain text; let each outputter
  * take care of headers instead of using a fixed cart*Shell(). */
 cart = cartAndCookieNoContent(hUserCookie(), excludeVars, oldVars);
 
 /* Set up global variables. */
 allJoiner = joinerRead("all.joiner");
 getDbGenomeClade(cart, &database, &genome, &clade, oldVars);
 freezeName = hFreezeFromDb(database);
 
 int timeout = cartUsualInt(cart, "udcTimeout", 300);
 if (udcCacheTimeout() < timeout)
     udcSetCacheTimeout(timeout);
 knetUdcInstall();
 
+char *backgroundStatus = cartUsualString(cart, "backgroundStatus", NULL);
+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())
     {
     if (cartUsualBoolean(cart, hgtaDoGreatOutput, FALSE))
 	doGetGreatOutput(dispatch);
     else
 	dispatch();
     }
 else
     {
     struct sqlConnection *conn = NULL;
     if (!trackHubDatabase(database))
 	conn = curTrack ? hAllocConnTrack(database, curTrack) : hAllocConn(database);
     doMainPage(conn, TRUE);
     hFreeConn(&conn);
     }
+
+textOutClose(&compressPipeline, &saveStdout);
+
+if (doGenomeSpace())
+    {
+    if (gsTemp)
+	{
+	cartSetString(cart, "gsTemp", gsTemp);
+	char *workUrl = NULL;
+	startBackgroundWork("./hgTables backgroundExec=gsSendToDM", &workUrl);
+
+	htmlOpen("Uploading Output to GenomeSpace");
+
+	puts("<script type=\"text/JavaScript\">");
+	puts("<!--");
+	printf("setTimeout(\"location = 'hgTables?backgroundStatus=%s';\",2000);\n", cgiEncode(workUrl)); // was 10000?
+	puts("-->");
+	puts("</script>");
+
+	gsTemp = NULL;
+	}	
+    }
+
+
 /* Save variables. */
 cartCheckout(&cart);
 }
 
 int main(int argc, char *argv[])
 /* Process command line. */
 {
+
 long enteredMainTime = clock1000();
+
 pushCarefulMemHandler(LIMIT_2or6GB);
 htmlPushEarlyHandlers(); /* Make errors legible during initialization. */
 cgiSpoof(&argc, argv);
 
 hgTables();
 
-textOutClose(&compressPipeline);
 cgiExitTime("hgTables", enteredMainTime);
+
 return 0;
 }