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 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 loopInsert(int loops, int factor) { ham_u8_t *buffer; ham_offset_t *blobid; ham_record_t record; ham_txn_t *txn = 0; /* need a txn object for the blob routines */ ::memset(&record, 0, sizeof(record)); ::memset(&buffer, 0x12, sizeof(buffer)); blobid=(ham_offset_t *)::malloc(sizeof(ham_offset_t)*loops); BFC_ASSERT(blobid!=0); if (!m_inmemory && m_use_txn) BFC_ASSERT(ham_txn_begin(&txn, m_env, 0, 0, 0)==HAM_SUCCESS); for (int i=0; i<loops; i++) { buffer=(ham_u8_t *)::malloc((i+1)*factor); BFC_ASSERT_I(buffer!=0, i); ::memset(buffer, (char)i, (i+1)*factor); ham_record_t rec={0}; rec.data=buffer; rec.size=(ham_size_t)((i+1)*factor); BFC_ASSERT_EQUAL(0, m_blob_manager->allocate((Database *)m_db, &rec, 0, &blobid[i])); BFC_ASSERT_I(blobid[i]!=0, i); ::free(buffer); } for (int i=0; i<loops; i++) { buffer=(ham_u8_t *)::malloc((i+1)*factor); BFC_ASSERT_I(buffer!=0, i); ::memset(buffer, (char)i, (i+1)*factor); BFC_ASSERT_EQUAL_I(0, m_blob_manager->read((Database *)m_db, 0, blobid[i], &record, 0), i); BFC_ASSERT_EQUAL_I(record.size, (ham_size_t)(i+1)*factor, i); BFC_ASSERT_I(0==::memcmp(buffer, record.data, record.size), i); ::free(buffer); } for (int i=0; i<loops; i++) { BFC_ASSERT_EQUAL_I(0, m_blob_manager->free((Database *)m_db, blobid[i], 0), i); } ::free(blobid); if (!m_inmemory && m_use_txn) BFC_ASSERT(ham_txn_commit(txn, 0)==HAM_SUCCESS); }
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)); }