0b52ad3ec2c6113bfdd692a58fee812b7dd0a7b2
kent
  Fri Feb 4 20:47:27 2011 -0800
Getting Table Browser to handle BAM files.  This is ready for testing by folks other than me now. Should work for both built-in BAM files and BAM files from track data hubs. I've tested it more though via the hubs. Works mostly by converting bam->sam->array-of-strings and then slotting into the same code bigBed processing uses.
diff --git src/hg/hgTables/asObj.c src/hg/hgTables/asObj.c
index a178c64..ac3f730 100644
--- src/hg/hgTables/asObj.c
+++ src/hg/hgTables/asObj.c
@@ -1,79 +1,113 @@
 /* asObj - get and use parsed autoSQL objects describing table. */
 
 #include "common.h"
 #include "linefile.h"
 #include "jksql.h"
 #include "asParse.h"
 #include "errCatch.h"
 #include "hgTables.h"
 
 static char const rcsid[] = "$Id: asObj.c,v 1.4 2009/05/20 20:59:55 mikep Exp $";
 
 static struct asObject *asForTableOrDie(struct sqlConnection *conn, char *table)
 /* Get autoSQL description if any associated with table.   Abort if
  * there's a problem*/
 {
 struct asObject *asObj = NULL;
 if (isBigBed(database, table, curTrack, ctLookupName))
     {
     asObj = bigBedAsForTable(table, conn);
     }
+else if (isBamTable(table))
+    {
+    asObj = bamAsObj();
+    }
 else
     {
     if (sqlTableExists(conn, "tableDescriptions"))
 	{
 	char query[256];
 	char *asText = NULL;
 
 	/* Try split table first. */
 	safef(query, sizeof(query), 
 	    "select autoSqlDef from tableDescriptions where tableName='chrN_%s'",
 	    table);
 	asText = sqlQuickString(conn, query);
 
 	/* If no result try unsplit table. */
 	if (asText == NULL)
 	    {
 	    safef(query, sizeof(query), 
 		"select autoSqlDef from tableDescriptions where tableName='%s'",
 		table);
 	    asText = sqlQuickString(conn, query);
 	    }
 	if (asText != NULL && asText[0] != 0)
 	    {
 	    asObj = asParseText(asText);
 	    }
 	freez(&asText);
 	}
     }
 return asObj;
 }
 
 struct asObject *asForTable(struct sqlConnection *conn, char *table)
 /* Get autoSQL description if any associated with table. */
 /* Wrap some error catching around asForTable. */
 {
 struct errCatch *errCatch = errCatchNew();
 struct asObject *asObj = NULL;
 if (errCatchStart(errCatch))
     {
     asObj = asForTableOrDie(conn, table);
     }
 errCatchEnd(errCatch);
 errCatchFree(&errCatch);
 return asObj;
 }
 
 struct asColumn *asColumnFind(struct asObject *asObj, char *name)
 /* Return named column. */
 {
 struct asColumn *asCol = NULL;
 if (asObj!= NULL)
     {
     for (asCol = asObj->columnList; asCol != NULL; asCol = asCol->next)
         if (sameString(asCol->name, name))
 	     break;
     }
 return asCol;
 }
 
+struct slName *asColNames(struct asObject *as)
+/* Get list of column names. */
+{
+struct slName *list = NULL, *el;
+struct asColumn *col;
+for (col = as->columnList; col != NULL; col = col->next)
+    {
+    el = slNameNew(col->name);
+    slAddHead(&list, el);
+    }
+slReverse(&list);
+return list;
+}
+
+struct sqlFieldType *sqlFieldTypesFromAs(struct asObject *as)
+/* Convert asObject to list of sqlFieldTypes */
+{
+struct sqlFieldType *ft, *list = NULL;
+struct asColumn *col;
+for (col = as->columnList; col != NULL; col = col->next)
+    {
+    struct dyString *type = asColumnToSqlType(col);
+    ft = sqlFieldTypeNew(col->name, type->string);
+    slAddHead(&list, ft);
+    dyStringFree(&type);
+    }
+slReverse(&list);
+return list;
+}
+