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("
Got %s, made %s
", 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);
+}