index_blob::index_blob(size_t count, const blob & x) : base(x), modified(false), resized(false), count(count) { indices = new sub[count]; if(!x.exists()) { /* same as default constructor */ modified = true; resized = true; return; } size_t offset = count * sizeof(uint32_t); for(size_t i = 0; i < count; i++) { uint32_t size = base.index<uint32_t>(i); if(size) { indices[i].delayed = true; indices[i]._size = --size; indices[i]._offset = offset; offset += size; } else assert(!indices[i].value.exists()); } }
inline reject_iter(dtable::iter * base, dtable * rejects, blob reject_value) : dtable_wrap_iter(base), rejects(rejects), reject_value(reject_value) { /* the reject value must exist, because nonexistent values * can get pruned out if the shadow does not require them */ assert(reject_value.exists()); }
/* if we made a better find(), this could avoid flattening every time */ int simple_ctable::insert(const dtype & key, size_t column, const blob & value, bool append) { int r = 0; assert(column < column_count); blob row = base->find(key); if(row.exists() || value.exists()) { /* TODO: improve this... it is probably killing us */ index_blob sub(column_count, row); sub.set(column, value); r = base->insert(key, sub.flatten(), append); } return r; }
void print(const blob & x, const char * prefix, ...) { va_list ap; va_start(ap, prefix); if(!x.exists()) { if(prefix) vprintf(prefix, ap); printf("(non-existent)\n"); va_end(ap); return; } for(size_t i = 0; i < x.size(); i += 16) { size_t m = i + 16; if(prefix) vprintf(prefix, ap); for(size_t j = i; j < m; j++) { if(j < x.size()) printf("%02x ", x[j]); else printf(" "); if((i % 16) == 8) printf(" "); } printf(" |"); for(size_t j = i; j < m; j++) { if(j < x.size()) printf("%c", isprint(x[j]) ? x[j] : '.'); else printf(" "); } printf("|\n"); } va_end(ap); }