AW: [odb-users] Problem with session cache and weak_ptr

Marcel Nehring mne at qosmotec.com
Thu Apr 28 04:36:34 EDT 2016


Hi Boris,

I was able to reproduce the problem with ODB's original session implementation.
See the code below for a test case.

Regards,
Marcel

//sandbox.cpp
#include "sandbox.h"

#include "sandbox-odb.h"

#include <odb/oracle/database.hxx>
#include <odb/session.hxx>
#include <odb/transaction.hxx>

#include <assert.h>

int main(int argc, char ** argv)
{
    std::unique_ptr<odb::oracle::database> db = std::make_unique<odb::oracle::database>("odb", "secret", "XE", "localhost");

    std::vector<std::shared_ptr<test::employee>> employees;

    odb::session session;

    {
        odb::transaction transaction(db->begin());

        auto results(db->query<test::employee>());

        auto resultIter = results.begin();
        for (/**/; resultIter != results.end(); ++resultIter)
        {
            employees.push_back(resultIter.load());
        }

        transaction.commit();
    }

    for (const auto &emp : employees)
    {
        assert(!emp->employer.expired());
        emp->employer.reset();
    }

    employees.clear();

    {
        odb::transaction transaction(db->begin());

        auto results = db->query<test::employee>();

        auto resultIter = results.begin();
        for (/**/; resultIter != results.end(); ++resultIter)
        {
            employees.push_back(resultIter.load());
        }

        transaction.commit();
    }

    for (const auto &emp : employees)
    {
        // this assertion fails
        assert(!emp->employer.expired());
    }

    return 0;
}


//sandbox.h
#pragma once

#include <vector>
#include <memory>

#pragma db namespace pointer(std::shared_ptr) session
namespace test
{

struct employee;

#pragma db object
    struct employer
    {
#pragma db id auto
        long long id;
        std::vector<std::shared_ptr<employee>> employees;
    };

#pragma db object
    struct employee
    {
#pragma db id auto
        long long id;
        std::weak_ptr<employer> employer;
    };
}



More information about the odb-users mailing list