4f46a97599aeb8374d4ff2b41a41edae1ce76ca5 tdreszer Mon Jul 25 15:28:04 2011 -0700 Replaced tdfbExtras hash with struct for efficiency. Redmine 4674. diff --git src/hg/inc/trackDb.h src/hg/inc/trackDb.h index 8d4b9c6..e4825f1 100644 --- src/hg/inc/trackDb.h +++ src/hg/inc/trackDb.h @@ -5,30 +5,33 @@ #ifndef TRACKDB_H #define TRACKDB_H #include "common.h" #ifndef JKSQL_H #include "jksql.h" #endif #ifndef LINEFILE_H #include "linefile.h" #endif #define TRACKDB_NUM_COLS 21 +// Forward definitions +struct tdbExtras; + struct trackDb /* This describes an annotation track. */ { struct trackDb *next; /* Next in singly linked list. Next sibling in tree. */ char *track; /* Symbolic ID of Track - used in cart. Is tableName in database historically. */ char *table; /* Symbolic ID of Table - used in database. Same as track usually. */ char *shortLabel; /* Short label displayed on left */ char *type; /* Track type: bed, psl, genePred, etc. */ char *longLabel; /* Long label displayed in middle */ unsigned char visibility; /* 0=hide, 1=dense, 2=full, 3=pack, 4=squish */ float priority; /* 0-100 - where to position. 0 is top */ unsigned char colorR; /* Color red component 0-255 */ unsigned char colorG; /* Color green component 0-255 */ unsigned char colorB; /* Color blue component 0-255 */ unsigned char altColorR; /* Light color red component 0-255 */ @@ -48,31 +51,31 @@ unsigned char canPack; /* 1 if can pack track display, 0 otherwise */ char *settings; /* Name/value pairs for track-specific stuff */ struct hash *settingsHash; /* Hash for settings. Not saved in database. * Don't use directly, rely on trackDbSetting to access. */ /* additional info, determined from settings */ char treeNodeType; /* bit map containing defining supertrack, composite and children of same (may be parent & child) */ struct trackDb *parent; /* parent of composite or superTracks */ struct trackDb *subtracks; /* children of composite not supertracks */ // NOTE: can only be on one sl at a time! struct slRef *children; /* children of folders (superTracks) only. Needed as slRef since these children are on the main trackList and can't be in 2 sl's at once */ char *parentName; /* set if this is a supertrack member */ boolean isShow; /* for supertracks tracks: true if this is a supertrack with pseudo-vis 'show' */ struct hash *overrides; /* If not NULL, this is an override * entry. It contains the names, but not the * values of the fields and settings that were * specified in the entry. */ - struct hash *extras; /* This hash allows storing extra values which may be used multiple times within a single cgi + struct tdbExtras *tdbExtras;/* This struct allows storing extra values which may be used multiple times within a single cgi And example is the metadata looked looked up once in the metaTbl and used again and again. */ }; #define FOLDER_MASK 0x10 #define COMPOSITE_MASK 0x20 #define MULTI_TRACK_MASK 0x80 #define FOLDER_CHILD_MASK 0x01 #define COMPOSITE_CHILD_MASK 0x02 #define COMPOSITE_VIEW_MASK 0x04 #define MULTI_TRACK_CHILD_MASK 0x08 #define PARENT_MASK 0xF0 #define CHILD_MASK 0x0F #define TREETYPE_MASK 0xFF #define PARENT_NODE(nodeType) ((nodeType) & PARENT_MASK) #define CHILD_NODE(nodeType) ((nodeType) & CHILD_MASK) @@ -414,39 +417,30 @@ /* Look for a trackDb setting from lowest level on up through chain of ancestors. */ #endif /* OLD */ char *trackDbSettingClosestToHomeOrDefault(struct trackDb *tdb, char *name, char *defaultVal); /* Look for a trackDb setting (or default) from lowest level on up through chain of ancestors. */ boolean trackDbSettingClosestToHomeOn(struct trackDb *tdb, char *name); /* Return true if a tdb setting closest to home is "on" "true" or "enabled". */ struct trackDb *subTdbFind(struct trackDb *parent,char *table); /* Return subTrack tdb if it exists in parent. */ struct trackDb *tdbFindOrCreate(char *db,struct trackDb *parent,char *table); /* Find or creates the tdb for this table. May return NULL. */ -void tdbExtrasAddOrUpdate(struct trackDb *tdb,char *name,void *value); -/* Adds some "extra" information to the extras hash. Creates hash if necessary. */ - -void tdbExtrasRemove(struct trackDb *tdb,char *name); -/* Removes a value from the extras hash. */ - -void *tdbExtrasGetOrDefault(struct trackDb *tdb,char *name,void *defaultVal); -/* Returns a value if it is found in the extras hash. */ - boolean tdbIsView(struct trackDb *tdb,char **viewName); // Is this tdb a view? Will fill viewName if provided char *tdbGetViewName(struct trackDb *tdb); // returns NULL the view name for view or child track (do not free) void parseColor(char *text, unsigned char *r, unsigned char *g, unsigned char *b); /* Turn comma-separated string of three numbers into three * color components. */ int parentTdbAbandonTablelessChildren(char *db, struct trackDb *parentTdb); /* abandons tableless children from a container tdb, such as a composite returns count of children that have been abandoned */ struct trackDb *trackDbLinkUpGenerations(struct trackDb *tdbList); @@ -497,17 +491,110 @@ * just return self. */ boolean trackDbUpdateOldTag(char **pTag, char **pVal); /* Look for obscolete tags and update them to new format. Return TRUE if any update * is done. Will allocate fresh memory for new tag and val if updated. */ boolean trackDbCheckValidRelease(char *tag); /* check to make sure release tag is valid */ struct slName *trackDbLocalSettingsWildMatch(struct trackDb *tdb, char *expression); // Return local settings that match expression else NULL. In alpha order. struct slName *trackDbSettingsWildMatch(struct trackDb *tdb, char *expression); // Return settings in tdb tree that match expression else NULL. In alpha order, no duplicates. +// Forward defs for tdbExtras +struct mdbObj; +struct _membersForAll; +struct _membership; + +struct tdbExtras +// Struct for misc. data collected/calculated during CGI track setup that are cached for later use. +// These extras are primarily used in hgTracks & hgTrackUi but can be used and expanded as needed. +// CGI developers are encouraged to add to this structure for their own needs. + { + int fourState; // hgTrackUi subtracks use 4 state checkboxes (checked/un by enabled/dis) + boolean reshapedComposite; // hgTracks should not "reshape" composites more than once. + struct mdbObj *mdb; // several CGIs need repeated access to a tracks metadata + struct _membersForAll *membersForAll; // hgTrackUi composites collect all view/dimension info + struct _membership *membership; // hgTrackUi subtracks have individual membership info + + // Developer: please add your useful data that is costly to calculate/retrieve more than once + }; + +#define TDB_EXTRAS_EMPTY_STATE 666 +INLINE struct tdbExtras *tdbExtrasGet(struct trackDb *tdb) +// Returns tdbExtras struct, initializing if needed. +{ +if(tdb->tdbExtras == NULL) + { + tdb->tdbExtras = AllocVar(tdb->tdbExtras); + // Initialize any values that need an "empty" state + tdb->tdbExtras->fourState = TDB_EXTRAS_EMPTY_STATE; // I guess it is 5 state! + // pointers are NULL and booleans are FALSE by default + } +return tdb->tdbExtras; +} + +INLINE int tdbExtrasFourState(struct trackDb *tdb) +// Returns subtrack four state if known, else TDB_EXTRAS_EMPTY_STATE +{ +return tdbExtrasGet(tdb)->fourState; +} + +INLINE void tdbExtrasFourStateSet(struct trackDb *tdb,int fourState) +// Sets subtrack four state +{ +tdbExtrasGet(tdb)->fourState = fourState; +} + +INLINE boolean tdbExtrasReshapedComposite(struct trackDb *tdb) +// Returns TRUE if composite has been declared as reshaped, else FALSE. +{ +return tdbExtrasGet(tdb)->reshapedComposite; +} + +INLINE void tdbExtrasReshapedCompositeSet(struct trackDb *tdb) +// Declares that the composite has been reshaped. +{ +tdbExtrasGet(tdb)->reshapedComposite = TRUE; +} + +INLINE struct mdbObj *tdbExtrasMdb(struct trackDb *tdb) +// Returns mdb metadata if already known, else NULL +{ +return tdbExtrasGet(tdb)->mdb; +} + +INLINE void tdbExtrasMdbSet(struct trackDb *tdb,struct mdbObj *mdb) +// Sets the mdb metadata structure for later retrieval. +{ +tdbExtrasGet(tdb)->mdb = mdb; +} + +INLINE struct _membersForAll *tdbExtrasMembersForAll(struct trackDb *tdb) +// Returns composite view/dimension members for all, else NULL. +{ +return tdbExtrasGet(tdb)->membersForAll; +} + +INLINE void tdbExtrasMembersForAllSet(struct trackDb *tdb, struct _membersForAll *membersForAll) +// Sets the composite view/dimensions members for all for later retrieval. +{ +tdbExtrasGet(tdb)->membersForAll = membersForAll; +} + +INLINE struct _membership *tdbExtrasMembership(struct trackDb *tdb) +// Returns subtrack membership if already known, else NULL +{ +return tdbExtrasGet(tdb)->membership; +} + +INLINE void tdbExtrasMembershipSet(struct trackDb *tdb,struct _membership *membership) +// Sets the subtrack membership for later retrieval. +{ +tdbExtrasGet(tdb)->membership = membership; +} + #endif /* TRACKDB_H */