9858c19837c76a77a9b9aaffe08ab1947feeb997 tdreszer Fri May 20 17:02:46 2011 -0700 Fixed segfault in mdbUpdate -accession when part of the selection has no expId in encodeExp yet. diff --git src/hg/lib/mdb.c src/hg/lib/mdb.c index 58fde26..4ac843e 100644 --- src/hg/lib/mdb.c +++ src/hg/lib/mdb.c @@ -2174,42 +2174,43 @@ hashAdd(mdbObj->varHash, mdbVar->var, mdbVar); // pointer to struct to resolve type return FALSE; } } boolean mdbObjSetVarInt(struct mdbObj *mdbObj, char *var,int val) // Sets an integer value to a single var in an obj, preparing for DB update. // returns TRUE if updated, FALSE if added { char buf[128]; safef(buf,sizeof(buf),"%d",val); return mdbObjSetVar(mdbObj,var,buf); } void mdbObjSwapVars(struct mdbObj *mdbObjs, char *vars,boolean deleteThis) -// Replaces objs' vars with var=vap pairs provided, preparing for DB update. +// Replaces objs' vars with var=val pairs provided, preparing for DB update. { struct mdbObj *mdbObj = NULL; for( mdbObj=mdbObjs; mdbObj!=NULL; mdbObj=mdbObj->next ) { mdbObj->deleteThis = deleteThis; if(mdbObj->varHash != NULL) hashFree(&mdbObj->varHash); mdbVarsFree(&(mdbObj->vars)); + if (vars != NULL) mdbObjAddVarPairs(mdbObj,vars); } } struct mdbObj *mdbObjsFilter(struct mdbObj **pMdbObjs, char *var, char *val,boolean returnMatches) // Filters mdb objects to only those that include/exclude vars. Optionally checks (case insensitive) val too. // Returns matched or unmatched items objects as requested, maintaining sort order { struct mdbObj *mdbObjsReturned = NULL; struct mdbObj *mdbObjs = *pMdbObjs; *pMdbObjs = NULL; struct mdbObj **pMatchTail = returnMatches ? &mdbObjsReturned : pMdbObjs; // Slightly faster than slAddHead/slReverse struct mdbObj **pNoMatchTail = returnMatches ? pMdbObjs : &mdbObjsReturned; // Also known as too clever by half while (mdbObjs!=NULL) { @@ -2839,31 +2840,31 @@ expCount++; expObjsCount += objsInExp; // Total of all experimental objects across the composite // Look up each exp in EXPERIMENTS_TABLE char experimentId[128]; int expId = ENCODE_EXP_IX_UNDEFINED; struct encodeExp *exp = encodeExpGetByMdbVarsFromTable(db, edvVarVals, expTable); // --------- BLOCK creation of expIds, at least during rollout of encodeExp // BLOCKED if (exp == NULL && createExpIfNecessary) // BLOCKED exp = encodeExpGetOrCreateByMdbVarsFromTable(db, edvVarVals, expTable); // --------- BLOCK creation of expIds, at least during rollout of encodeExp mdbVarsFree(&edvVarVals); // No longer needed // Make sure the accession is set if requested. if (createExpIfNecessary && updateAccession - && exp->ix != ENCODE_EXP_IX_UNDEFINED && exp->accession == NULL) + && exp != NULL && exp->ix != ENCODE_EXP_IX_UNDEFINED && exp->accession == NULL) encodeExpSetAccession(exp, expTable); if (exp != NULL) expId = exp->ix; if (expId == ENCODE_EXP_IX_UNDEFINED) { safef(experimentId,sizeof(experimentId),"{missing}"); if (warn > 0) printf("Experiment %s EDV: [%s] is not defined in %s.%s table.\n",experimentId,dyStringContents(dyVars), ENCODE_EXP_DATABASE, expTable); //printf("Experiment %s EDV: [%s] is not defined in %s table. Remaining:%d and %d\n",experimentId,dyStringContents(dyVars),EXPERIMENTS_TABLE,slCount(mdbCompositeObjs),slCount(mdbObjs)); if (warn < 2) // From mdbUpdate (warn=1), just interested in testing waters. From mdbPrint (warn=2) list all objs in exp. { expMissing += slCount(mdbExpObjs); mdbProcessedObs = slCat(mdbProcessedObs,mdbExpObjs);