f219460db8db952415b5201ba01df99ce4999004 braney Thu Sep 10 13:46:42 2026 -0700 genark: pass the liftOver accession list as an slName list, refs #38328 genarkLiftOverDbs() took a pre-quoted SQL fragment that its callers assembled. It now takes a struct slName list and builds the query itself with sqlDyStringCreate, so no caller writes SQL text. Accessions that do not start with GC are skipped, since nothing else can match the table. hdb.c and hgConvert.c updated for the new signature. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> diff --git src/hg/lib/hdb.c src/hg/lib/hdb.c index f7bff6c42fc..02b1954b3f5 100644 --- src/hg/lib/hdb.c +++ src/hg/lib/hdb.c @@ -5124,126 +5124,126 @@ } struct dbDb *hGetLiftOverFromDatabases() /* Get list of databases for which there is at least one liftOver chain file * from this assembly to another. * Dispose of this with dbDbFreeList. */ { struct dbDb *allDbList = NULL; struct dbDb *liftOverDbList = NULL, *dbDb, *nextDbDb; struct liftOverChain *chainList = NULL, *chain; struct hash *hash = newHash(0), *dbNameHash = newHash(3); /* Get list of all liftOver chains in central database */ chainList = liftOverChainList(); -struct dyString *dy = newDyString(4096); +struct slName *genarkAccs = NULL; /* Create hash of databases having liftOver chains from this database */ for (chain = chainList; chain != NULL; chain = chain->next) { if (!hashFindVal(hash, chain->fromDb)) hashAdd(hash, chain->fromDb, chain->fromDb); if (startsWith("GC", chain->fromDb)) { - dyStringPrintf(dy, "'%s',", chain->fromDb); + slNameAddHead(&genarkAccs, chain->fromDb); } } /* Get list of all databases */ allDbList = hDbDbList(); /* Create a new dbDb list of all entries in the liftOver hash */ for (dbDb = allDbList; dbDb != NULL; dbDb = nextDbDb) { /* current dbDb entries */ nextDbDb = dbDb->next; if (hashFindVal(hash, dbDb->name) && !hashFindVal(dbNameHash, dbDb->name)) { slAddHead(&liftOverDbList, dbDb); hashAdd(dbNameHash, dbDb->name, dbDb->name); } else dbDbFree(&dbDb); } -if (cfgOptionBooleanDefault("genarkLiftOver", FALSE) && (strlen(dy->string) > 0)) +if (cfgOptionBooleanDefault("genarkLiftOver", FALSE) && (genarkAccs != NULL)) { - dy->string[strlen(dy->string) - 1] = 0; - struct dbDb *genarkDbDbs = genarkLiftOverDbs(dy->string); + struct dbDb *genarkDbDbs = genarkLiftOverDbs(genarkAccs); liftOverDbList = slCat(liftOverDbList, genarkDbDbs); } +slNameFreeList(&genarkAccs); hashFree(&hash); hashFree(&dbNameHash); liftOverChainFreeList(&chainList); /* sort by orderKey so that assemblies always appear from most recent */ /* to the oldest assemblies in the dropdown menu for fromDbs */ slSort(&liftOverDbList, hDbDbCmpName); return liftOverDbList; } struct dbDb *hGetLiftOverToDatabases(char *fromDb) /* Get list of databases for which there are liftOver chain files * to convert from the fromDb assembly. * Dispose of this with dbDbFreeList. */ { struct dbDb *allDbList = NULL, *liftOverDbList = NULL, *dbDb, *nextDbDb; struct liftOverChain *chainList = NULL, *chain; struct hash *hash = newHash(0); struct hash *dbNameHash = newHash(3); /* Get list of all liftOver chains in central database */ chainList = liftOverChainListForDbFiltered(fromDb); -struct dyString *dy = newDyString(4096); +struct slName *genarkAccs = NULL; /* Create hash of databases having liftOver chains from the fromDb */ for (chain = chainList; chain != NULL; chain = chain->next) if (sameString(chain->fromDb,fromDb)) { hashAdd(hash, chain->toDb, chain->toDb); if (startsWith("GC", chain->toDb)) { - dyStringPrintf(dy, "'%s',", chain->toDb); + slNameAddHead(&genarkAccs, chain->toDb); } } /* Get list of all current databases */ allDbList = hDbDbListDeadOrAlive(); /* Create a new dbDb list of all entries in the liftOver hash */ for (dbDb = allDbList; dbDb != NULL; dbDb = nextDbDb) { nextDbDb = dbDb->next; if (hashFindVal(hash, dbDb->name) && !hashFindVal(dbNameHash, dbDb->name)) { slAddHead(&liftOverDbList, dbDb); /* to avoid duplicates in the returned list. */ hashAdd(dbNameHash, dbDb->name, dbDb->name); } else dbDbFree(&dbDb); } -if (cfgOptionBooleanDefault("genarkLiftOver", FALSE) && (strlen(dy->string) > 0)) +if (cfgOptionBooleanDefault("genarkLiftOver", FALSE) && (genarkAccs != NULL)) { - dy->string[strlen(dy->string) - 1] = 0; - struct dbDb *genarkDbDbs = genarkLiftOverDbs(dy->string); + struct dbDb *genarkDbDbs = genarkLiftOverDbs(genarkAccs); liftOverDbList = slCat(liftOverDbList, genarkDbDbs); } +slNameFreeList(&genarkAccs); hashFree(&hash); liftOverChainFreeList(&chainList); /* sort by orderKey so that assemblies always appear from most recent */ /* to the oldest assemblies in the dropdown menu for toDbs */ slSort(&liftOverDbList, hDbDbCmpName); return liftOverDbList; } struct dbDb *hGetBlatIndexedDatabases() /* Get list of databases for which there is a BLAT index. * Dispose of this with dbDbFreeList. */ { struct hash *hash=newHash(5);