4f46a97599aeb8374d4ff2b41a41edae1ce76ca5 tdreszer Mon Jul 25 15:28:04 2011 -0700 Replaced tdfbExtras hash with struct for efficiency. Redmine 4674. diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c index 0c59c4d..f335e46 100644 --- src/hg/lib/mdb.c +++ src/hg/lib/mdb.c @@ -3087,96 +3087,96 @@ // The rest of root if(rootVar->var) freeMem(rootVar->var); freeMem(rootVar); } freez(mdbByVarsPtr); } } // ----------------- CGI specific routines for use with tdb ----------------- #define MDB_NOT_FOUND ((struct mdbObj *)-666) #define METADATA_NOT_FOUND ((struct mdbObj *)-999) -#define MDB_OBJ_KEY "mdbObj" + static struct mdbObj *metadataForTableFromTdb(struct trackDb *tdb) // Returns the metadata for a table from a tdb setting. { char *setting = trackDbSetting(tdb, MDB_METADATA_KEY); if(setting == NULL) return NULL; struct mdbObj *mdbObj; AllocVar(mdbObj); mdbObj->obj = cloneString(tdb->table?tdb->table:tdb->track); AllocVar(mdbObj->vars); mdbObj->vars->var = cloneString(MDB_OBJ_TYPE); mdbObj->vars->val = cloneString(MDB_OBJ_TYPE_TABLE); mdbObj->varHash = hashNew(0); hashAdd(mdbObj->varHash, mdbObj->vars->var, mdbObj->vars); mdbObj = mdbObjAddVarPairs(mdbObj,setting); mdbObjRemoveVars(mdbObj,MDB_VAR_TABLENAME); // NOTE: Special hint that the tdb metadata is used since no mdb metadata is found return mdbObj; } const struct mdbObj *metadataForTable(char *db,struct trackDb *tdb,char *table) // Returns the metadata for a table. NEVER FREE THIS STRUCT! { struct mdbObj *mdbObj = NULL; // See of the mdbObj was already built if(tdb != NULL) { - mdbObj = tdbExtrasGetOrDefault(tdb, MDB_OBJ_KEY,NULL); + mdbObj = tdbExtrasMdb(tdb); if(mdbObj == METADATA_NOT_FOUND) // NOT in mtatbl, not in tdb metadata setting! return NULL; else if(mdbObj == MDB_NOT_FOUND) // looked mdb already and not found! return metadataForTableFromTdb(tdb); else if(mdbObj != NULL) { return mdbObj; // No reason to query the table again! } } struct sqlConnection *conn = hAllocConn(db); char *mdb = mdbTableName(conn,TRUE); // Look for sandbox name first if(tdb != NULL && tdb->table != NULL) table = tdb->table; if(mdb != NULL) mdbObj = mdbObjQueryByObj(conn,mdb,table,NULL); hFreeConn(&conn); // save the mdbObj for next time if(tdb) { if(mdbObj != NULL) - tdbExtrasAddOrUpdate(tdb,MDB_OBJ_KEY,mdbObj); + tdbExtrasMdbSet(tdb,mdbObj); else { - tdbExtrasAddOrUpdate(tdb,MDB_OBJ_KEY,MDB_NOT_FOUND); + tdbExtrasMdbSet(tdb,MDB_NOT_FOUND); return metadataForTableFromTdb(tdb); // FIXME: metadata setting in TDB is soon to be obsolete } } return mdbObj; } const char *metadataFindValue(struct trackDb *tdb, char *var) // Finds the val associated with the var or retruns NULL { -struct mdbObj *mdbObj = tdbExtrasGetOrDefault(tdb, MDB_OBJ_KEY,NULL); +struct mdbObj *mdbObj = tdbExtrasMdb(tdb); if(mdbObj == MDB_NOT_FOUND) // Note, only we if already looked for mdb (which requires db) mdbObj = metadataForTableFromTdb(tdb); if (mdbObj == NULL || mdbObj == METADATA_NOT_FOUND) return NULL; return mdbObjFindValue(mdbObj,var); } struct mdbObj *mdbObjSearch(struct sqlConnection *conn, char *var, char *val, char *op, int limit) // Search the metaDb table for objs by var and val. Can restrict by op "is", "like", "in" and accept (non-zero) limited string size // Search is via mysql, so it's case-insensitive. Return is sorted on obj. { if (var == NULL && val == NULL) errAbort("mdbObjSearch requests objects but provides no criteria.\n");