6411d5f0ae8b75f54dc71f28a6c0690a9d567895 braney Mon May 16 11:29:37 2011 -0700 make private (now unlisted) hubs use the same status table as the public hubs, no trash use diff --git src/hg/lib/hubConnect.c src/hg/lib/hubConnect.c index 3df3634..7138135 100644 --- src/hg/lib/hubConnect.c +++ src/hg/lib/hubConnect.c @@ -15,31 +15,31 @@ #include "trackHub.h" #include "hubConnect.h" #include "hui.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); +boolean exists = sqlTableExists(conn, hubPublicTableName); 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) @@ -91,151 +91,70 @@ 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, ' '); } static struct hubConnectStatus *hubConnectStatusForIdDb(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. */ - /* If the id is negative, then the hub is private and the number is the - * offset into the private hubfile in the trash */ { 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); + "select id,shortLabel,longLabel,hubUrl,errorMessage,dbCount,dbList,status from %s where id=%d", + hubStatusTableName, 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); + hub->status = sqlUnsigned(row[7]); } sqlFreeResult(&sr); return hub; } -boolean hubWriteToFile(FILE *f, struct hubConnectStatus *el) -/* write out a hubConnectStatus structure to a file */ -{ -char sep = '\t'; -char lastSep = '\n'; - -fprintf(f, "%d", el->id); -fputc(sep,f); -fprintf(f, "%s", el->shortLabel); -fputc(sep,f); -fprintf(f, "%s", el->longLabel); -fputc(sep,f); -fprintf(f, "%s", el->hubUrl); -fputc(sep,f); -fprintf(f, "%s", el->errorMessage); -fputc(sep,f); -fprintf(f, "%u", el->dbCount); -fputc(sep,f); -int ii; -for(ii=0; ii < el->dbCount; ii++) +boolean isHubUnlisted(struct hubConnectStatus *hub) +/* Return TRUE if it's an unlisted hub */ { - fprintf(f, "%s", el->dbArray[ii]); - if (ii != el->dbCount - 1) - fprintf(f, ","); - } -fputc(lastSep,f); - -return TRUE; -} - - -static struct hubConnectStatus *readHubFromFile(struct lineFile *lf) -{ -struct hubConnectStatus *hub = NULL; -char *row[5]; -int count; -if ((count = lineFileChopTab(lf, row)) != ArraySize(row)) - errAbort("expect %d fields on line %d in %s, got %d\n",(int)ArraySize(row),lf->lineIx, lf->fileName, count); - -AllocVar(hub); -hub->id = sqlSigned(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[4]); -//int sizeOne; -//sqlStringDynamicArray(row[5], &hub->dbArray, &sizeOne); -//assert(sizeOne == hub->dbCount); - -return hub; -} - -#define HUBFILE_CART_NAME "hghub_file" - -char *hubFileVar() -/* return the name of the cart variable that holds the name of the - * file in trash that has private hubs */ -{ -return HUBFILE_CART_NAME; -} - -struct hubConnectStatus *hubConnectStatusForIdFile(struct cart *cart, int id) - /* id is offset into the private hubfile in the trash */ -{ -struct hubConnectStatus *hub = NULL; -char *fileVar = hubFileVar(); -char *hubFileName = cartOptionalString(cart, fileVar); -struct lineFile *lf = lineFileOpen(hubFileName, TRUE); -int lineSize; -char *line; -int count = id; - -while(--count) - if (lineFileNext(lf, &line, &lineSize) == FALSE) - errAbort("not enough lines in %s to find line number %d\n", - lf->fileName, id); - -hub = readHubFromFile(lf); - -return hub; + return (hub->status & HUB_UNLISTED); } struct hubConnectStatus *hubConnectStatusForId(struct cart *cart, 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. */ /* If the id is negative, then the hub is private and the number is the * offset into the private hubfile in the trash */ { struct hubConnectStatus *hub = NULL; -if (id < 0) - hub = hubConnectStatusForIdFile(cart, -id); -else hub = hubConnectStatusForIdDb(conn, id); return hub; } struct hubConnectStatus *hubConnectStatusListFromCart(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 = sqlSigned(name->name); @@ -244,57 +163,57 @@ { 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; -return atoi(trackName); +return sqlUnsigned(trackName); } char *hubConnectSkipHubPrefix(char *trackName) /* Given something like "hub_123_myWig" return myWig. Don't free this, it's not allocated */ { assert(startsWith("hub_", trackName)); trackName += 4; trackName = strchr(trackName, '_'); assert(trackName != NULL); return trackName + 1; } -struct trackHub *trackHubFromId(struct cart *cart, int hubId) +struct trackHub *trackHubFromId(struct cart *cart, unsigned hubId) /* Given a hub ID number, return corresponding trackHub structure. * ErrAbort if there's a problem. */ { struct sqlConnection *conn = hConnectCentral(); struct hubConnectStatus *status = hubConnectStatusForId(cart, conn, hubId); hDisconnectCentral(&conn); if (status == NULL) errAbort("The hubId %d was not found", hubId); if (!isEmpty(status->errorMessage)) errAbort("Hub %s at %s has the error: %s", status->shortLabel, status->hubUrl, status->errorMessage); char hubName[16]; -safef(hubName, sizeof(hubName), "hub_%d", hubId); +safef(hubName, sizeof(hubName), "hub_%u", hubId); struct trackHub *hub = trackHubOpen(status->hubUrl, hubName); hubConnectStatusFree(&status); return hub; } static struct trackDb *findSuperTrack(struct trackDb *tdbList, char *trackName) /* discover any supertracks, and if there are some add them * to the subtrack list of the supertrack */ { struct trackDb *tdb; struct trackDb *p = NULL; struct trackDb *next; for(tdb = tdbList; tdb; tdb = next) {