467c156e4959074434f3889c77cb698a155fa21a angie Fri Jan 21 10:47:53 2011 -0800 Fixing gross abuse of hTrackDb (via hTrackDbForTrack) found by Larryand Hiram during work on Bug #1114: snp125OfferGeneTracksForFunction was modifying the returned results, which broke when caching was introduced to hTrackDb. Since hgTrackUi already has trackHash, just look up tdbs there and do a shallow copy so that altering the next pointer with slAddHead and slSort doesn't destroy the cached version. diff --git src/hg/hgTrackUi/hgTrackUi.c src/hg/hgTrackUi/hgTrackUi.c index 12cb49a..d6d9865 100644 --- src/hg/hgTrackUi/hgTrackUi.c +++ src/hg/hgTrackUi/hgTrackUi.c @@ -134,41 +134,46 @@ cartUsualString(cart, snpMapSourceStrings[snpMapSource], snpMapSourceDefault[snpMapSource]); snpFilterButtons(snpMapSourceStrings[snpMapSource], snpMapSourceCart[snpMapSource]); printf(" - %s
\n", snpMapSourceLabels[snpMapSource]); } printf("
Variant Types:
\n"); for (snpMapType=0; snpMapType%s
\n", snpMapTypeLabels[snpMapType]); } } void snp125OfferGeneTracksForFunction(struct trackDb *tdb) +/* Get a list of genePred tracks and make checkboxes to enable hgc's functional + * annotations. */ { struct sqlConnection *conn = hAllocConn(database); struct slName *genePredTables = hTrackTablesOfType(conn, "genePred%%"), *gt; if (genePredTables != NULL) { struct trackDb *geneTdbList = NULL, *gTdb; for (gt = genePredTables; gt != NULL; gt = gt->next) { - gTdb = hTrackDbForTrack(database, gt->name); + gTdb = hashFindVal(trackHash, gt->name); if (gTdb && sameString(gTdb->grp, "genes")) { + // We are going to overwrite gTdb's next pointer and possibly its priority, + // so make a shallow copy: + gTdb = CloneVar(gTdb); if (gTdb->parent) gTdb->priority = (gTdb->parent->priority + gTdb->priority/1000); slAddHead(&geneTdbList, gTdb); } } slSort(&geneTdbList, trackDbCmp); jsBeginCollapsibleSection(cart, tdb->track, "geneTracks", "Use Gene Tracks for Functional Annotation", FALSE); printf("
On details page, show function and coding differences relative to: "); char cartVar[256]; safef(cartVar, sizeof(cartVar), "%s_geneTrack", tdb->track); jsMakeCheckboxGroupSetClearButton(cartVar, TRUE); jsMakeCheckboxGroupSetClearButton(cartVar, FALSE); struct slName *selectedGeneTracks = cartOptionalSlNameList(cart, cartVar); if (!cartListVarExists(cart, cartVar))