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