f683064dc6a998206665b484790ef9d561e6c8a7
markd
  Sat Dec 5 22:42:53 2020 -0800
initial conversion to gfServer connection to object

diff --git src/hg/hgBlat/hgBlat.c src/hg/hgBlat/hgBlat.c
index ae4d56c..28a6a51 100644
--- src/hg/hgBlat/hgBlat.c
+++ src/hg/hgBlat/hgBlat.c
@@ -61,31 +61,31 @@
 		      given by caller rather than returned by gfServer. */ 
     };
 
 struct genomeHits
 /* Information about hits on a genome assembly */
     {
     struct genomeHits *next;
     char *host;		/* Host. */
     char *port;	        /* Port. */
     char *db;		/* Database name. */
     char *genome;	/* Genome name. */
     int seqNumber;      /* Submission order */
     char *faName;       /* fasta name */
     char *dna;          /* query dna */
     int dnaSize;        /* query dna size */
-    int sd;             /* Connection */
+    struct gfConnection *conn;  /* Connection */
     char *type;         /* query type = query, protQuery, transQuery */
     char *xType;        /* query type = dna, prot, rnax, dnax */
     boolean queryRC;    /* is the query reverse-complemented */
     boolean complex;    /* is the query complex */
     boolean isProt;     /* is the protein query */
     boolean isDynamic;  /* is a dynamic server */
     char *genomeDataDir; /* dynamic server root-relative directory */
    
     int maxGeneHits;    /* Highest gene hit-count */
     char *maxGeneChrom; /* Target Chrom for gene with max gene hits */
     int maxGeneChromSize; /* Target Chrom Size for only prot, rnax, dnax */
     int maxGeneTStart;  /* Target Start Coordinate for gene with max hits */  
     int maxGeneTEnd;    /* Target End Coordinate for gene with max hits*/
     int maxGeneExons;   /* Number of Exons in gene with max hits */
     char maxGeneStrand[3]; /* + or - or ++ +- -+ -- Strand for gene with max hits */ 
@@ -993,83 +993,81 @@
     return;
 int qFactor = 3;
 int tFactor = 3;
 if (gH->isProt)
     qFactor = 1;
 struct gfResult *gfR = NULL;
 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;
     }
 }
 
