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