static void RefSeq_RefSeq_close(RefSeq *const super) { TableReaderRefSeq const *const reader = super->u.refSeq.reader; super->u.refSeq.reader = NULL; TableReaderRefSeq_Whack(reader); }
LIB_EXPORT rc_t CC TableReaderRefSeq_MakeTable(const TableReaderRefSeq** cself, const VDBManager* vmgr, const VTable* table, uint32_t options, size_t cache) { rc_t rc = 0; TableReaderRefSeq* self = NULL; if( cself == NULL || table == NULL ) { rc = RC(rcAlign, rcType, rcConstructing, rcParam, rcNull); } else if( (self = calloc(1, sizeof(*self))) == NULL ) { rc = RC(rcAlign, rcType, rcConstructing, rcMemory, rcExhausted); } else { const TableReader* tmp; TableReaderColumn static_cols[] = { /* order important, see code below! */ {0, "MAX_SEQ_LEN", {NULL}, 0, 0}, {0, "SEQ_ID", {NULL}, 0, 0}, {0, "TOTAL_SEQ_LEN", {NULL}, 0, 0}, {0, "CIRCULAR", {NULL}, 0, 0}, {0, "MD5", {NULL}, 0, ercol_Optional}, {0, NULL, {NULL}, 0, 0} }; if( (rc = TableReader_Make(&tmp, table, static_cols, 0)) == 0 ) { if( (rc = TableReader_ReadRow(tmp, 1)) == 0 ) { self->max_seq_len = static_cols[0].base.u32[0]; self->total_seq_len = static_cols[2].base.u64[0]; if( self->total_seq_len != static_cols[2].base.u64[0] ) { rc = RC(rcAlign, rcType, rcConstructing, rcData, rcOutofrange); } if( static_cols[1].base.var != NULL ) { if ( static_cols[ 1 ].len > sizeof( self->seq_id ) - 1 ) { rc = RC( rcAlign, rcType, rcConstructing, rcBuffer, rcInsufficient ); } else { string_copy( self->seq_id, ( sizeof self->seq_id ) - 1, static_cols[1].base.str, static_cols[1].len ); self->seq_id[ static_cols[ 1 ].len ] = '\0'; } } self->circular = static_cols[3].base.buul[0]; if( static_cols[4].base.var != NULL ) { memcpy(self->md5, static_cols[4].base.var, sizeof(self->md5)); self->has_md5 = true; } } TableReader_Whack(tmp); } memcpy(self->cols, TableReaderRefSeq_cols, sizeof(TableReaderRefSeq_cols)); if( options & errefseq_4NA) { self->cols[0].flags |= ercol_Skip; self->cols[1].flags &= ~ercol_Skip; self->read = &self->cols[1]; } else { self->read = &self->cols[0]; } self->seq_len = &self->cols[3]; rc = TableReader_Make(&self->base, table, self->cols, cache); } if( rc == 0 ) { *cself = self; /* ALIGN_DBG("table 0x%p opened 0x%p", table, self); */ } else { TableReaderRefSeq_Whack(self); ALIGN_DBGERRP("table for 0x%p", rc, table); } return rc; }