-int gfConnectEx(char *host, char *port)
+struct gfConnection *gfConnectEx(char *host, char *port)
 /* Try to connect to gfServer */
 {
-int conn = -1;
 if (allGenomes)
-    conn = gfMayConnect(host, port); // returns -1 on failure
+    return gfMayConnect(host, port); // returns NULL on failure
 else
-    conn = gfConnect(host, port);  // errAborts on failure.
-return conn;
+    return gfConnect(host, port);  // errAborts on failure.
 }
 
 
 void queryServerFinish(struct genomeHits *gH)
 /* Report results from gfServer. */
 {
 char buf[256];
 int matchCount = 0;
 
-gH->sd = gfConnectEx(gH->host, gH->port);
-if (gH->sd == -1)
+gH->conn = gfConnectEx(gH->host, gH->port);
+if (gH->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 %d %s %s", gfSignature(), gH->type, gH->dnaSize,
           dynServerGenome(gH->db), gH->genomeDataDir);
 else
     safef(buf, sizeof buf, "%s%s %d", gfSignature(), gH->type, gH->dnaSize);
-mustWriteFd(gH->sd, buf, strlen(buf));
+mustWriteFd(gH->conn->fd, buf, strlen(buf));
 
-if (read(gH->sd, buf, 1) < 0)
+if (read(gH->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(gH->sd, gH->dna, gH->dnaSize);  // Cannot shifted earlier for speed. must wait for Y confirmation.
+mustWriteFd(gH->conn->fd, gH->dna, gH->dnaSize);  // Cannot shifted earlier for speed. must wait for Y confirmation.
 
 if (gH->complex)
     {
-    char *s = netRecieveString(gH->sd, buf);
+    char *s = netRecieveString(gH->conn->fd, buf);
     if (!s)
 	errAbort("expected response from gfServer with tileSize");
     dyStringPrintf(gH->dbg,"%s<br>\n", s);  // from server: tileSize 4
     }
 
 for (;;)
     {
-    if (netGetString(gH->sd, buf) == NULL)
+    if (netGetString(gH->conn->fd, buf) == NULL)
         break;
     if (sameString(buf, "end"))
         {
         dyStringPrintf(gH->dbg,"%d matches<br>\n", matchCount);
         break;
         }
     else if (startsWith("Error:", buf))
        {
        errAbort("%s", buf);
        break;
        }
     else
         {
         dyStringPrintf(gH->dbg,"%s<br>\n", buf);
 	// chop the line into words
@@ -1138,31 +1136,31 @@
 	    {
 	    gfR->tStrand = word[6][0];          // e.g. + or -
 	    gfR->tFrame = sqlUnsigned(word[7]); // e.g. 0,1,2
 	    if (!gH->isProt)
 		{
 		gfR->qFrame = sqlUnsigned(word[8]); // e.g. 0,1,2
 		}
 	    }
 	else
 	    {
 	    gfR->tStrand = '+';  // dna search only on + target strand
 	    }
 	
         if (gH->complex)
             {
-            char *s = netGetLongString(gH->sd);
+            char *s = netGetLongString(gH->conn->fd);
             if (s == NULL)
                 break;
             dyStringPrintf(gH->dbg,"%s<br>\n", s); //dumps out qstart1 tstart1 qstart2 tstart2 ...  
             freeMem(s);
             }
 
 	slAddHead(&gH->gfList, gfR);
         }
     ++matchCount;
     }
 slReverse(&gH->gfList);
 
 unTranslateCoordinates(gH);  // convert back to untranslated coordinates
 slSort(&gH->gfList, gfResultsCmp);  // sort by tStrand, chrom, tStart
 
@@ -1261,31 +1259,31 @@
 	if (gH->maxGeneTEnd < r[qFrame].maxGeneTEnd)
 	    {
 	    gH->maxGeneTEnd = r[qFrame].maxGeneTEnd; 
 	    }
 		
 	}
 
     gH->maxGeneHits /= 3;  // average over 3 frames.
 
     char qStrand = (gH->queryRC ? '-' : '+');
     safef(gH->maxGeneStrand, sizeof gH->maxGeneStrand, "%c%c", qStrand, gH->maxGeneTStrand);
 
     }
 
 
-close(gH->sd);
+gfDisconnect(&gH->conn);
 }
 
 int findMinMatch(long genomeSize, boolean isProt)
 // Return default minMatch for genomeSize,
 // the expected number of occurrences of string length k 
 // in random genome of size N = N/(4^k)
 {
 int alphaBetSize;
 if (isProt)
     {
     alphaBetSize = 20;
     genomeSize = genomeSize / 3;
     }
 else
     {
@@ -1332,84 +1330,84 @@
     genomeSize += twoBitSeqSize(genome->tbf, index->name);
     }
 
 twoBitClose(&genome->tbf);
 
 return genomeSize;
 }
 
 
 int findGenomeParams(struct serverTable *serve)
 /* Send status message to server arnd report result.
  * Get tileSize stepSize and minMatch.
  */
 {
 char buf[256];
-int sd = 0;
+struct gfConnection *conn = NULL;
 int ret = 0;
 
 /* Put together command. */
-sd = gfConnectEx(serve->host, serve->port);
+conn = gfConnectEx(serve->host, serve->port);
 if (serve->isDynamic)
     sprintf(buf, "%s%s %s %s", gfSignature(), (serve->isTrans ? "transInfo" : "untransInfo"),
             dynServerGenome(serve->db), serve->genomeDataDir);
 else
     sprintf(buf, "%sstatus", gfSignature());
-mustWriteFd(sd, buf, strlen(buf));
+mustWriteFd(conn->fd, buf, strlen(buf));
 
 for (;;)
     {
-    if (netGetString(sd, buf) == NULL)
+    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
         {
 	if (startsWith("tileSize ", buf))
 	    {
             serve->tileSize = atoi(buf+strlen("tileSize "));
 	    }
 	if (startsWith("stepSize ", buf))
 	    {
             serve->stepSize = atoi(buf+strlen("stepSize "));
 	    }
 	if (startsWith("minMatch ", buf))
 	    {
             serve->minMatch = atoi(buf+strlen("minMatch "));
 	    }
         }
     }
-close(sd);
+gfDisconnect(&conn);
 return(ret); 
 }
 
 void blatSeq(char *userSeq, char *organism, char *database, int dbCount)
 /* Blat sequence user pasted in. */
 {
 FILE *f;
 struct dnaSeq *seqList = NULL, *seq;
 struct tempName pslTn, faTn;
 int maxSingleSize, maxTotalSize, maxSeqCount;
 char *genome, *db;
 char *type = cgiString("type");
 char *seqLetters = cloneString(userSeq);
 struct serverTable *serve;
-int conn;
+struct gfConnection *conn = NULL;
 int oneSize, totalSize = 0, seqCount = 0;
 boolean isTx = FALSE;
 boolean isTxTx = FALSE;
 boolean txTxBoth = FALSE;
 struct gfOutput *gvo;
 boolean qIsProt = FALSE;
 enum gfType qType, tType;
 struct hash *tFileCache = gfFileCacheNew();
 // allGenomes ignores I'm Feeling Lucky for simplicity
 boolean feelingLucky = cgiBoolean("Lucky") && !allGenomes;
 char *xType = NULL; 
 
 if (allGenomes)
     {
     db = database;
@@ -1574,31 +1572,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;
 
-    // read tileZize stepSize minMatch from server status
+    // read tileSize stepSize minMatch from server status
     findGenomeParams(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);
     // Impose half the usual bot delay per sequence
     
@@ -1633,79 +1631,79 @@
 	     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
 		{
 		conn = gfConnectEx(serve->host, serve->port);
-		gfAlignTransTrans(&conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth,
+		gfAlignTransTrans(conn, serve->nibDir, seq, FALSE, 5, tFileCache, gvo, !txTxBoth,
                                   dynServerGenome(serve->db), serve->genomeDataDir);
 		}
 	    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
 		    {
 		    conn = gfConnectEx(serve->host, serve->port);
-		    gfAlignTransTrans(&conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE,
+		    gfAlignTransTrans(conn, serve->nibDir, seq, TRUE, 5, tFileCache, gvo, FALSE,
                                       dynServerGenome(serve->db), serve->genomeDataDir);
 		    }
 		}
 	    }
 	else
 	    {
 	    if (allGenomes)
 		queryServer(serve->host, serve->port, db, seq, "protQuery", xType, TRUE, TRUE, FALSE, seqNumber,
                             serve->genomeDataDir);
 	    else
 		{
 		conn = gfConnectEx(serve->host, serve->port);
-		gfAlignTrans(&conn, serve->nibDir, seq, 5, tFileCache, gvo,
+		gfAlignTrans(conn, serve->nibDir, seq, 5, tFileCache, gvo,
                              dynServerGenome(serve->db), serve->genomeDataDir);
 		}
 	    }
 	}
     else
 	{
 	if (allGenomes)
 	    queryServer(serve->host, serve->port, db, seq, "query", xType, FALSE, FALSE, FALSE, seqNumber,
                         serve->genomeDataDir);
 	else
 	    {
 	    conn = gfConnectEx(serve->host, serve->port);
-	    gfAlignStrand(&conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo,
+	    gfAlignStrand(conn, serve->nibDir, seq, FALSE, minMatchShown, tFileCache, gvo,
                           dynServerGenome(serve->db), serve->genomeDataDir);
 	    }
 	reverseComplement(seq->dna, seq->size);
 	if (allGenomes)
 	    queryServer(serve->host, serve->port, db, seq, "query", xType, FALSE, FALSE, TRUE, seqNumber,
                         serve->genomeDataDir);
 	else
 	    {
 	    conn = gfConnectEx(serve->host, serve->port);
-	    gfAlignStrand(&conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo,
+	    gfAlignStrand(conn, serve->nibDir, seq, TRUE, minMatchShown, tFileCache, gvo,
                           dynServerGenome(serve->db), serve->genomeDataDir);
 	    }
 	}
     gfOutputQuery(gvo, f);
     ++seqNumber;
     }
 carefulClose(&f);
 
 if (!allGenomes)
     {
     showAliPlaces(pslTn.forCgi, faTn.forCgi, NULL, serve->db, qType, tType, 
               organism, feelingLucky);
     }
 
 if(!feelingLucky && !allGenomes)