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; }