466bcfa4fd1e55b3567ea169b71f8ba7e7e3be89 angie Mon Feb 11 10:04:05 2013 -0800 Added setAutoSqlObject method to annoStreamer, to update both asObj andinternal state derived from it. (for #6152) diff --git src/lib/annoStreamer.c src/lib/annoStreamer.c index 202cc80..af2b850 100644 --- src/lib/annoStreamer.c +++ src/lib/annoStreamer.c @@ -1,28 +1,39 @@ /* annoStreamer -- returns items sorted by genomic position to successive nextRow calls */ #include "annoStreamer.h" #include "errabort.h" // ----------------------- annoStreamer base methods -------------------------- struct asObject *annoStreamerGetAutoSqlObject(struct annoStreamer *self) /* Return parsed autoSql definition of this streamer's data type. */ { return self->asObj; } +void annoStreamerSetAutoSqlObject(struct annoStreamer *self, struct asObject *asObj) +/* Use new asObj and update internal state derived from asObj. */ +{ +annoFilterFreeList(&(self->filters)); +annoColumnFreeList(&(self->columns)); +self->asObj = asObj; +self->filters = annoFiltersFromAsObject(asObj); +self->columns = annoColumnsFromAsObject(asObj); +self->numCols = slCount(asObj->columnList); +} + void annoStreamerSetRegion(struct annoStreamer *self, char *chrom, uint rStart, uint rEnd) /* Set genomic region for query; if chrom is NULL, position is genome. * Many subclasses should make their own setRegion method that calls this and * configures their data connection to change to the new position. */ { freez(&(self->chrom)); if (chrom == NULL) { self->positionIsGenome = TRUE; self->regionStart = self->regionEnd = 0; } else { self->positionIsGenome = FALSE; self->chrom = cloneString(chrom); @@ -64,41 +75,39 @@ } void annoStreamerSetQuery(struct annoStreamer *self, struct annoGratorQuery *query) /* Set query (to be called only by annoGratorQuery which is created after streamers). */ { self->query = query; } void annoStreamerInit(struct annoStreamer *self, struct asObject *asObj) /* Initialize a newly allocated annoStreamer with default annoStreamer methods and * default filters and columns based on asObj. * In general, subclasses' constructors will call this first; override nextRow, close, * and probably setRegion and setQuery; and then initialize their private data. */ { self->getAutoSqlObject = annoStreamerGetAutoSqlObject; +self->setAutoSqlObject = annoStreamerSetAutoSqlObject; self->setRegion = annoStreamerSetRegion; self->getHeader = annoStreamerGetHeader; self->getFilters = annoStreamerGetFilters; self->setFilters = annoStreamerSetFilters; self->getColumns = annoStreamerGetColumns; self->setColumns = annoStreamerSetColumns; self->setQuery = annoStreamerSetQuery; self->positionIsGenome = TRUE; -self->asObj = asObj; -self->filters = annoFiltersFromAsObject(asObj); -self->columns = annoColumnsFromAsObject(asObj); -self->numCols = slCount(asObj->columnList); +self->setAutoSqlObject(self, asObj); } void annoStreamerFree(struct annoStreamer **pSelf) /* Free self. This should be called at the end of subclass close methods, after * subclass-specific connections are closed and resources are freed. */ { if (pSelf == NULL) return; struct annoStreamer *self = *pSelf; freez(&(self->chrom)); annoFilterFreeList(&(self->filters)); annoColumnFreeList(&(self->columns)); freez(pSelf); }