7d885ab4170329d915b6301c048d0f5eb13d2379
tdreszer
  Mon Aug 1 13:05:27 2011 -0700
Backtracking on tdbExtras.  I don't think it should be defined for every tdb, but only defined when needed.  I do think there should be getters and setters, because of create on use and because encapsulating object knowledge/assumptions makes sense long term.
diff --git src/hg/lib/trackDbCustom.c src/hg/lib/trackDbCustom.c
index 5a99219..f93a216 100644
--- src/hg/lib/trackDbCustom.c
+++ src/hg/lib/trackDbCustom.c
@@ -155,32 +155,30 @@
 if (type != NULL)
      bt->type = cloneString(type);
 if (trackDbSetting(bt, "spectrum") != NULL || trackDbSetting(bt, "useScore") != NULL)
     bt->useScore = TRUE;
 char *canPack = trackDbSetting(bt, "canPack");
 if (canPack != NULL)
     bt->canPack = !(sameString(canPack, "0") || sameString(canPack, "off"));
 char *chromosomes = trackDbSetting(bt, "chromosomes");
 if (chromosomes != NULL)
     sqlStringDynamicArray(chromosomes, &bt->restrictList, &bt->restrictCount);
 if (trackDbSetting(bt, "private") != NULL)
     bt->private = TRUE;
 char *grp = trackDbSetting(bt, "group");
 if (grp != NULL)
      bt->grp = cloneString(grp);
-if (bt->tdbExtras == NULL)
-    bt->tdbExtras = tdbExtrasNew();
 }
 
 static void replaceStr(char **varPtr, char *val)
 /** replace string in varPtr with val */
 {
 freeMem(*varPtr);
 *varPtr = cloneString(val);
 }
 
 static void overrideField(struct trackDb *td, struct trackDb *overTd,
                           char *var)
 /* Update override one field from override. */
 {
 if (sameString(var, "track") || sameString(var, "release"))
     return;
@@ -1156,34 +1154,117 @@
     else
         {
 	tag = "parent";
 	}
     updated = TRUE;
     }
 #endif /* SOON */
 if (updated)
     {
     *pTag = cloneString(tag);
     *pVal = cloneString(val);
     }
 return updated;
 }
 
-struct tdbExtras *tdbExtrasNew()
+static struct tdbExtras *tdbExtrasNew()
 // Return a new empty tdbExtras
 {
 struct tdbExtras *extras;
 AllocVar(extras); // Note no need for extras = AllocVar(extras)
 // Initialize any values that need an "empty" state
 extras->fourState = TDB_EXTRAS_EMPTY_STATE; // I guess it is 5 state!
 // pointers are NULL and booleans are FALSE by default
 return extras;
 }
 
 void tdbExtrasFree(struct tdbExtras **pTdbExtras)
 // Frees the tdbExtras structure
 {
 // Developer, add intelligent routines to free structures
 // NOTE: For now just leak contents, because complex structs would also leak
 freez(pTdbExtras);
 }
 
+static struct tdbExtras *tdbExtrasGet(struct trackDb *tdb)
+// Returns tdbExtras struct, initializing if needed.
+{
+if (tdb->tdbExtras == NULL)   // Temporarily add this back in because Angie see asserts popping.
+    tdb->tdbExtras = tdbExtrasNew();
+return tdb->tdbExtras;
+}
+
+int tdbExtrasFourState(struct trackDb *tdb)
+// Returns subtrack four state if known, else TDB_EXTRAS_EMPTY_STATE
+{
+struct tdbExtras *extras = tdb->tdbExtras;
+if (extras)
+    return extras->fourState;
+return TDB_EXTRAS_EMPTY_STATE;
+}
+
+void tdbExtrasFourStateSet(struct trackDb *tdb,int fourState)
+// Sets subtrack four state
+{
+tdbExtrasGet(tdb)->fourState = fourState;
+}
+
+boolean tdbExtrasReshapedComposite(struct trackDb *tdb)
+// Returns TRUE if composite has been declared as reshaped, else FALSE.
+{
+struct tdbExtras *extras = tdb->tdbExtras;
+if (extras)
+    return extras->reshapedComposite;
+return FALSE;
+}
+
+void tdbExtrasReshapedCompositeSet(struct trackDb *tdb)
+// Declares that the composite has been reshaped.
+{
+tdbExtrasGet(tdb)->reshapedComposite = TRUE;
+}
+
+struct mdbObj *tdbExtrasMdb(struct trackDb *tdb)
+// Returns mdb metadata if already known, else NULL
+{
+struct tdbExtras *extras = tdb->tdbExtras;
+if (extras)
+    return extras->mdb;
+return NULL;
+}
+
+void tdbExtrasMdbSet(struct trackDb *tdb,struct mdbObj *mdb)
+// Sets the mdb metadata structure for later retrieval.
+{
+tdbExtrasGet(tdb)->mdb = mdb;
+}
+
+struct _membersForAll *tdbExtrasMembersForAll(struct trackDb *tdb)
+// Returns composite view/dimension members for all, else NULL.
+{
+struct tdbExtras *extras = tdb->tdbExtras;
+if (extras)
+    return extras->membersForAll;
+return NULL;
+}
+
+void tdbExtrasMembersForAllSet(struct trackDb *tdb, struct _membersForAll *membersForAll)
+// Sets the composite view/dimensions members for all for later retrieval.
+{
+tdbExtrasGet(tdb)->membersForAll = membersForAll;
+}
+
+struct _membership *tdbExtrasMembership(struct trackDb *tdb)
+// Returns subtrack membership if already known, else NULL
+{
+struct tdbExtras *extras = tdb->tdbExtras;
+if (extras)
+    return extras->membership;
+return tdbExtrasGet(tdb)->membership;
+}
+
+void tdbExtrasMembershipSet(struct trackDb *tdb,struct _membership *membership)
+// Sets the subtrack membership for later retrieval.
+{
+tdbExtrasGet(tdb)->membership = membership;
+}
+