37a331259beee4fa8ebe7aa7f4d5b9d765a14c7f
kent
  Thu Jan 6 15:45:34 2011 -0800
Starting to make hgHubConnect talk with hgTracks and hgTrackUi.  Right now the tracks appear on the track list, but are not displaying properly.
diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c
index 5faa293..88275d5 100644
--- src/hg/lib/hubConnect.c
+++ src/hg/lib/hubConnect.c
@@ -1,25 +1,150 @@
 /* hubConnect - stuff to manage connections to track hubs.  Most of this is mediated through
  * the hubConnect table in the hgCentral database.  Here there are routines to translate between
  * hub symbolic names and hub URLs,  to see if a hub is up or down or sideways (up but badly
  * formatted) etc.  Note that there is no C structure corresponding to a row in the hubConnect 
  * table by design.  We just want field-by-field access to this. */
 
 #include "common.h"
 #include "linefile.h"
 #include "hash.h"
+#include "dystring.h"
+#include "sqlNum.h"
 #include "jksql.h"
 #include "hdb.h"
 #include "trackHub.h"
 #include "hubConnect.h"
 
 
+boolean isHubTrack(char *trackName)
+/* Return TRUE if it's a hub track. */
+{
+return startsWith(hubTrackPrefix, trackName);
+}
 
 boolean hubConnectTableExists()
 /* Return TRUE if the hubConnect table exists. */
 {
 struct sqlConnection *conn = hConnectCentral();
 boolean exists = sqlTableExists(conn, hubConnectTableName);
 hDisconnectCentral(&conn);
 return exists;
 }
 
+void hubConnectStatusFree(struct hubConnectStatus **pHub)
+/* Free hubConnectStatus */
+{
+struct hubConnectStatus *hub = *pHub;
+if (hub != NULL)
+    {
+    freeMem(hub->shortLabel);
+    freeMem(hub->longLabel);
+    freeMem(hub->hubUrl);
+    freeMem(hub->errorMessage);
+    if (hub->dbArray)
+        {
+	freeMem(hub->dbArray[0]);
+	freeMem(hub->dbArray);
+	}
+    freez(pHub);
+    }
+}
+
+void hubConnectStatusFreeList(struct hubConnectStatus **pList)
+/* Free a list of dynamically allocated hubConnectStatus's */
+{
+struct hubConnectStatus *el, *next;
+
+for (el = *pList; el != NULL; el = next)
+    {
+    next = el->next;
+    hubConnectStatusFree(&el);
+    }
+*pList = NULL;
+}
+
+static void hubConnectRemakeTrackHubVar(struct cart *cart)
+/* Remake trackHub cart variable if need be from various check box vars. */
+{
+if (cartVarExists(cart, hgHubConnectRemakeTrackHub))
+    {
+    struct slPair *hubVarList = cartVarsWithPrefix(cart, hgHubConnectHubVarPrefix);
+    int prefixLength = strlen(hgHubConnectHubVarPrefix);
+    struct dyString *trackHubs = dyStringNew(0);
+    struct slPair *hubVar;
+    for (hubVar = hubVarList; hubVar != NULL; hubVar = hubVar->next)
+        {
+	if (hubVar != hubVarList)
+	    dyStringAppendC(trackHubs, ' ');
+	dyStringAppend(trackHubs, hubVar->name + prefixLength);
+	}
+    slPairFreeList(&hubVarList);
+    cartSetString(cart, hubConnectTrackHubsVarName, trackHubs->string);
+    uglyf("<BR>Got %s, made %s<BR>", hgHubConnectRemakeTrackHub, trackHubs->string);
+    dyStringFree(&trackHubs);
+    cartRemove(cart, hgHubConnectRemakeTrackHub);
+    }
+}
+
+struct slName *hubConnectHubsInCart(struct cart *cart)
+/* Return list of track hub ids that are turned on. */
+{
+hubConnectRemakeTrackHubVar(cart);
+char *trackHubString = cartOptionalString(cart, hubConnectTrackHubsVarName);
+return slNameListFromString(trackHubString, ' ');
+}
+
+struct hubConnectStatus *hubConnectStatusForId(struct sqlConnection *conn, int id)
+/* Given a hub ID return associated status. Returns NULL if no such hub.  If hub
+ * exists but has problems will return with errorMessage field filled in. */
+{
+struct hubConnectStatus *hub = NULL;
+char query[1024];
+safef(query, sizeof(query), 
+    "select id,shortLabel,longLabel,hubUrl,errorMessage,dbCount,dbList from %s where id=%d",
+    hubConnectTableName, id);
+struct sqlResult *sr = sqlGetResult(conn, query);
+char **row = sqlNextRow(sr);
+if (row != NULL)
+    {
+    AllocVar(hub);
+    hub->id = sqlUnsigned(row[0]);
+    hub->shortLabel = cloneString(row[1]);
+    hub->longLabel = cloneString(row[2]);
+    hub->hubUrl = cloneString(row[3]);
+    hub->errorMessage = cloneString(row[4]);
+    hub->dbCount = sqlUnsigned(row[5]);
+    int sizeOne;
+    sqlStringDynamicArray(row[6], &hub->dbArray, &sizeOne);
+    assert(sizeOne == hub->dbCount);
+    }
+sqlFreeResult(&sr);
+return hub;
+}
+
+struct hubConnectStatus *hubConnectStatusFromCart(struct cart *cart)
+/* Return list of track hubs that are turned on by user in cart. */
+{
+struct hubConnectStatus *hubList = NULL, *hub;
+struct slName *name, *nameList = hubConnectHubsInCart(cart);
+struct sqlConnection *conn = hConnectCentral();
+for (name = nameList; name != NULL; name = name->next)
+    {
+    int id = sqlUnsigned(name->name);
+    hub = hubConnectStatusForId(conn, id);
+    if (hub != NULL)
+        slAddHead(&hubList, hub);
+    }
+slFreeList(&nameList);
+hDisconnectCentral(&conn);
+slReverse(&hubList);
+return hubList;
+}
+
+int hubIdFromTrackName(char *trackName)
+/* Given something like "hub_123_myWig" return 123 */
+{
+assert(startsWith("hub_", trackName));
+trackName += 4;
+assert(isdigit(trackName[0]));
+return atoi(trackName);
+}