5c9ad606d5b486c3e1360250907cae2c13869d90
braney
  Sun Mar 29 12:52:58 2026 -0700
Factor out common quickLift SQL load pattern into shared functions

Add quickLiftResolveTable() and quickLiftSqlLoadBeds() to eliminate
duplicated custom-track resolution and SQL-based quickLift loading
code across bedTrack.c, simpleTracks.c, gvfTrack.c, and hgc.c.

No redmine

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

diff --git src/hg/hgTracks/bedTrack.c src/hg/hgTracks/bedTrack.c
index 8a443b7f6ec..465d76fdfe6 100644
--- src/hg/hgTracks/bedTrack.c
+++ src/hg/hgTracks/bedTrack.c
@@ -134,45 +134,32 @@
     if (filtered)
        labelTrackAsFilteredNumber(tg, filtered);
 
     lmCleanup(&lm);
     }
 else
     {
     char *table = tg->table;
     struct customTrack *ct = tg->customPt;
     struct sqlConnection *conn = NULL;
     char *liftDb = cloneString(trackDbSetting(tg->tdb, "quickLiftDb"));
     char *scoreFilterClause = getScoreFilterClause(cart, tg->tdb,NULL);
 
     if (liftDb != NULL)
         {
-        char *table;
-        if (isCustomTrack(tg->table))
-            {
-            liftDb = CUSTOM_TRASH;
-            table = trackDbSetting(tg->tdb, "dbTableName");
-            }
-        else
-            table = tg->table;
-        struct hash *chainHash = newHash(8);
-        struct sqlConnection *conn = hAllocConn(liftDb);
-        char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl"));
-        bed = (struct bed *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd,  NULL, scoreFilterClause, (ItemLoader2)loader, 0, chainHash);
-
-        list = quickLiftBeds(bed, chainHash, FALSE);
-        hFreeConn(&conn);
+        list = quickLiftSqlLoadBeds(tg->tdb, tg->table, liftDb, chromName, winStart, winEnd,
+            scoreFilterClause, (ItemLoader2)loader, 0, FALSE);
         }
     else
         {
         if (ct == NULL)
             conn = hAllocConnTrack(database, tg->tdb);
         else
             {
             conn = hAllocConn(CUSTOM_TRASH);
             table = ct->dbTableName;
             }
         struct sqlResult *sr = NULL;
         /* limit to items above a specified score */
         if (doScoreCtFilter && (topTable != NULL) && hTableExists(database, topTable))
             {
             sqlSafef(query, sizeof(query),"select * from %s order by score desc limit %d",
@@ -314,55 +301,42 @@
             sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd,
                              NULL, &rowOffset);
             }
 
         while ((row = sqlNextRow(sr)) != NULL)
             {
             bed = bedLoadN(row+rowOffset, 9);
             lf = bedMungToLinkedFeatures(&bed, tdb, 9, scoreMin, scoreMax, useItemRgb);
             slAddHead(&lfList, lf);
             }
         sqlFreeResult(&sr);
         hFreeConn(&conn);
         }
     else
         {
-        char *table;
-        if (isCustomTrack(tg->table))
-            {
-            liftDb = CUSTOM_TRASH;
-            table = trackDbSetting(tg->tdb, "dbTableName");
-            }
-        else
-            table = tg->table;
-        struct hash *chainHash = newHash(8);
-        struct sqlConnection *conn = hAllocConn(liftDb);
-        char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl"));
-        bed = (struct bed *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd,  NULL, scoreFilterClause, (ItemLoader2)bedLoadN, 9, chainHash);
-
-        struct bed *liftedBeds = quickLiftBeds(bed, chainHash, FALSE);
+        struct bed *liftedBeds = quickLiftSqlLoadBeds(tg->tdb, tg->table, liftDb, chromName,
+            winStart, winEnd, scoreFilterClause, (ItemLoader2)bedLoadN, 9, FALSE);
         for(bed = liftedBeds; bed; bed = bed->next)
             {
             lf = lfFromBedExtra(bed, scoreMin, scoreMax);
             if (useItemRgb)
                 {
                 lf->useItemRgb = TRUE;
                 lf->filterColor=bed->itemRgb;
                 }
             slAddHead(&lfList, lf);
             }
-        hFreeConn(&conn);
         }
     }
 slReverse(&lfList);
 slSort(&lfList, linkedFeaturesCmp);
 tg->items = lfList;
 }
 
 
 void loadBed8(struct track *tg)
 /* Convert bed 8 info in window to linked feature. */
 {
 struct bed *bed;
 struct linkedFeatures *lfList = NULL, *lf;
 struct trackDb *tdb = tg->tdb;
 int scoreMin = atoi(trackDbSettingClosestToHomeOrDefault(tdb, "scoreMin", "0"));
@@ -399,55 +373,42 @@
             sr = hRangeQuery(conn, tg->table, chromName, winStart, winEnd,
                              NULL, &rowOffset);
             }
 
         while ((row = sqlNextRow(sr)) != NULL)
             {
             bed = bedLoadN(row+rowOffset, 8);
             lf = bedMungToLinkedFeatures(&bed, tdb, 8, scoreMin, scoreMax, useItemRgb);
             slAddHead(&lfList, lf);
             }
         sqlFreeResult(&sr);
         hFreeConn(&conn);
         }
     else
         {
-        char *table;
-        if (isCustomTrack(tg->table))
-            {
-            liftDb = CUSTOM_TRASH;
-            table = trackDbSetting(tg->tdb, "dbTableName");
-            }
-        else
-            table = tg->table;
-        struct hash *chainHash = newHash(8);
-        struct sqlConnection *conn = hAllocConn(liftDb);
-        char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl"));
-        bed = (struct bed *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd,  NULL, scoreFilterClause, (ItemLoader2)bedLoadN, 8, chainHash);
-
-        struct bed *liftedBeds = quickLiftBeds(bed, chainHash, TRUE);
+        struct bed *liftedBeds = quickLiftSqlLoadBeds(tg->tdb, tg->table, liftDb, chromName,
+            winStart, winEnd, scoreFilterClause, (ItemLoader2)bedLoadN, 8, TRUE);
         for(bed = liftedBeds; bed; bed = bed->next)
             {
             lf = lfFromBedExtra(bed, scoreMin, scoreMax);
             if (useItemRgb)
                 {
                 lf->useItemRgb = TRUE;
                 lf->filterColor=bed->itemRgb;
                 }
             slAddHead(&lfList, lf);
             }
-        hFreeConn(&conn);
         }
     }
 slReverse(&lfList);
 slSort(&lfList, linkedFeaturesCmp);
 tg->items = lfList;
 }
 
 static void filterBed(struct track *tg, struct linkedFeatures **pLfList)
 /* Apply filters if any to mRNA linked features. */
 {
 struct linkedFeatures *lf, *next, *newList = NULL, *oldList = NULL;
 struct mrnaUiData *mud = tg->extraUiData;
 struct mrnaFilter *fil;
 char *type;
 boolean anyFilter = FALSE;
@@ -636,55 +597,42 @@
             adjustBedScoreGrayLevel(tdb, bed, scoreMin, scoreMax);
             lf = lfFromBedExtra(bed, scoreMin, scoreMax);
             if (useItemRgb)
                 {
                 lf->useItemRgb = TRUE;
                 lf->filterColor=bed->itemRgb;
                 }
             slAddHead(&lfList, lf);
             bedFree(&bed);
             }
         sqlFreeResult(&sr);
         hFreeConn(&conn);
         }
     else
         {
-        char *table;
-        if (isCustomTrack(tg->table))
-            {
-            liftDb = CUSTOM_TRASH;
-            table = trackDbSetting(tg->tdb, "dbTableName");
-            }
-        else
-            table = tg->table;
-        struct hash *chainHash = newHash(8);
-        struct sqlConnection *conn = hAllocConn(liftDb);
-        char *quickLiftFile = cloneString(trackDbSetting(tg->tdb, "quickLiftUrl"));
-        bed = (struct bed *)quickLiftSql(conn, quickLiftFile, table, chromName, winStart, winEnd,  NULL, scoreFilterClause, (ItemLoader2)bedLoad12, 0, chainHash);
-
-        struct bed *liftedBeds = quickLiftBeds(bed, chainHash, TRUE);
+        struct bed *liftedBeds = quickLiftSqlLoadBeds(tg->tdb, tg->table, liftDb, chromName,
+            winStart, winEnd, scoreFilterClause, (ItemLoader2)bedLoad12, 0, TRUE);
         for(bed = liftedBeds; bed; bed = bed->next)
             {
             lf = lfFromBedExtra(bed, scoreMin, scoreMax);
             if (useItemRgb)
                 {
                 lf->useItemRgb = TRUE;
                 lf->filterColor=bed->itemRgb;
                 }
             slAddHead(&lfList, lf);
             }
-        hFreeConn(&conn);
         }
     }
 
 slReverse(&lfList);
 if(tg->extraUiData)
     filterBed(tg, &lfList);
 slSort(&lfList, linkedFeaturesCmp);
 tg->items = lfList;
 filterItemsOnNames(tg);
 maybeLoadSnake(tg);   // if we're in snake mode, change the methods
 }
 
 Color colorFromCart(struct track *tg, Color color)
 /* Return the RGB color from the cart setting 'colorOverride' or just return color */
 {