941bf3e7563bb711b79180aa572f7250a3548d51
angie
  Fri Sep 3 15:28:41 2010 -0700
Redmine #717: obey tableBrowser off setting in 'selected fields from primary and related tables' page (thanks Brooke) and table schema 'Connected Tables and Joining Fields'.
diff --git src/hg/hgTables/mainPage.c src/hg/hgTables/mainPage.c
index 9c0048d..6b68ae2 100644
--- src/hg/hgTables/mainPage.c
+++ src/hg/hgTables/mainPage.c
@@ -244,7 +244,7 @@
     slAddHead(&(hel->val), sln);
 }
 
-static struct hash *accessControlInit(char *db, struct sqlConnection *conn)
+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). */
@@ -267,7 +267,7 @@
     struct trackDb *tdb;
     for (tdb = forbiddenTrackList;  tdb != NULL;  tdb = tdb->next)
 	{
-	char *tbOff = trackDbSetting(tdb, "tableBrowser");
+	char *tbOff = cloneString(trackDbSetting(tdb, "tableBrowser"));
 	if (isEmpty(tbOff))
 	    errAbort("bug: tdb for %s is in forbiddenTrackList without 'tableBrowser off' setting",
 		     tdb->track);
@@ -282,13 +282,26 @@
 return acHash;
 }
 
-static boolean accessControlDenied(struct hash *acHash, char *table)
+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;
@@ -314,22 +327,6 @@
 return TRUE;
 }
 
-static void freeHelSlNameList(struct hashEl *hel)
-/* Helper function for hashTraverseEls, to free slNameList vals. */
-{
-slNameFreeList(&(hel->val));
-}
-
-static void accessControlFree(struct hash **pAcHash)
-/* Free up access control hash. */
-{
-if (*pAcHash != NULL)
-    {
-    hashTraverseEls(*pAcHash, freeHelSlNameList);
-    freeHash(pAcHash);
-    }
-}
-
 
 struct slName *tablesForDb(char *db)
 /* Find tables associated with database. */
@@ -339,7 +336,6 @@
 struct slName *raw, *rawList = sqlListTables(conn);
 struct slName *cooked, *cookedList = NULL;
 struct hash *uniqHash = newHash(0);
-struct hash *accessCtlHash = accessControlInit(db, conn);
 
 hFreeConn(&conn);
 for (raw = rawList; raw != NULL; raw = raw->next)
@@ -348,8 +344,7 @@
 	{
 	/* Deal with tables split across chromosomes. */
 	char *root = unsplitTableName(raw->name);
-	if (accessControlDenied(accessCtlHash, root) ||
-	    accessControlDenied(accessCtlHash, raw->name))
+	if (accessControlDenied(db, root) || accessControlDenied(db, raw->name))
 	    continue;
 	if (!hashLookup(uniqHash, root))
 	    {
@@ -361,7 +356,7 @@
     else
         {
 	char dbTable[256];
-	if (accessControlDenied(accessCtlHash, raw->name))
+	if (accessControlDenied(db, raw->name))
 	    continue;
 	safef(dbTable, sizeof(dbTable), "%s.%s", db, raw->name);
 	cooked = slNameNew(dbTable);
@@ -369,7 +364,6 @@
 	}
     }
 hashFree(&uniqHash);
-accessControlFree(&accessCtlHash);
 slFreeList(&rawList);
 slSort(&cookedList, slNameCmp);
 return cookedList;