예제 #1
0
TEST(AdminPolicyParser, parse0) {
    auto input = std::make_shared<std::stringstream>();

    Cynara::CynaraAdminPolicies expectedPolicies;
    expectedPolicies.seal();

    auto policies = Cynara::AdminPolicyParser::parse(*input, translatePolicy);

    ASSERT_TRUE(policies.sealed());
    ASSERT_THAT(policies.data(), AdmPolicyListEq(expectedPolicies.data()));
}
예제 #2
0
void RowStoreScanProcessor::process() {
    for (auto i = pageIdx; i < pageEndIdx; ++i) {
        for (auto& ptr : *pages[i]) {
            processMainRecord(&ptr);
        }
    }
    for (auto insIter = logIter; insIter != logEnd; ++insIter) {
        if (!insIter->sealed()) {
            continue;
        }
        processInsertRecord(reinterpret_cast<const InsertLogEntry*>(insIter->data()));
    }
}
예제 #3
0
TEST(AdminPolicyParser, parse1) {
    auto input = std::make_shared<std::stringstream>();

    *input << "b;c;u;p;0;m" << std::endl;

    Cynara::CynaraAdminPolicies expectedPolicies;
    expectedPolicies.add("b", { 0, "m" }, { "c", "u", "p" });
    expectedPolicies.seal();

    auto policies = Cynara::AdminPolicyParser::parse(*input, translatePolicy);

    ASSERT_TRUE(policies.sealed());
    ASSERT_THAT(policies.data(), AdmPolicyListEq(expectedPolicies.data()));
}
예제 #4
0
TEST(AdminPolicyParser, parse2) {
    auto input = std::make_shared<std::stringstream>();

    *input << "b1;c1;u1;p1;0;m1" << std::endl;
    *input << "b2;c2;u2;p2;0;m2" << std::endl;

    Cynara::CynaraAdminPolicies expectedPolicies;
    expectedPolicies.add("b1", { 0, "m1" }, { "c1", "u1", "p1" });
    expectedPolicies.add("b2", { 0, "m2" }, { "c2", "u2", "p2" });
    expectedPolicies.seal();

    auto policies = Cynara::AdminPolicyParser::parse(*input, translatePolicy);

    ASSERT_TRUE(policies.sealed());
    ASSERT_THAT(policies.data(), AdmPolicyListEq(expectedPolicies.data()));
}
void ColumnMapScanProcessor::process() {
    for (auto i = pageIdx; i < pageEndIdx; ++i) {
        processMainPage(pages[i], 0, pages[i]->count);
    }

    auto insIter = logIter;
    while (insIter != logEnd) {
        if (!insIter->sealed()) {
            ++insIter;
            continue;
        }

        auto ptr = reinterpret_cast<const InsertLogEntry*>(insIter->data());
        ConstInsertRecord record(ptr);
        if (!record.valid()) {
            ++insIter;
            continue;
        }

        if (auto relocated = reinterpret_cast<const ColumnMapMainEntry*>(newestMainRecord(record.newest()))) {
            auto relocatedPage = mContext.pageFromEntry(relocated);
            auto relocatedStartIdx = ColumnMapContext::pageIndex(relocatedPage, relocated);
            auto relocatedEndIdx = relocatedStartIdx;

            for (++insIter; insIter != logEnd; ++insIter) {
                if (!insIter->sealed()) {
                    continue;
                }

                ptr = reinterpret_cast<const InsertLogEntry*>(insIter->data());
                record = ConstInsertRecord(ptr);

                relocated = reinterpret_cast<const ColumnMapMainEntry*>(newestMainRecord(record.newest()));
                if (relocated) {
                    if (mContext.pageFromEntry(relocated) != relocatedPage) {
                        break;
                    }
                    relocatedEndIdx = ColumnMapContext::pageIndex(relocatedPage, relocated);
                } else if (!record.valid()) {
                    continue;
                } else {
                    break;
                }
            }

            auto relocatedEntries = relocatedPage->entryData();
            auto key = relocatedEntries[relocatedEndIdx].key;
            for (++relocatedEndIdx; relocatedEndIdx < relocatedPage->count && relocatedEntries[relocatedEndIdx].key == key; ++relocatedEndIdx);

            processMainPage(relocatedPage, relocatedStartIdx, relocatedEndIdx);

            continue;
        }

        auto validTo = std::numeric_limits<uint64_t>::max();
        if (record.newest() != 0u) {
            auto lowestVersion = processUpdateRecord(reinterpret_cast<const UpdateLogEntry*>(record.newest()),
                    record.baseVersion(), validTo);

            if (ptr->version >= lowestVersion) {
                ++insIter;
                continue;
            }
        }
        auto entry = LogEntry::entryFromData(reinterpret_cast<const char*>(ptr));
        processRowRecord(ptr->key, ptr->version, validTo, ptr->data(), entry->size() - sizeof(InsertLogEntry));
        ++insIter;
    }
}