struct mdbObj *getMdbList(char *database) /* Get list of metaDb objects for a database. */ { struct sqlConnection *conn = sqlConnect(database); struct mdbObj *list = mdbObjsQueryAll(conn, metaTable); sqlDisconnect(&conn); return list; }
struct mdbObj *getMdbList(char *databases[], int databaseCount) /* Get list of metaDb objects for database. */ { struct mdbObj *mdbList = NULL; int i; for (i=0; i<databaseCount; ++i) { /* Grab list of all metaDb obj. */ char *database = databases[i]; struct sqlConnection *conn = sqlConnect(database); struct mdbObj *oneList = mdbObjsQueryAll(conn, metaTable); verbose(2, "%d objects in %s.%s\n", slCount(mdbList), database, metaTable); mdbList = slCat(mdbList, oneList); sqlDisconnect(&conn); } return mdbList; }
void expFind(char *assembly, char *file) /* Find experiments in metaDb and output .ra file */ { verbose(1, "Finding experiments in %s:%s\n", assembly, mdb); struct sqlConnection *connMeta; struct mdbObj *meta = NULL, *metas = NULL; struct encodeExp *exp = NULL, *exps = NULL; struct hash *oldExps, *newExps; char *key; int expNum = 0; FILE *f = mustOpen(file, "w"); /* create hash of keys for existing experiments so we can distinguish new ones */ oldExps = expKeyHashFromTable(connExp, table); newExps = hashNew(0); /* read mdb objects from database */ connMeta = sqlConnect(assembly); metas = mdbObjsQueryAll(connMeta, mdb); verbose(2, "Found %d objects\n", slCount(metas)); /* order so that oldest have lowest ids */ mdbObjsSortOnVars(&metas, "dateSubmitted lab dataType cell"); /* create new experiments */ while ((meta = slPopHead(&metas)) != NULL) { if (!mdbObjIsEncode(meta)) continue; if (composite != NULL && !mdbObjInComposite(meta, composite)) continue; exp = encodeExpFromMdb(connMeta,assembly,meta); if (exp == NULL) continue; key = encodeExpKey(exp); verbose(3, "key: %s\n", key); if (hashLookup(newExps, key) == NULL && hashLookup(oldExps, key) == NULL) { verbose(2, "Found new experiment - Date: %s Experiment %d: %s\n", mdbObjFindValue(meta, "dateSubmitted"), ++expNum, key); /* save new experiment */ hashAdd(newExps, key, NULL); slAddHead(&exps, exp); } /* Skip other metas belonging to the same exp by: struct mdbVar *edvs = mdbObjFindEncodeEdvs(connMeta,meta); // Can't use encodeExpVars(exp) because of "None" issues assert(edvs != NULL); char *expVars = slPairListToString(edvs,FALSE); // don't bother with quoting since edvs should not have spaces struct mdbObj *mdbExpObjs = mdbObjsFilterByVars(&metas,expVars,TRUE,TRUE); freeMem(expVars); mdbVarsFree(&edvs); // If you want to do this, then encodeExpFromMdb() above should be replaced with encodeExpFromMdbVars() mdbObjFree(&mdbExpObjs); // Filtering destroyed sort order // NOTE: Given the re-sort, this may not prove much more efficient mdbObjsSortOnVars(&metas, "dateSubmitted lab dataType cell"); */ } /* write out experiments in .ra format */ slReverse(&exps); while ((exp = slPopHead(&exps)) != NULL) { exp->organism = organism; encodeExpToRaFile(exp, f); } carefulClose(&f); sqlDisconnect(&connMeta); }