void replaceWithSmallTest(void) { ham_u8_t buffer[128], buffer2[64]; ham_offset_t blobid, blobid2; ham_record_t record; ::memset(&record, 0, sizeof(record)); ::memset(&buffer, 0x12, sizeof(buffer)); ::memset(&buffer2, 0x15, sizeof(buffer2)); record.data=buffer; record.size=sizeof(buffer); BFC_ASSERT_EQUAL(0, m_blob_manager->allocate((Database *)m_db, &record, 0, &blobid)); BFC_ASSERT(blobid!=0); BFC_ASSERT_EQUAL(0, m_blob_manager->read((Database *)m_db, 0, blobid, &record, 0)); BFC_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer)); BFC_ASSERT(0==::memcmp(buffer, record.data, record.size)); record.size=sizeof(buffer2); record.data=buffer2; BFC_ASSERT_EQUAL(0, m_blob_manager->overwrite((Database *)m_db, blobid, &record, 0, &blobid2)); BFC_ASSERT(blobid2!=0); BFC_ASSERT_EQUAL(0, m_blob_manager->read((Database *)m_db, 0, blobid2, &record, 0)); BFC_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer2)); BFC_ASSERT(0==::memcmp(buffer2, record.data, record.size)); /* make sure that at least 64bit are in the freelist */ if (!m_inmemory) { ham_offset_t addr; Environment *e=(Environment *)m_env; BFC_ASSERT_EQUAL(0, e->get_freelist()->alloc_area(&addr, (Database *)m_db, 64)); BFC_ASSERT(addr!=0); } BFC_ASSERT_EQUAL(0, m_blob_manager->free((Database *)m_db, blobid2, 0)); /* and now another 64bit should be in the freelist */ if (!m_inmemory) { ham_offset_t addr; Environment *e=(Environment *)m_env; BFC_ASSERT_EQUAL(0, e->get_freelist()->alloc_area(&addr, (Database *)m_db, 64)); BFC_ASSERT(addr!=0); } }
void replaceBiggerAndBiggerTest(void) { const int BLOCKS=32; unsigned ps=((Environment *)m_env)->get_pagesize(); ham_u8_t *buffer=(ham_u8_t *)malloc(ps*BLOCKS*2); ham_offset_t blobid, blobid2; ham_record_t record; ::memset(&record, 0, sizeof(record)); ::memset(buffer, 0, ps*BLOCKS*2); /* first: create a big blob and erase it - we want to use the * space from the freelist */ record.data=buffer; record.size=ps*BLOCKS*2; BFC_ASSERT_EQUAL(0, m_blob_manager->allocate((Database *)m_db, &record, 0, &blobid)); BFC_ASSERT(blobid!=0); /* verify it */ BFC_ASSERT_EQUAL(0, m_blob_manager->read((Database *)m_db, 0, blobid, &record, 0)); BFC_ASSERT_EQUAL(record.size, (ham_size_t)ps*BLOCKS*2); /* and erase it */ BFC_ASSERT_EQUAL(0, m_blob_manager->free((Database *)m_db, blobid, 0)); /* now use a loop to allocate the buffer, and make it bigger and * bigger */ for (int i=1; i<32; i++) { record.size=i*ps; record.data=(void *)buffer; ::memset(buffer, i, record.size); if (i==1) { BFC_ASSERT_EQUAL(0, m_blob_manager->allocate((Database *)m_db, &record, 0, &blobid2)); } else { BFC_ASSERT_EQUAL(0, m_blob_manager->overwrite((Database *)m_db, blobid, &record, 0, &blobid2)); } blobid=blobid2; BFC_ASSERT(blobid!=0); } BFC_ASSERT_EQUAL(0, m_blob_manager->free((Database *)m_db, blobid, 0)); ::free(buffer); }
void replaceTest(void) { ham_u8_t buffer[64], buffer2[64]; ham_offset_t blobid, blobid2; ham_record_t record; ::memset(&record, 0, sizeof(record)); ::memset(&buffer, 0x12, sizeof(buffer)); ::memset(&buffer2, 0x15, sizeof(buffer2)); record.size=sizeof(buffer); record.data=buffer; BFC_ASSERT_EQUAL(0, m_blob_manager->allocate((Database *)m_db, &record, 0, &blobid)); BFC_ASSERT(blobid!=0); BFC_ASSERT_EQUAL(0, m_blob_manager->read((Database *)m_db, 0, blobid, &record, 0)); BFC_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer)); BFC_ASSERT(0==::memcmp(buffer, record.data, record.size)); record.size=sizeof(buffer2); record.data=buffer2; BFC_ASSERT_EQUAL(0, m_blob_manager->overwrite((Database *)m_db, blobid, &record, 0, &blobid2)); BFC_ASSERT(blobid2!=0); BFC_ASSERT_EQUAL(0, m_blob_manager->read((Database *)m_db, 0, blobid2, &record, 0)); BFC_ASSERT_EQUAL(record.size, (ham_size_t)sizeof(buffer2)); BFC_ASSERT(0==::memcmp(buffer2, record.data, record.size)); BFC_ASSERT_EQUAL(0, m_blob_manager->free((Database *)m_db, blobid2, 0)); }