3d69928e215f730780d0166191cb1a6d794a760d max Tue Feb 11 14:39:09 2014 -0800 making hgConvert gbib-ready, refs 11957 diff --git src/hg/lib/chromInfo.c src/hg/lib/chromInfo.c index 2aff7ca..aed8555 100644 --- src/hg/lib/chromInfo.c +++ src/hg/lib/chromInfo.c @@ -1,278 +1,274 @@ /* chromInfo.c was originally generated by the autoSql program, which also * generated chromInfo.h and chromInfo.sql. This module links the database and * the RAM representation of objects. */ #include "common.h" #include "linefile.h" #include "dystring.h" #include "jksql.h" #include "hdb.h" #include "chromInfo.h" void chromInfoStaticLoad(char **row, struct chromInfo *ret) /* Load a row from chromInfo table into ret. The contents of ret will * be replaced at the next call to this function. */ { ret->chrom = row[0]; ret->size = sqlUnsigned(row[1]); ret->fileName = row[2]; } struct chromInfo *chromInfoLoad(char **row) /* Load a chromInfo from row fetched with select * from chromInfo * from database. Dispose of this with chromInfoFree(). */ { struct chromInfo *ret; AllocVar(ret); ret->chrom = cloneString(row[0]); ret->size = sqlUnsigned(row[1]); ret->fileName = cloneString(row[2]); return ret; } struct chromInfo *chromInfoLoadAll(char *fileName) /* Load all chromInfo from a whitespace-separated file. * Dispose of this with chromInfoFreeList(). */ { struct chromInfo *list = NULL, *el; struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[3]; while (lineFileRow(lf, row)) { el = chromInfoLoad(row); slAddHead(&list, el); } lineFileClose(&lf); slReverse(&list); return list; } struct chromInfo *chromInfoLoadAllByChar(char *fileName, char chopper) /* Load all chromInfo from a chopper separated file. * Dispose of this with chromInfoFreeList(). */ { struct chromInfo *list = NULL, *el; struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[3]; while (lineFileNextCharRow(lf, chopper, row, ArraySize(row))) { el = chromInfoLoad(row); slAddHead(&list, el); } lineFileClose(&lf); slReverse(&list); return list; } struct chromInfo *chromInfoCommaIn(char **pS, struct chromInfo *ret) /* Create a chromInfo out of a comma separated string. * This will fill in ret if non-null, otherwise will * return a new chromInfo */ { char *s = *pS; if (ret == NULL) AllocVar(ret); ret->chrom = sqlStringComma(&s); ret->size = sqlUnsignedComma(&s); ret->fileName = sqlStringComma(&s); *pS = s; return ret; } void chromInfoFree(struct chromInfo **pEl) /* Free a single dynamically allocated chromInfo such as created * with chromInfoLoad(). */ { struct chromInfo *el; if ((el = *pEl) == NULL) return; freeMem(el->chrom); freeMem(el->fileName); freez(pEl); } void chromInfoFreeList(struct chromInfo **pList) /* Free a list of dynamically allocated chromInfo's */ { struct chromInfo *el, *next; for (el = *pList; el != NULL; el = next) { next = el->next; chromInfoFree(&el); } *pList = NULL; } void chromInfoOutput(struct chromInfo *el, FILE *f, char sep, char lastSep) /* Print out chromInfo. Separate fields with sep. Follow last field with lastSep. */ { if (sep == ',') fputc('"',f); fprintf(f, "%s", el->chrom); if (sep == ',') fputc('"',f); fputc(sep,f); fprintf(f, "%u", el->size); fputc(sep,f); if (sep == ',') fputc('"',f); fprintf(f, "%s", el->fileName); if (sep == ',') fputc('"',f); fputc(lastSep,f); } /* -------------------------------- End autoSql Generated Code -------------------------------- */ boolean chromSeqFileExists(char *db, char *chrom) /* Check whether chromInfo exists for a database, find the path of the */ /* sequence file for this chromosome and check if the file exists. */ { char seqFile[512]; struct sqlConnection *conn = sqlConnect(db); char query[256]; char *res = NULL; boolean exists = FALSE; /* if the database exists, check for the chromInfo file */ if (sqlDatabaseExists(db)) { sqlSafef(query, sizeof(query), "select fileName from chromInfo where chrom = '%s'", chrom); res = sqlQuickQuery(conn, query, seqFile, 512); sqlDisconnect(&conn); } /* if there is not table or no information in the table or if the table */ /* exists but the file can not be opened return false, otherwise sequence */ /* file exists and return true */ if (res != NULL) { - /* chromInfo table exists so check that sequence file can be opened */ - FILE *f = fopen(seqFile, "rb"); - if (f != NULL) - { - exists = TRUE; - fclose(f); - } + char *seqFile2 = hReplaceGbdb(seqFile); + exists = udcExists(seqFile2); + freeMem(seqFile2); } return exists; } struct chromInfo *createChromInfoList(char *name, char *database) /* Load up chromosome information for chrom 'name'. * If name is NULL or "all" then load all chroms. * Similar to featureBits.c - could be moved to library */ { struct sqlConnection *conn = hAllocConn(database); struct sqlResult *sr = NULL; char **row; int loaded=0; struct chromInfo *ret = NULL; unsigned totalSize = 0; /* do the query */ if (!name || sameWord(name, "all")) sr = sqlGetResult(conn, "NOSQLINJ select * from chromInfo"); else { char select[256]; sqlSafef(select, ArraySize(select), "select * from chromInfo where chrom='%s'", name); sr = sqlGetResult(conn, select); } /* read the rows and build the chromInfo list */ while ((row = sqlNextRow(sr)) != NULL) { struct chromInfo *el; struct chromInfo *ci; AllocVar(ci); el = chromInfoLoad(row); ci->chrom = cloneString(el->chrom); ci->size = el->size; totalSize += el->size; slAddHead(&ret, ci); ++loaded; } if (loaded < 1) errAbort("ERROR: can not find chrom name: '%s'\n", name ? name : "NULL"); slReverse(&ret); if (!name || sameWord(name, "all")) verbose(2, "#\tloaded size info for %d chroms, total size: %u\n", loaded, totalSize); sqlFreeResult(&sr); hFreeConn(&conn); return ret; } struct hash *chromNameAndSizeHashFromList(struct chromInfo *ci) /* Return a hash table of chrom key=name, val=size */ { unsigned *size; struct hash *h = newHash(0); for ( ; ci ; ci = ci->next ) { AllocVar(size); *size = ci->size; hashAdd(h, ci->chrom, size); } return h; } struct hash *chromHashFromDatabase(char *db) /* read chrom info from database and return hash of name and size */ { struct hash *chromSizeHash = NULL; struct chromInfo *list = NULL; list = createChromInfoList(NULL, db); if (!list) errAbort("could not load chromInfo from DB %s\n", db); chromSizeHash = chromNameAndSizeHashFromList(list); chromInfoFree(&list); return chromSizeHash; } struct chromInfo *chromInfoAddOneFromFile(char **row) /* Load a chromInfo from row fetched from file. * Dispose of this with chromInfoFree(). */ { struct chromInfo *ret; AllocVar(ret); ret->chrom = cloneString(row[0]); ret->size = sqlUnsigned(row[1]); ret->fileName = NULL; // note only name and size supported return ret; } struct chromInfo *chromInfoListFromFile(char *fileName) /* read chrom info from file and return list of name and size */ { struct chromInfo *list = NULL, *el; struct lineFile *lf = lineFileOpen(fileName, TRUE); char *row[2]; while (lineFileRow(lf, row)) { el = chromInfoAddOneFromFile(row); slAddHead(&list, el); } lineFileClose(&lf); slReverse(&list); return list; } struct hash *chromHashFromFile(char *fileName) /* read chrom info from file and return hash of name and size */ { struct hash *chromSizeHash = NULL; struct chromInfo *list = NULL; list = chromInfoListFromFile(fileName); if (!list) errAbort("could not load chromInfo file %s\n", fileName); chromSizeHash = chromNameAndSizeHashFromList(list); chromInfoFree(&list); return chromSizeHash; }