src/hg/utils/refSeqGet/refSeqVerInfo.c 1.2
1.2 2009/11/30 17:54:31 markd
fixed error detected in optimized compile
Index: src/hg/utils/refSeqGet/refSeqVerInfo.c
===================================================================
RCS file: /projects/compbio/cvsroot/kent/src/hg/utils/refSeqGet/refSeqVerInfo.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -b -B -U 1000000 -r1.1 -r1.2
--- src/hg/utils/refSeqGet/refSeqVerInfo.c 23 Nov 2009 02:56:20 -0000 1.1
+++ src/hg/utils/refSeqGet/refSeqVerInfo.c 30 Nov 2009 17:54:31 -0000 1.2
@@ -1,152 +1,153 @@
/* object to track refseqs that are to be retrieved */
#include "common.h"
#include "refSeqVerInfo.h"
#include "linefile.h"
#include "hash.h"
#include "jksql.h"
#include "sqlNum.h"
enum refSeqVerInfoStatus
/* validation status */
{
refSeqVerInfoOk,
refSeqVerInfoIgnore, // duplicate, ignore
refSeqVerInfoError
};
static struct refSeqVerInfo *refSeqVerInfoNewDb(char **row)
/* construct a refSeqVerInfo object from a database query */
{
struct refSeqVerInfo *rsvi;
AllocVar(rsvi);
rsvi->acc = cloneString(row[0]);
rsvi->ver = sqlSigned(row[1]);
return rsvi;
}
struct hash *refSeqVerInfoFromDb(struct sqlConnection *conn, boolean getNM, boolean getNR)
/* load refSeqVerInfo table for all native refseqs in the database */
{
struct hash *refSeqVerInfoTbl = hashNew(18);
char *restrict = "";
if (getNM && !getNR)
restrict = " AND (acc LIKE \"NM%\")";
else if (!getNM && getNR)
restrict = " AND (acc LIKE \"NR%\")";
char query[128];
safef(query, sizeof(query),
"SELECT acc, version FROM gbStatus WHERE (srcDb = \"RefSeq\") AND (orgCat = \"native\")%s", restrict);
struct sqlResult *sr = sqlGetResult(conn, query);
char **row;
while ((row = sqlNextRow(sr)) != NULL)
{
struct refSeqVerInfo *rsvi = refSeqVerInfoNewDb(row);
hashAdd(refSeqVerInfoTbl, rsvi->acc, rsvi);
}
sqlFreeResult(&sr);
return refSeqVerInfoTbl;
}
static struct refSeqVerInfo *refSeqVerInfoNewFile(char *acc)
/* construct a refSeqVerInfo object from a file */
{
struct refSeqVerInfo *rsvi;
AllocVar(rsvi);
char *dot = strchr(acc, '.');
rsvi->acc = cloneStringZ(acc, ((dot != NULL) ? (dot - acc) : strlen(acc)));
if (dot != NULL)
rsvi->requestVer = sqlUnsigned(dot+1);
return rsvi;
}
static void prAccReqVer(struct refSeqVerInfo *rsvi, FILE *fh)
/* print acc + requested version, or just acc if no version */
{
fputs(rsvi->acc, fh);
if (rsvi->requestVer != 0)
fprintf(fh, ".%d", rsvi->requestVer);
}
static enum refSeqVerInfoStatus dupCheck(struct hash *refSeqVerInfoTbl, struct refSeqVerInfo *rsvi, struct sqlConnection *conn)
{
struct refSeqVerInfo *rsvi0 = hashFindVal(refSeqVerInfoTbl, rsvi->acc);
if (rsvi0 != NULL)
{
if (rsvi0->requestVer == rsvi->requestVer)
return refSeqVerInfoIgnore; // already there with the same version, ignore
else
{
fprintf(stderr, "Error: RefSeq %s specified multiple times in accList, once as ", rsvi->acc);
prAccReqVer(rsvi0, stderr);
fputs(" and once as ", stderr);
prAccReqVer(rsvi0, stderr);
fputc('\n', stderr);
return refSeqVerInfoError;
}
}
else
return refSeqVerInfoOk;
}
int refSeqVerInfoGetVersion(char *acc, struct sqlConnection *conn)
/* get the version from the database, or zero if accession is not found */
{
char query[128];
safef(query, sizeof(query),
"SELECT version FROM gbSeq WHERE (acc = \"%s\")", acc);
return sqlQuickNum(conn, query);
}
static enum refSeqVerInfoStatus versionGetCheck(struct refSeqVerInfo *rsvi, struct sqlConnection *conn)
/* get or validate the version from the file against the database */
{
int dbVer = refSeqVerInfoGetVersion(rsvi->acc, conn);
if (dbVer == 0)
{
fprintf(stderr, "Error: RefSeq %s not in database\n", rsvi->acc);
return refSeqVerInfoError;
}
if ((rsvi->requestVer != 0) && (dbVer != rsvi->requestVer))
{
fprintf(stderr, "Error: RefSeq %s.%d requested in accList, database contains %s.%d \n", rsvi->acc, rsvi->requestVer, rsvi->acc, dbVer);
return refSeqVerInfoError;
}
rsvi->ver = dbVer;
return refSeqVerInfoOk;
}
static enum refSeqVerInfoStatus fromFileAdd(struct hash *refSeqVerInfoTbl, struct refSeqVerInfo *rsvi, struct sqlConnection *conn)
/* add a refseq parsed from a file to the table, validating against database
* and setting the actually version number. */
{
enum refSeqVerInfoStatus stat = dupCheck(refSeqVerInfoTbl, rsvi, conn);
if (stat != refSeqVerInfoOk)
return stat;
stat = versionGetCheck(rsvi, conn);
if (stat != refSeqVerInfoOk)
return stat;
hashAdd(refSeqVerInfoTbl, rsvi->acc, rsvi);
return refSeqVerInfoOk;
}
struct hash *refSeqVerInfoFromFile(struct sqlConnection *conn, char *accList)
/* load refSeqVerInfo table for all native refseqs specified in a file, then validate it against
* the database. */
{
struct hash *refSeqVerInfoTbl = hashNew(18);
struct lineFile *lf = lineFileOpen(accList, TRUE);
int errCnt = 0;
-char **row;
-while (lineFileNextReal(lf, row))
+char *line;
+while (lineFileNextReal(lf, &line))
{
- if (fromFileAdd(refSeqVerInfoTbl, refSeqVerInfoNewFile(row[0]), conn) == refSeqVerInfoError)
+ char *acc = trimSpaces(line);
+ if (fromFileAdd(refSeqVerInfoTbl, refSeqVerInfoNewFile(acc), conn) == refSeqVerInfoError)
errCnt++;
}
lineFileClose(&lf);
if (errCnt > 0)
errAbort("%d errors detected loading RefSeq accessioned from %s", errCnt, accList);
return refSeqVerInfoTbl;
}