Пример #1
0
    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);
        }
    }
Пример #2
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);
    }
Пример #3
0
    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));
    }