8a0946dd6870f10cde056ba243f1fb4ec1fd16b4
angie
  Thu Feb 27 11:58:33 2014 -0800
Adding support for plain VCF custom tracks (as opposed to VCF+tabix),since users seem to want to upload VCF, and as long as the file is
not too big it will work OK.  This means adding a new track type
vcf (as opposed to vcfTabix) and supporting it in hgTracks, hgTrackUi,
hgc, hgTables and hgVai.  (and others I've forgotten?)
refs #12416

diff --git src/hg/hgTables/identifiers.c src/hg/hgTables/identifiers.c
index e8e6eb7..b7e4ab6 100644
--- src/hg/hgTables/identifiers.c
+++ src/hg/hgTables/identifiers.c
@@ -52,44 +52,45 @@
 	sqlFieldIndex(conn, xrefTable, aliasField) < 0)
 	xrefTable = idField = aliasField = NULL;
     }
 if (retXrefTable != NULL)
     *retXrefTable = xrefTable;
 if (retIdField != NULL)
     *retIdField = idField;
 if (retAliasField != NULL)
     *retAliasField = aliasField;
 }
 
 static struct slName *getExamples(char *db, struct sqlConnection *conn,
 				  char *table, char *field, int count)
 /* Return a list of several example values of table.field. */
 {
+boolean isTabix = FALSE;
 if (isBamTable(table))
     {
     assert(sameString(field, "qName"));
     return randomBamIds(table, conn, count);
     }
 else if (isBigBed(db, table, curTrack, ctLookupName))
     {
     assert(sameString(field, "name"));
     return randomBigBedIds(table, conn, count);
     }
-else if (isVcfTable(table))
+else if (isVcfTable(table, &isTabix))
     {
     assert(sameString(field, "id"));
-    return randomVcfIds(table, conn, count);
+    return randomVcfIds(table, conn, count, isTabix);
     }
 else
     {
     char fullTable[HDB_MAX_TABLE_STRING];
     char *c = strchr(table, '.');
     if (c || ! hFindSplitTable(database, NULL, table, fullTable, NULL))
 	safecpy(fullTable, sizeof(fullTable), table);
     return sqlRandomSampleConn(conn, fullTable, field, count);
     }
 }
 
 static void explainIdentifiers(char *db, struct sqlConnection *conn, char *idField)
 /* Tell the user what field(s) they may paste/upload values for, and give
  * some examples. */
 {
@@ -289,31 +290,31 @@
     {
     if (sameString(row[0], row[1]))
 	continue;
     touppers(row[0]);
     hashAdd(hash, row[0], lmCloneString(lm, row[1]));
     }
 sqlFreeResult(&sr);
 }
 
 static struct hash *getAllPossibleIds(struct sqlConnection *conn,
 				      struct lm *lm, char *idField, char *extraWhere)
 /* If curTable is a custom track or bigFile, return NULL.  Otherwise,
  * make a hash of all identifiers in curTable (and alias tables if specified)
  * so that we can check the validity of pasted/uploaded identifiers. */
 {
-if (isCustomTrack(curTable) || isBamTable(curTable) || isVcfTable(curTable) ||
+if (isCustomTrack(curTable) || isBamTable(curTable) || isVcfTable(curTable, NULL) ||
     isBigBed(database, curTable, curTrack, ctLookupName))
     return NULL;
 
 struct hash *matchHash = hashNew(20);
 struct slName *tableList;
 char *xrefTable = NULL, *xrefIdField = NULL, *aliasField = NULL;
 struct sqlConnection *alternateConn = conn;
 
 if (sameWord(curTable, WIKI_TRACK_TABLE))
     alternateConn = wikiConnect();
 
 if (sameWord(curTable, WIKI_TRACK_TABLE))
     tableList = slNameNew(WIKI_TRACK_TABLE);
 else if (strchr(curTable, '.'))
     tableList = slNameNew(curTable);