88485cfa7f13affa28ec5765fe9b2db90cce42b6 markd Tue Dec 8 21:02:15 2020 -0800 hgPcr working diff --git src/hg/hgPcr/hgPcr.c src/hg/hgPcr/hgPcr.c index cf9eaf9..f08b185 100644 --- src/hg/hgPcr/hgPcr.c +++ src/hg/hgPcr/hgPcr.c @@ -1,30 +1,32 @@ /* hgPcr - In-silico PCR CGI for UCSC. */ /* Copyright (C) 2014 The Regents of the University of California * See README in this or parent directory for licensing information. */ #include "common.h" #include "hash.h" #include "errAbort.h" #include "errCatch.h" #include "hCommon.h" +#include "hgConfig.h" #include "dystring.h" #include "jksql.h" #include "linefile.h" #include "dnautil.h" #include "fa.h" #include "psl.h" +#include "genoFind.h" #include "gfPcrLib.h" #include "cheapcgi.h" #include "htmshell.h" #include "hdb.h" #include "hui.h" #include "cart.h" #include "dbDb.h" #include "blatServers.h" #include "targetDb.h" #include "pcrResult.h" #include "trashDir.h" #include "web.h" #include "botDelay.h" #include "oligoTm.h" #include "trackHub.h" @@ -44,94 +46,109 @@ "options:\n" " -xxx=XXX\n" ); } struct pcrServer /* Information on a server running on genomic assembly sequence. */ { struct pcrServer *next; /* Next in list. */ char *db; /* Database name. */ char *genome; /* Genome name. */ char *description; /* Assembly description */ char *host; /* Name of machine hosting server. */ char *port; /* Port that hosts server. */ char *seqDir; /* Directory of sequence files. */ + boolean isDynamic; /* is a dynamic server */ + char* genomeDataDir; /* genome name for dynamic gfServer */ }; struct targetPcrServer /* Information on a server running on non-genomic sequence, e.g. mRNA, * that has been aligned to a particular genomic assembly. */ { struct targetPcrServer *next; /* Next in list. */ char *host; /* Name of machine hosting server. */ char *port; /* Port that hosts server. */ struct targetDb *targetDb; /* All of the info about the target. */ }; struct pcrServer *getTrackHubServers() /* Get the list of track hubs that have PCR services. */ { struct pcrServer *serverList = NULL, *server; struct dbDb *dbDbList = trackHubGetPcrServers(); for(; dbDbList; dbDbList = dbDbList->next) { AllocVar(server); server->db = dbDbList->name; server->genome = dbDbList->organism; server->description = dbDbList->description; - trackHubGetPcrParams(server->db, &server->host, &server->port); + trackHubGetPcrParams(server->db, &server->host, &server->port, &server->genomeDataDir); struct trackHubGenome *genome = trackHubGetGenome(server->db); server->seqDir = cloneString(genome->twoBitPath); char *ptr = strrchr(server->seqDir, '/'); // we only want the directory name if (ptr != NULL) *ptr = 0; slAddHead(&serverList, server); } return serverList; } struct pcrServer *getServerList() /* Get list of available servers. */ { struct pcrServer *serverList = NULL, *server; struct sqlConnection *conn = hConnectCentral(); struct sqlResult *sr; char **row; serverList = getTrackHubServers(); -/* Do a little join to get data to fit into the pcrServer. */ -sr = sqlGetResult(conn, - NOSQLINJ "select dbDb.name,dbDb.genome,dbDb.description,blatServers.host," - "blatServers.port,dbDb.nibPath " - "from dbDb,blatServers where " +/* Do a little join to get data to fit into the pcrServer. Check for newer + * dynamic flag and allow with or without it. For debugging, one set the + * variable blatServersTbl to some db.table to pick up settings from somewhere + * other than dbDb.blatServers. */ +char *blatServersTbl = cfgOptionDefault("blatServersTbl", "blatServers"); +boolean haveDynamic = sqlColumnExists(conn, blatServersTbl, "dynamic"); +char query[512]; +sqlSafef(query, sizeof(query), + "select dbDb.name,dbDb.genome,dbDb.description,blatServers.host," + "blatServers.port,dbDb.nibPath, %s " + "from dbDb, %s blatServers where " "dbDb.name = blatServers.db " - "and blatServers.canPcr = 1 order by dbDb.orderKey" ); + "and blatServers.canPcr = 1 order by dbDb.orderKey", + (haveDynamic ? "blatServers.dynamic" : "0"), blatServersTbl); +sr = sqlGetResult(conn, query); while ((row = sqlNextRow(sr)) != NULL) { AllocVar(server); server->db = cloneString(row[0]); server->genome = cloneString(row[1]); server->description = cloneString(row[2]); server->host = cloneString(row[3]); server->port = cloneString(row[4]); server->seqDir = hReplaceGbdbSeqDir(row[5], server->db); + if (atoi(row[6])) + { + server->isDynamic = TRUE; + server->genomeDataDir = cloneString(server->db); // directories by database name for database genomes + } slAddHead(&serverList, server); } sqlFreeResult(&sr); hDisconnectCentral(&conn); if (serverList == NULL) errAbort("Sorry, no PCR servers are available"); slReverse(&serverList); return serverList; } struct pcrServer *findServer(char *db, struct pcrServer *serverList) /* Return server for given database. Db can either be * database name or description. */ { struct pcrServer *server; @@ -364,30 +381,31 @@ hGenome(db), hFreezeDate(db), organism, hFreezeDate(orgServer->db)); *pDb = db = orgServer->db; } } void doGetPrimers(char *db, char *organism, struct pcrServer *serverList, char *fPrimer, char *rPrimer, int maxSize, int minPerfect, int minGood, boolean flipReverse) /* Put up form to get primers. */ { redoDbAndOrgIfNoServer(serverList, &db, &organism); struct sqlConnection *conn = hConnectCentral(); boolean gotTargetDb = sqlTableExists(conn, "targetDb"); hDisconnectCentral(&conn); + printf("