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; ishortLabel; 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(""); + + 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; }