8715d83d38d8bb18adfdd9ce05771b4cede85407
angie
  Fri Dec 5 09:52:07 2014 -0800
Moved some hgTables code that had been copied into a couple differentplaces into a new lib module, cartTrackDb.  hgGenome/import.c has code
that is fairly similar but that also needs to filter out custom tracks
that were generated by hgGenome.

diff --git src/hg/hgTables/mainPage.c src/hg/hgTables/mainPage.c
index 25c7ec9..e4d8195 100644
--- src/hg/hgTables/mainPage.c
+++ src/hg/hgTables/mainPage.c
@@ -1,26 +1,27 @@
 /* mainPage - stuff to put up the first table browser page. */
 
 /* Copyright (C) 2014 The Regents of the University of California 
  * See README in this or parent directory for licensing information. */
 
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
 #include "htmshell.h"
 #include "cheapcgi.h"
 #include "cart.h"
+#include "cartTrackDb.h"
 #include "textOut.h"
 #include "jksql.h"
 #include "hdb.h"
 #include "web.h"
 #include "jsHelper.h"
 #include "hui.h"
 #include "hgColors.h"
 #include "trackDb.h"
 #include "grp.h"
 #include "hgTables.h"
 #include "joiner.h"
 #include "hubConnect.h"
 #include "trackHub.h"
 #include "hgConfig.h"
 
@@ -108,30 +109,31 @@
  * to save selection state. */
 {
 jsMakeTrackingRadioButton(hgtaRegionType, "regionType", val, selVal);
 }
 
 struct grp *showGroupField(char *groupVar, char *groupScript,
     struct sqlConnection *conn, boolean allTablesOk)
 /* Show group control. Returns selected group. */
 {
 struct grp *group, *groupList = fullGroupList;
 struct grp *selGroup = findSelectedGroup(groupList, groupVar);
 hPrintf("<B>group:</B>\n");
 hPrintf("<SELECT NAME=%s %s>\n", groupVar, groupScript);
 for (group = groupList; group != NULL; group = group->next)
     {
+    if (allTablesOk || differentString(group->name, "allTables"))
         hPrintf(" <OPTION VALUE=%s%s>%s\n", group->name,
                 (group == selGroup ? " SELECTED" : ""),
                 group->label);
     }
 hPrintf("</SELECT>\n");
 return selGroup;
 }
 
 static void addIfExists(struct hash *hash, struct slName **pList, char *name)
 /* Add name to tail of list if it exists in hash. */
 {
 if (hashLookup(hash, name))
     slNameAddTail(pList, name);
 }
 
@@ -214,186 +216,82 @@
 char *unsplitTableName(char *table)
 /* Convert chr*_name to name */
 {
 if (startsWith("chr", table))
     {
     char *s = strrchr(table, '_');
     if (s != NULL)
         {
 	table = s + 1;
 	}
     }
 return table;
 }
 
 
