2452b8280ae2188283a2d158eebd8bc17a8ebdf5
angie
  Fri Apr 27 10:14:19 2018 -0700
TB GFF output was assuming mysql db, failed on assembly hubs.  refs #21353

diff --git src/hg/hgTables/gffOut.c src/hg/hgTables/gffOut.c
index 9a9fd74..ffb94d1 100644
--- src/hg/hgTables/gffOut.c
+++ src/hg/hgTables/gffOut.c
@@ -393,53 +393,58 @@
 // Make sure that the table has a chrom field.
 // a bbi table will NOT have a chrom field
 int cIdx = sqlFieldIndex(conn, table, "chrom");
 if (cIdx < 0)
     return NULL;
 sqlSafef(query, sizeof query, "select distinct chrom, 'dummyvalue' from %s", table);
 struct hash *hash = sqlQuickHash(conn, query);
 return hash;
 }
 
 void doOutGff(char *table, struct sqlConnection *conn, boolean outputGtf)
 /* Save as GFF/GTF. */
 {
 struct hTableInfo *hti = getHti(database, table, conn);
 struct bed *bedList;
+struct hash *chromHash = NULL;
 struct slName *exonFramesList = NULL;
 char source[HDB_MAX_TABLE_STRING];
 int itemCount;
 struct region *region, *regionList = getRegions();
 
 textOpen();
 
+int efIdx = -1;
+safef(source, sizeof(source), "%s_%s", database, table);
+if (conn)
+    {
     boolean simpleTableExists = sqlTableExists(conn, table);
     // simpleTable means not split table, not custom track
     // However it still can include bbi table with bam fileName path
-int efIdx = -1;
     if (simpleTableExists)  // no tables having exonFrames are split tables anyway
         efIdx = sqlFieldIndex(conn, table, "exonFrames");
-safef(source, sizeof(source), "%s_%s", database, table);
     itemCount = 0;
-struct hash *chromHash = NULL;
     int regionCount = slCount(regionList);
     // regionList can have many thousands of items e.g. rheMac3 has 34000 chroms!
     // This regionCount threshold should be just above the # chroms in the latest human assembly
     if (simpleTableExists && (regionCount > 500))
         {
         chromHash = makeChromHashForTable(conn, table);
-    };
+        }
+    }
+// Note: code could be added here to extract exonFrames from bigGenePred
+
 // Process each region
 for (region = regionList; region != NULL; region = region->next)
     {
     if (chromHash && (!hashFindVal(chromHash, region->chrom)))
 	    continue;
     struct lm *lm = lmInit(64*1024);
     int fieldCount;
     bedList = cookedBedList(conn, table, region, lm, &fieldCount);
     // Use exonFrames field if available for better accuracy instead of calculating from coordinates
     if (efIdx != -1) 
 	exonFramesList = getExonFrames(table, conn, bedList);
     itemCount += bedToGffLines(bedList, exonFramesList, hti, fieldCount, source, outputGtf);
     lmCleanup(&lm);
     }
 if (itemCount == 0)