static size_t assemble_id_index_value(DocInfo *docinfo, char *dst) { char* const start = dst; raw_id_index_value *raw = (raw_id_index_value*)dst; raw->db_seq = encode_raw48(docinfo->db_seq); raw->size = encode_raw32((uint32_t)docinfo->size); raw->bp = encode_raw48(docinfo->bp | (docinfo->deleted ? 1LL<<47 : 0)); raw->content_meta = encode_raw08(docinfo->content_meta); raw->rev_seq = encode_raw48(docinfo->rev_seq); dst += sizeof(*raw); memcpy(dst, docinfo->rev_meta.buf, docinfo->rev_meta.size); dst += docinfo->rev_meta.size; return dst - start; }
static couchstore_error_t write_header(Db *db) { sized_buf writebuf; size_t seqrootsize = 0, idrootsize = 0, localrootsize = 0; if (db->header.by_seq_root) { seqrootsize = ROOT_BASE_SIZE + db->header.by_seq_root->reduce_value.size; } if (db->header.by_id_root) { idrootsize = ROOT_BASE_SIZE + db->header.by_id_root->reduce_value.size; } if (db->header.local_docs_root) { localrootsize = ROOT_BASE_SIZE + db->header.local_docs_root->reduce_value.size; } writebuf.size = sizeof(raw_file_header) + seqrootsize + idrootsize + localrootsize; writebuf.buf = (char *) calloc(1, writebuf.size); raw_file_header* header = (raw_file_header*)writebuf.buf; header->version = encode_raw08(COUCH_DISK_VERSION); header->update_seq = encode_raw48(db->header.update_seq); header->purge_seq = encode_raw48(db->header.purge_seq); header->purge_ptr = encode_raw48(db->header.purge_ptr); header->seqrootsize = encode_raw16((uint16_t)seqrootsize); header->idrootsize = encode_raw16((uint16_t)idrootsize); header->localrootsize = encode_raw16((uint16_t)localrootsize); uint8_t *root = (uint8_t*)(header + 1); encode_root(root, db->header.by_seq_root); root += seqrootsize; encode_root(root, db->header.by_id_root); root += idrootsize; encode_root(root, db->header.local_docs_root); cs_off_t pos; couchstore_error_t errcode = db_write_header(&db->file, &writebuf, &pos); if (errcode == COUCHSTORE_SUCCESS) { db->header.position = pos; } free(writebuf.buf); return errcode; }
static void test_raw_08(uint8_t value) { raw_08 raw; raw = encode_raw08(value); assert(decode_raw08(raw) == value); }