88485cfa7f13affa28ec5765fe9b2db90cce42b6
markd
  Tue Dec 8 21:02:15 2020 -0800
hgPcr working

diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c
index 013a9ee3..d97ce79 100644
--- src/hg/hgBlat/hgBlat.c
+++ src/hg/hgBlat/hgBlat.c
@@ -317,60 +317,61 @@
 char dbActualName[32];
 
 /* If necessary convert database description to name. */
 sqlSafef(query, sizeof(query), "select name from dbDb where name = '%s'", db);
 if (!sqlExists(conn, query))
     {
     sqlSafef(query, sizeof(query), "select name from dbDb where description = '%s'", db);
     if (sqlQuickQuery(conn, query, dbActualName, sizeof(dbActualName)) != NULL)
         db = dbActualName;
     }
 
 struct serverTable *st;
 AllocVar(st);
 
 /* Do a little join to get data to fit into the serverTable and grab
- * dbDb.nibPath too.  check for newer dynamic flag.  sqlSafef doesn't lets us
- * format in comma in field spec, so need to do this in two steps. */
-char *blatServersTbl = "blatServers"; // this can be hack to use another db.table for debugging
-char queryTmpl[512];
+ * dbDb.nibPath too.  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");
-safef(queryTmpl, sizeof(queryTmpl), "select dbDb.name, dbDb.description, blatServers.isTrans,"
-      "blatServers.host, blatServers.port, dbDb.nibPath %s "
-      "from dbDb, %s blatServers where blatServers.isTrans = %%d and "
-      "dbDb.name = '%%s' and dbDb.name = blatServers.db", 
-      (haveDynamic ? ", blatServers.dynamic" : ""), blatServersTbl);
-sqlSafef(query, sizeof(query), queryTmpl, isTrans, db);
+sqlSafef(query, sizeof(query), "select dbDb.name, dbDb.description, blatServers.isTrans,"
+         "blatServers.host, blatServers.port, dbDb.nibPath, %s "
+         "from dbDb, %s blatServers where blatServers.isTrans = %d and "
+         "dbDb.name = '%s' and dbDb.name = blatServers.db", 
+         (haveDynamic ? "blatServers.dynamic" : "0"), blatServersTbl, isTrans, db);
 sr = sqlGetResult(conn, query);
 if ((row = sqlNextRow(sr)) == NULL)
     {
     errAbort("Can't find a server for %s database %s.  Click "
 	     "<A HREF=\"/cgi-bin/hgBlat?%s&command=start&db=%s\">here</A> "
 	     "to reset to default database.",
 	     (isTrans ? "translated" : "DNA"), db,
 	     cartSidUrlString(cart), hDefaultDb());
     }
 st->db = cloneString(row[0]);
 st->genome = cloneString(row[1]);
 st->isTrans = atoi(row[2]);
 st->host = cloneString(row[3]);
 st->port = cloneString(row[4]);
 st->nibDir = hReplaceGbdbSeqDir(row[5], st->db);
-if (haveDynamic && atoi(row[6]))
+if (atoi(row[6]))
     {
     st->isDynamic = TRUE;
-    st->genomeDataDir = cloneString(st->db);  // db only allows directories by database
+    st->genomeDataDir = cloneString(st->db);  // directories by database name for database genomes
     }
 
 sqlFreeResult(&sr);
 hDisconnectCentral(&conn);
 return st;
 }
 
 static struct serverTable *trackHubServerTable(char *db, boolean isTrans)
 /* Load blat table for a hub */
 {
 char *host, *port;
 char *genomeDataDir;
 
 if (!trackHubGetBlatParams(db, isTrans, &host, &port, &genomeDataDir))
     errAbort("Cannot get blat server parameters for track hub with database %s", db);
@@ -385,37 +386,30 @@
 st->port = port;
 struct trackHubGenome *genome = trackHubGetGenome(db);
 st->nibDir = cloneString(genome->twoBitPath);
 char *ptr = strrchr(st->nibDir, '/');
 // we only want the directory name
 if (ptr != NULL)
     *ptr = 0;
 if (genomeDataDir != NULL)
     {
     st->isDynamic = TRUE;
     st->genomeDataDir = cloneString(genomeDataDir);
     }
 return st;
 }
 
