ae3969602106c0229160648f6ff6c87c3ad0de2d giardine Tue Dec 7 14:13:12 2010 -0800 Addition of wiki track and supporting tracks for microattribution reviews (part of the variome project) diff --git src/hg/lib/variome.c src/hg/lib/variome.c new file mode 100644 index 0000000..5e1e740 --- /dev/null +++ src/hg/lib/variome.c @@ -0,0 +1,424 @@ +/* variome.c was originally generated by the autoSql program, which also + * generated variome.h and variome.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 "variome.h" +#include "hdb.h" +#include "binRange.h" + +static char const rcsid[] = "$Id:$"; + +void variomeStaticLoad(char **row, struct variome *ret) +/* Load a row from variome table into ret. The contents of ret will + * be replaced at the next call to this function. */ +{ + +ret->bin = sqlUnsigned(row[0]); +ret->chrom = row[1]; +ret->chromStart = sqlUnsigned(row[2]); +ret->chromEnd = sqlUnsigned(row[3]); +ret->name = row[4]; +ret->score = sqlUnsigned(row[5]); +safecpy(ret->strand, sizeof(ret->strand), row[6]); +ret->db = row[7]; +ret->owner = row[8]; +ret->color = row[9]; +ret->class = row[10]; +ret->creationDate = row[11]; +ret->lastModifiedDate = row[12]; +ret->descriptionKey = row[13]; +ret->id = sqlUnsigned(row[14]); +ret->geneSymbol = row[15]; +} + +struct variome *variomeLoad(char **row) +/* Load a variome from row fetched with select * from variome + * from database. Dispose of this with variomeFree(). */ +{ +struct variome *ret; + +AllocVar(ret); +ret->bin = sqlUnsigned(row[0]); +ret->chrom = cloneString(row[1]); +ret->chromStart = sqlUnsigned(row[2]); +ret->chromEnd = sqlUnsigned(row[3]); +ret->name = cloneString(row[4]); +ret->score = sqlUnsigned(row[5]); +safecpy(ret->strand, sizeof(ret->strand), row[6]); +ret->db = cloneString(row[7]); +ret->owner = cloneString(row[8]); +ret->color = cloneString(row[9]); +ret->class = cloneString(row[10]); +ret->creationDate = cloneString(row[11]); +ret->lastModifiedDate = cloneString(row[12]); +ret->descriptionKey = cloneString(row[13]); +ret->id = sqlUnsigned(row[14]); +ret->geneSymbol = cloneString(row[15]); +return ret; +} + +struct variome *variomeLoadAll(char *fileName) +/* Load all variome from a whitespace-separated file. + * Dispose of this with variomeFreeList(). */ +{ +struct variome *list = NULL, *el; +struct lineFile *lf = lineFileOpen(fileName, TRUE); +char *row[16]; + +while (lineFileRow(lf, row)) + { + el = variomeLoad(row); + slAddHead(&list, el); + } +lineFileClose(&lf); +slReverse(&list); +return list; +} + +struct variome *variomeLoadAllByChar(char *fileName, char chopper) +/* Load all variome from a chopper separated file. + * Dispose of this with variomeFreeList(). */ +{ +struct variome *list = NULL, *el; +struct lineFile *lf = lineFileOpen(fileName, TRUE); +char *row[16]; + +while (lineFileNextCharRow(lf, chopper, row, ArraySize(row))) + { + el = variomeLoad(row); + slAddHead(&list, el); + } +lineFileClose(&lf); +slReverse(&list); +return list; +} + +struct variome *variomeLoadByQuery(struct sqlConnection *conn, char *query) +/* Load all variome from table that satisfy the query given. + * Where query is of the form 'select * from example where something=something' + * or 'select example.* from example, anotherTable where example.something = + * anotherTable.something'. + * Dispose of this with variomeFreeList(). */ +{ +struct variome *list = NULL, *el; +struct sqlResult *sr; +char **row; + +sr = sqlGetResult(conn, query); +while ((row = sqlNextRow(sr)) != NULL) + { + el = variomeLoad(row); + slAddHead(&list, el); + } +slReverse(&list); +sqlFreeResult(&sr); +return list; +} + +void variomeSaveToDb(struct sqlConnection *conn, struct variome *el, char *tableName, int updateSize) +/* Save variome as a row to the table specified by tableName. + * As blob fields may be arbitrary size updateSize specifies the approx size + * of a string that would contain the entire query. Arrays of native types are + * converted to comma separated strings and loaded as such, User defined types are + * inserted as NULL. Note that strings must be escaped to allow insertion into the database. + * For example "autosql's features include" --> "autosql\'s features include" + * If worried about this use variomeSaveToDbEscaped() */ +{ +struct dyString *update = newDyString(updateSize); +dyStringPrintf(update, "insert into %s values ( %u,'%s',%u,%u,'%s',%u,'%s','%s','%s','%s','%s','%s','%s','%s',%u,'%s')", + tableName, el->bin, el->chrom, el->chromStart, el->chromEnd, el->name, el->score, el->strand, el->db, el->owner, el->color, el->class, el->creationDate, el->lastModifiedDate, el->descriptionKey, el->id, el->geneSymbol); +sqlUpdate(conn, update->string); +freeDyString(&update); +} + +void variomeSaveToDbEscaped(struct sqlConnection *conn, struct variome *el, char *tableName, int updateSize) +/* Save variome as a row to the table specified by tableName. + * As blob fields may be arbitrary size updateSize specifies the approx size. + * of a string that would contain the entire query. Automatically + * escapes all simple strings (not arrays of string) but may be slower than variomeSaveToDb(). + * For example automatically copies and converts: + * "autosql's features include" --> "autosql\'s features include" + * before inserting into database. */ +{ +struct dyString *update = newDyString(updateSize); +char *chrom, *name, *strand, *db, *owner, *color, *class, *creationDate, *lastModifiedDate, *descriptionKey, *geneSymbol; +chrom = sqlEscapeString(el->chrom); +name = sqlEscapeString(el->name); +strand = sqlEscapeString(el->strand); +db = sqlEscapeString(el->db); +owner = sqlEscapeString(el->owner); +color = sqlEscapeString(el->color); +class = sqlEscapeString(el->class); +creationDate = sqlEscapeString(el->creationDate); +lastModifiedDate = sqlEscapeString(el->lastModifiedDate); +descriptionKey = sqlEscapeString(el->descriptionKey); +geneSymbol = sqlEscapeString(el->geneSymbol); + +dyStringPrintf(update, "insert into %s values ( %u,'%s',%u,%u,'%s',%u,'%s','%s','%s','%s','%s','%s','%s','%s',%u,'%s')", + tableName, el->bin, chrom, el->chromStart, el->chromEnd, name, el->score, strand, db, owner, color, class, creationDate, lastModifiedDate, descriptionKey, el->id, geneSymbol); +sqlUpdate(conn, update->string); +freeDyString(&update); +freez(&chrom); +freez(&name); +freez(&strand); +freez(&db); +freez(&owner); +freez(&color); +freez(&class); +freez(&creationDate); +freez(&lastModifiedDate); +freez(&descriptionKey); +freez(&geneSymbol); +} + +struct variome *variomeCommaIn(char **pS, struct variome *ret) +/* Create a variome out of a comma separated string. + * This will fill in ret if non-null, otherwise will + * return a new variome */ +{ +char *s = *pS; + +if (ret == NULL) + AllocVar(ret); +ret->bin = sqlUnsignedComma(&s); +ret->chrom = sqlStringComma(&s); +ret->chromStart = sqlUnsignedComma(&s); +ret->chromEnd = sqlUnsignedComma(&s); +ret->name = sqlStringComma(&s); +ret->score = sqlUnsignedComma(&s); +sqlFixedStringComma(&s, ret->strand, sizeof(ret->strand)); +ret->db = sqlStringComma(&s); +ret->owner = sqlStringComma(&s); +ret->color = sqlStringComma(&s); +ret->class = sqlStringComma(&s); +ret->creationDate = sqlStringComma(&s); +ret->lastModifiedDate = sqlStringComma(&s); +ret->descriptionKey = sqlStringComma(&s); +ret->id = sqlUnsignedComma(&s); +ret->geneSymbol = sqlStringComma(&s); +*pS = s; +return ret; +} + +void variomeFree(struct variome **pEl) +/* Free a single dynamically allocated variome such as created + * with variomeLoad(). */ +{ +struct variome *el; + +if ((el = *pEl) == NULL) return; +freeMem(el->chrom); +freeMem(el->name); +freeMem(el->db); +freeMem(el->owner); +freeMem(el->color); +freeMem(el->class); +freeMem(el->creationDate); +freeMem(el->lastModifiedDate); +freeMem(el->descriptionKey); +freeMem(el->geneSymbol); +freez(pEl); +} + +void variomeFreeList(struct variome **pList) +/* Free a list of dynamically allocated variome's */ +{ +struct variome *el, *next; + +for (el = *pList; el != NULL; el = next) + { + next = el->next; + variomeFree(&el); + } +*pList = NULL; +} + +void variomeOutput(struct variome *el, FILE *f, char sep, char lastSep) +/* Print out variome. Separate fields with sep. Follow last field with lastSep. */ +{ +fprintf(f, "%u", el->bin); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->chrom); +if (sep == ',') fputc('"',f); +fputc(sep,f); +fprintf(f, "%u", el->chromStart); +fputc(sep,f); +fprintf(f, "%u", el->chromEnd); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->name); +if (sep == ',') fputc('"',f); +fputc(sep,f); +fprintf(f, "%u", el->score); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->strand); +if (sep == ',') fputc('"',f); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->db); +if (sep == ',') fputc('"',f); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->owner); +if (sep == ',') fputc('"',f); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->color); +if (sep == ',') fputc('"',f); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->class); +if (sep == ',') fputc('"',f); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->creationDate); +if (sep == ',') fputc('"',f); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->lastModifiedDate); +if (sep == ',') fputc('"',f); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->descriptionKey); +if (sep == ',') fputc('"',f); +fputc(sep,f); +fprintf(f, "%u", el->id); +fputc(sep,f); +if (sep == ',') fputc('"',f); +fprintf(f, "%s", el->geneSymbol); +if (sep == ',') fputc('"',f); +fputc(lastSep,f); +} + +/* -------------------------------- End autoSql Generated Code -------------------------------- */ +#include "wikiTrack.h" +#include "wikiLink.h" +#include "web.h" +#include "cheapcgi.h" +#include "hPrint.h" +#include "hgConfig.h" +#include "hCommon.h" + +char *variomeClassList[] = { + "substitution", + "insertion", + "duplication", + "deletion", + "inversion", + "complex", + ITEM_NOT_CLASSIFIED, +}; + +char *variomeCoorList[] = { + "exact coordinates", + "estimated coordinates", +}; + +int variomeClassCnt = ArraySize(variomeClassList); + +struct variome *findVariomeItemId(char *db, char *wikiItemId) +/* given a wikiItemId return the row from the table */ +{ +struct variome *item; +char query[256]; +struct sqlConnection *conn = wikiConnect(); + +safef(query, ArraySize(query), "SELECT * FROM variome WHERE id='%s' limit 1", + wikiItemId); + +item = variomeLoadByQuery(conn, query); +if (NULL == item) + errAbort("display wiki item: failed to load item '%s'", wikiItemId); + +wikiDisconnect(&conn); +return item; +} + +/* use functions from lib/wikiTrack.c, lib/wikiLink.c for accessing wiki pages */ + +int addVariomeItem(char *db, char *chrom, int start, int end, + char *name, int score, char *strand, char *owner, char *class, + char *color, char *category, char *geneSymbol, char *wikiKey) +/* create new Variome row with given parameters */ +{ +struct sqlConnection *conn = wikiConnect(); +struct variome *newItem; +AllocVar(newItem); +newItem->bin = binFromRange(start, end); +newItem->chrom = cloneString(chrom); +newItem->chromStart = start; +newItem->chromEnd = end; +newItem->name = cloneString(name); +newItem->score = score; +if (sameString(strand, "plus")) + safef(newItem->strand, sizeof(newItem->strand), "%s", "+"); +else if (sameString(strand, "minus")) + safef(newItem->strand, sizeof(newItem->strand), "%s", "-"); +else + safef(newItem->strand, sizeof(newItem->strand), "%s", " "); +newItem->db = cloneString(db); +newItem->owner = cloneString(owner); +newItem->class = cloneString(class); +newItem->color = cloneString(color); +newItem->creationDate = cloneString("0"); +newItem->lastModifiedDate = cloneString("0"); +newItem->descriptionKey = cloneString("0"); +newItem->id = 0; +newItem->geneSymbol = cloneString(geneSymbol); + +variomeSaveToDbEscaped(conn, newItem, "variome", 1024); + +int id = sqlLastAutoId(conn); +char descriptionKey[256]; +/* when wikiKey is NULL, assign the default key of category:db-id, + * else, it is the proper key + */ +if (wikiKey) + safef(descriptionKey,ArraySize(descriptionKey), "%s", wikiKey); +else + safef(descriptionKey,ArraySize(descriptionKey), + "%s:%s-%d", category, db, id); + +variomeFree(&newItem); + +char query[1024]; +safef(query, ArraySize(query), "UPDATE %s set creationDate=now(),lastModifiedDate=now(),descriptionKey='%s' WHERE id='%d'", + "variome", descriptionKey, id); + +sqlUpdate(conn,query); +wikiDisconnect(&conn); +return (id); +} + +void updateVariomeLastModifiedDate(char *db, int id) +/* set lastModifiedDate to now() */ +{ +char query[512]; +struct sqlConnection *conn = wikiConnect(); + +safef(query, ArraySize(query), + "UPDATE %s set lastModifiedDate=now() WHERE id='%d'", + "variome", id); +sqlUpdate(conn,query); +wikiDisconnect(&conn); +} + +void deleteVariomeItem(char *db, int id) +/* delete the item with specified id */ +{ +char query[512]; +struct sqlConnection *conn = wikiConnect(); +safef(query, ArraySize(query), "DELETE FROM %s WHERE id='%d'", + "variome", id); +sqlUpdate(conn,query); +wikiDisconnect(&conn); +} + +/* prefixComments and addDescription used from wikiTrack.c */ +