-static char *chopAtFirstDot(char *string)
-/* Terminate string at first '.' if found.  Return string for convenience. */
-{
-char *ptr = strchr(string, '.');
-if (ptr != NULL)
-    *ptr = '\0';
-return string;
-}
-
-static void hashAddSlName(struct hash *hash, char *key, char *val)
-/* If key is already in hash, add an slName for val to the head of the list;
- * otherwise just store key -> slName for val. */
-{
-struct slName *sln = slNameNew(val);
-struct hashEl *hel = hashLookup(hash, key);
-if (hel == NULL)
-    hashAdd(hash, key, sln);
-else
-    slAddHead(&(hel->val), sln);
-}
-
-static struct hash *accessControlInit(struct sqlConnection *conn)
-/* Return a hash associating restricted table/track names in the given db/conn
- * with virtual hosts, or NULL if there is no tableAccessControl table and no
- * forbiddenTrackList (see getFullTrackList). */
-{
-struct hash *acHash = NULL;
-if (sqlTableExists(conn, "tableAccessControl"))
-    {
-    struct sqlResult *sr = NULL;
-    char **row = NULL;
-    acHash = newHash(0);
-    sr = sqlGetResult(conn, "NOSQLINJ select name,host from tableAccessControl");
-    while ((row = sqlNextRow(sr)) != NULL)
-	hashAddSlName(acHash, row[0], chopAtFirstDot(row[1]));
-    sqlFreeResult(&sr);
-    }
-if (forbiddenTrackList != NULL)
-    {
-    if (acHash == NULL)
-	acHash = newHash(0);
-    struct trackDb *tdb;
-    for (tdb = forbiddenTrackList;  tdb != NULL;  tdb = tdb->next)
-	{
-	char *tbOff = cloneString(trackDbSetting(tdb, "tableBrowser"));
-	if (isEmpty(tbOff))
-	    errAbort("bug: tdb for %s is in forbiddenTrackList without 'tableBrowser off' setting",
-		     tdb->track);
-	hashAddSlName(acHash, tdb->table, "-");
-	// skip "off" and look for additional table names:
-	nextWord(&tbOff);
-	char *tbl;
-	while ((tbl = nextWord(&tbOff)) != NULL)
-	    hashAddSlName(acHash, tbl, "-");
-	}
-    }
-return acHash;
-}
-
-boolean accessControlDenied(char *db, char *table)
-/* Return TRUE if table access is restricted to some host(s) other than
- * the one we're running on. */
-{
-static char *currentHost = NULL;
-struct slName *enabledHosts = NULL;
-struct slName *sln = NULL;
-static struct hash *dbToAcHash = NULL;
-
-if (dbToAcHash == NULL)
-    dbToAcHash = hashNew(0);
-
-struct hash *acHash = hashFindVal(dbToAcHash, db);
-if (acHash == NULL)
-    {
-    struct sqlConnection *conn = hAllocConn(db);
-    acHash = accessControlInit(conn);
-    hFreeConn(&conn);
-    hashAdd(dbToAcHash, db, acHash);
-    }
-
-if (acHash == NULL)
-    return FALSE;
-enabledHosts = (struct slName *)hashFindVal(acHash, table);
-if (enabledHosts == NULL)
-    return FALSE;
-if (currentHost == NULL)
-    {
-    currentHost = cloneString(cgiServerName());
-    if (currentHost == NULL)
-	{
-	warn("accessControl: unable to determine current host");
-	return FALSE;
-	}
-    else
-	chopAtFirstDot(currentHost);
-    }
-for (sln = enabledHosts;  sln != NULL;  sln = sln->next)
-    {
-    if (sameString(currentHost, sln->name))
-	return FALSE;
-    }
-return TRUE;
-}
-
 
 struct slName *tablesForDb(char *db)
 /* Find tables associated with database. */
 {
 boolean isGenomeDb = sameString(db, database);
 struct sqlConnection *conn = hAllocConn(db);
 struct slName *raw, *rawList = sqlListTables(conn);
 struct slName *cooked, *cookedList = NULL;
 struct hash *uniqHash = newHash(0);
 
 hFreeConn(&conn);
 for (raw = rawList; raw != NULL; raw = raw->next)
     {
     if (isGenomeDb)
 	{
 	/* Deal with tables split across chromosomes. */
 	char *root = unsplitTableName(raw->name);
-	if (accessControlDenied(db, root) || accessControlDenied(db, raw->name))
+	if (cartTrackDbIsAccessDenied(db, root) || cartTrackDbIsAccessDenied(db, raw->name))
 	    continue;
 	if (!hashLookup(uniqHash, root))
 	    {
 	    hashAdd(uniqHash, root, NULL);
 	    cooked = slNameNew(root);
 	    slAddHead(&cookedList, cooked);
 	    }
 	}
     else
         {
 	char dbTable[256];
-	if (accessControlDenied(db, raw->name))
+	if (cartTrackDbIsAccessDenied(db, raw->name))
 	    continue;
 	safef(dbTable, sizeof(dbTable), "%s.%s", db, raw->name);
 	cooked = slNameNew(dbTable);
 	slAddHead(&cookedList, cooked);
 	}
     }
 hashFree(&uniqHash);
 slFreeList(&rawList);
 slSort(&cookedList, slNameCmp);
 return cookedList;
 }
 
 char *showTableField(struct trackDb *track, char *varName, boolean useJoiner)
 /* Show table control and label. */
 {
 struct slName *name, *nameList = NULL;
 char *selTable;
 
 if (track == NULL)
     nameList = tablesForDb(findSelDb());
 else
-    nameList = tablesForTrack(track, useJoiner);
+    nameList = cartTrackDbTablesForTrack(database, track, useJoiner);
 
 /* Get currently selected table.  If it isn't in our list
  * then revert to first in list. */
 selTable = cartUsualString(cart, varName, nameList->name);
 if (!slNameInListUseCase(nameList, selTable))
     selTable = nameList->name;
 
 /* Print out label and drop-down list. */
 hPrintf("<B>table: </B>");
 hPrintf("<SELECT NAME=\"%s\" %s>\n", varName, onChangeTable());
 struct trackDb *selTdb = NULL;
 for (name = nameList; name != NULL; name = name->next)
     {
     struct trackDb *tdb = NULL;
     if (track != NULL)
@@ -622,31 +520,31 @@
         }
     else
         {
         hPrintf("<TR><TD><B>genome:</B>\n");
         printGenomeListHtml(database, onChangeOrg());
         }
     nbSpaces(3);
     hPrintf("<B>assembly:</B>\n");
     printAssemblyListHtml(database, onChangeDb());
     hPrintf("</TD></TR>\n");
     }
 
 /* Print group and track line. */
     {
     hPrintf("<TR><TD>");
-    selGroup = showGroupField(hgtaGroup, onChangeGroupOrTrack(), conn, allowAllTables());
+    selGroup = showGroupField(hgtaGroup, onChangeGroupOrTrack(), conn, hAllowAllTables());
     nbSpaces(3);
     curTrack = showTrackField(selGroup, hgtaTrack, onChangeGroupOrTrack());
     nbSpaces(3);
     boolean hasCustomTracks = FALSE;
     struct trackDb *t;
     for (t = fullTrackList;  t != NULL;  t = t->next)
         {
         if (isCustomTrack(t->table))
             {
             hasCustomTracks = TRUE;
             break;
             }
         }
     hOnClickButton("document.customTrackForm.submit();return false;",
                    hasCustomTracks ? CT_MANAGE_BUTTON_LABEL : CT_ADD_BUTTON_LABEL);