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