ed5115dcdb3fd8e7233f84466730fc8c5e85c729
max
  Thu Apr 3 05:23:19 2014 -0700
Libifying yesterday's commit and applying another patch to hgVai to makeit work in the browserbox, refs #11957 and #12717

diff --git src/hg/lib/jksql.c src/hg/lib/jksql.c
index 3d7f8d8..e02a375 100644
--- src/hg/lib/jksql.c
+++ src/hg/lib/jksql.c
@@ -702,77 +702,95 @@
     monitorPrint(conn, "SQL_NOT_FOUND_TABLE_CACHE", "%s", tableListTable);
     return NULL;
     }
 }
 
 static bool sqlTableCacheTableExists(struct sqlConnection *conn, char* table)
 /* check if table exists in table name cache */
 // (see redmine 3780 for some historical background on this caching)
 {
 char query[1024];
 char *tableListTable = cfgVal("showTableCache");
 sqlSafef(query, sizeof(query), "SELECT count(*) FROM %s WHERE tableName='%s'", tableListTable, table);
 return (sqlQuickNum(conn, query)!=0);
 }
 
-static struct slName *sqlTableCacheQuery(struct sqlConnection *conn)
-/* return all table names from the table name cache as a list. */
+static struct slName *sqlTableCacheQuery(struct sqlConnection *conn, char *likeExpr)
+/* return all table names from the table name cache as a list. 
+ * Can optionally filter with a likeExpr e.g. "LIKE snp%". */
 {
 char *tableList = cfgVal("showTableCache");
 struct slName *list = NULL, *el;
 char query[1024];
-sqlSafef(query, sizeof(query), "SELECT DISTINCT tableName FROM %s", tableList);
+// mysql SHOW TABLES is sorted alphabetically by default
+if (likeExpr==NULL)
+    sqlSafef(query, sizeof(query), "SELECT DISTINCT tableName FROM %s ORDER BY tableName", tableList);
+else
+    sqlSafef(query, sizeof(query), 
+        "SELECT DISTINCT tableName FROM %s WHERE tableName %s ORDER BY tableName", tableList, likeExpr);
 
 struct sqlResult *sr = sqlGetResult(conn, query);
 char **row;
 while ((row = sqlNextRow(sr)) != NULL)
     {
     el = slNameNew(row[0]);
     slAddHead(&list, el);
     }
+slReverse(&list);
 sqlFreeResult(&sr);
 return list;
 }
 
-struct slName *sqlListTables(struct sqlConnection *conn)
-/* Return list of tables in database associated with conn. */
+struct slName *sqlListTablesLike(struct sqlConnection *conn, char *likeExpr)
+/* Return list of tables in database associated with conn. Optionally filter list with
+ * given LIKE expression that can be NULL or string e.g. "LIKE 'snp%'". */
 {
 struct slName *list = NULL, *el;
 struct sqlResult *sr;
 char **row;
 
 struct sqlConnection *cacheConn = sqlTableCacheFindConn(conn);
 
 if (cacheConn)
-    list = sqlTableCacheQuery(cacheConn);
+    list = sqlTableCacheQuery(cacheConn, likeExpr);
 else
     {
     char query[256];
+    if (likeExpr == NULL)
         sqlSafef(query, sizeof(query), "SHOW TABLES");
+    else
+        sqlSafef(query, sizeof(query), "SHOW TABLES %s", likeExpr);
+
     sr = sqlGetResult(conn, query);
     while ((row = sqlNextRow(sr)) != NULL)
         {
         el = slNameNew(row[0]);
         slAddHead(&list, el);
         }
     slReverse(&list);
     sqlFreeResult(&sr);
     }
 
 return list;
 }
 
+struct slName *sqlListTables(struct sqlConnection *sc)
+/* Return list of tables in database associated with conn. */
+{
+return sqlListTablesLike(sc, NULL);
+}
+
 struct sqlResult *sqlDescribe(struct sqlConnection *conn, char *table)
 /* run the sql DESCRIBE command or get a cached table description and return the sql result */
 {
 char query[1024];
 
 struct sqlConnection *cacheConn = sqlTableCacheFindConn(conn);
 
 if (cacheConn)
     {
     char *tableListTable = cfgVal("showTableCache");
     sqlSafef(query, sizeof(query), "SELECT Field, Type, NullAllowed, isKey, hasDefault, Extra FROM %s WHERE tableName='%s'", \
         tableListTable, table);
     conn = cacheConn;
     }