-static char *dynServerGenome(char *db)
-/* translate the database to the genome string to send to a dynamic
- * gfServer */
-{
-return trackHubDatabase(db) ? trackHubAssemblyField(db, "genome") : db;
-}
-
 struct serverTable *findServer(char *db, boolean isTrans)
 /* Return server for given database.  Db can either be
  * database name or description. */
 {
 if (trackHubDatabase(db))
     return trackHubServerTable(db, isTrans);
 else
     return databaseServerTable(db, isTrans);
 }
 
 void findClosestServer(char **pDb, char **pOrg)
 /* If db doesn't have a blat server, look for the closest db (or org) that has one,
  * as hgPcr does. */
 {
 char *db = *pDb, *org = *pOrg;
@@ -998,44 +992,44 @@
 for(gfR=gH->gfList; gfR; gfR=gfR->next)
     {
     gfR->qStart = gfR->qStart * qFactor + gfR->qFrame;
     gfR->qEnd   = gfR->qEnd   * qFactor + gfR->qFrame;
     gfR->tStart = gfR->tStart * tFactor + gfR->tFrame;
     gfR->tEnd   = gfR->tEnd   * tFactor + gfR->tFrame;
     }
 }
 
 void queryServerFinish(struct genomeHits *gH)
 /* Report results from gfServer. */
 {
 char buf[256];
 int matchCount = 0;
 
-struct gfConnection *conn = gfMayConnect(gH->host, gH->port, gH->isDynamic);
+struct gfConnection *conn = gfMayConnect(gH->host, gH->port, trackHubDatabaseToGenome(gH->db), gH->genomeDataDir);
 if (conn == NULL)
     {
     gH->error = TRUE;
     gH->networkErrMsg = "Connection to gfServer failed.";
     return;
     }
 
 dyStringPrintf(gH->dbg,"query strand %s qsize %d<br>\n", gH->queryRC ? "-" : "+", gH->dnaSize);
 
 /* Put together query command. */
 if (gH->isDynamic)
     safef(buf, sizeof buf, "%s%s %s %s %d", gfSignature(), gH->type,
-          dynServerGenome(gH->db), gH->genomeDataDir, gH->dnaSize);
+          conn->genome, conn->genomeDataDir, gH->dnaSize);
 else
     safef(buf, sizeof buf, "%s%s %d", gfSignature(), gH->type, gH->dnaSize);
 gfBeginRequest(conn);
 mustWriteFd(conn->fd, buf, strlen(buf));
 
 if (read(conn->fd, buf, 1) < 0)
     errAbort("queryServerFinish: read failed: %s", strerror(errno));
 if (buf[0] != 'Y')
     errAbort("Expecting 'Y' from server, got %c", buf[0]);
 mustWriteFd(conn->fd, gH->dna, gH->dnaSize);  // Cannot shifted earlier for speed. must wait for Y confirmation.
 
 if (gH->complex)
     {
     char *s = netRecieveString(conn->fd, buf);
     if (!s)
@@ -1325,31 +1319,31 @@
 }
 
 
 int findGenomeParams(struct gfConnection *conn, struct serverTable *serve)
 /* Send status message to server arnd report result.
  * Get tileSize stepSize and minMatch.
  */
 {
 char buf[256];
 int ret = 0;
 
 /* Put together command. */
 gfBeginRequest(conn);
 if (serve->isDynamic)
     sprintf(buf, "%s%s %s %s", gfSignature(), (serve->isTrans ? "transInfo" : "untransInfo"),
-            dynServerGenome(serve->db), serve->genomeDataDir);
+            conn->genome, conn->genomeDataDir);
 else
     sprintf(buf, "%sstatus", gfSignature());
 mustWriteFd(conn->fd, buf, strlen(buf));
 
 for (;;)
     {
     if (netGetString(conn->fd, buf) == NULL)
 	{
 	warn("Error reading status information from %s:%s",serve->host, serve->port);
 	ret = -1;
         break;
 	}
     if (sameString(buf, "end"))
         break;
     else
@@ -1560,31 +1554,31 @@
     #else
     // read genome size
     if (trackHubDatabase(database))
 	{
 	genomeSize = findGenomeSizeFromHub(database);
 	}
     else
 	{
 	genomeSize = findGenomeSize(database);
 	}
     minMatchShown = findMinMatch(genomeSize, qType == gftProt);
     #endif
     if (allResults)
 	minMatchShown = 0;
 
-    conn = gfConnect(serve->host, serve->port, serve->isDynamic);
+    conn = gfConnect(serve->host, serve->port, trackHubDatabaseToGenome(serve->db), serve->genomeDataDir);
 
     // read tileSize stepSize minMatch from server status
     findGenomeParams(conn, serve);
 
     int minLucky = (serve->minMatch * serve->stepSize + (serve->tileSize - serve->stepSize)) * xlat;
 
     minSuggested = max(minMatchShown,minLucky);
     }
 
 int seqNumber = 0;
 /* Loop through each sequence. */
 for (seq = seqList; seq != NULL; seq = seq->next)
     {
     printf(" "); fflush(stdout);  /* prevent apache cgi timeout by outputting something */
     oneSize = realSeqSize(seq, !isTx);
@@ -1620,76 +1614,71 @@
 	warn("Sequence %s would take us over the %d letter limit, stopping here.",
 	     seq->name, maxTotalSize);
 	break;
 	}
 
     if (isTx)
 	{
 	gvo->reportTargetStrand = TRUE;
 	if (isTxTx)
 	    {
 	    if (allGenomes)
 		queryServer(serve->host, serve->port, db, seq, "transQuery", xType, TRUE, FALSE, FALSE, seqNumber,
                             serve->genomeDataDir);
 	    else
 		{
-		gfAlignTransTrans(conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth,
-                                  dynServerGenome(serve->db), serve->genomeDataDir);
+		gfAlignTransTrans(conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth);
 		}
 	    if (txTxBoth)
 		{
 		reverseComplement(seq->dna, seq->size);
 		if (allGenomes)
 		    queryServer(serve->host, serve->port, db, seq, "transQuery", xType, TRUE, FALSE, TRUE, seqNumber,
                                 serve->genomeDataDir);
 		else
 		    {
-		    gfAlignTransTrans(conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE,
-                                      dynServerGenome(serve->db), serve->genomeDataDir);
+		    gfAlignTransTrans(conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE);
 		    }
 		}
 	    }
 	else
 	    {
 	    if (allGenomes)
 		queryServer(serve->host, serve->port, db, seq, "protQuery", xType, TRUE, TRUE, FALSE, seqNumber,
                             serve->genomeDataDir);
 	    else
 		{
-		gfAlignTrans(conn, serve->nibDir, seq, 5, tFileCache, gvo,
-                             dynServerGenome(serve->db), serve->genomeDataDir);
+		gfAlignTrans(conn, serve->nibDir, seq, 5, tFileCache, gvo);
 		}
 	    }
 	}
     else
 	{
 	if (allGenomes)
 	    queryServer(serve->host, serve->port, db, seq, "query", xType, FALSE, FALSE, FALSE, seqNumber,
                         serve->genomeDataDir);
 	else
 	    {
-	    gfAlignStrand(conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo,
-                          dynServerGenome(serve->db), serve->genomeDataDir);
+	    gfAlignStrand(conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo);
 	    }
 	reverseComplement(seq->dna, seq->size);
 	if (allGenomes)
 	    queryServer(serve->host, serve->port, db, seq, "query", xType, FALSE, FALSE, TRUE, seqNumber,
                         serve->genomeDataDir);
 	else
 	    {
-	    gfAlignStrand(conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo,
-                          dynServerGenome(serve->db), serve->genomeDataDir);
+	    gfAlignStrand(conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo);
 	    }
 	}
     gfOutputQuery(gvo, f);
     ++seqNumber;
     }
 carefulClose(&f);
 
 if (!allGenomes)
     {
     showAliPlaces(pslTn.forCgi, faTn.forCgi, NULL, serve->db, qType, tType, 
               organism, feelingLucky);
     }
 
 if(!feelingLucky && !allGenomes)
     cartWebEnd();