Bug #3511 ยป 0001-Fix-for-dbo-ptr_tuples-without-version-fields.patch
| src/Wt/Dbo/Session_impl.h | ||
|---|---|---|
|
* dbo_test4c.
|
||
|
*/
|
||
|
if (!statement->getResult(column++, &id)) {
|
||
|
column += (int)mapping->fields.size() + 1; // + version
|
||
|
column += (int)mapping->fields.size() + !!mapping->versionFieldName;
|
||
|
return ptr<C>();
|
||
|
}
|
||
| ... | ... | |
|
if (!i->second->isLoaded())
|
||
|
implLoad<C>(*i->second, statement, column);
|
||
|
else
|
||
|
column += (int)mapping->fields.size() + 1; // + version
|
||
|
column += (int)mapping->fields.size() + !!mapping->versionFieldName;
|
||
|
return ptr<C>(i->second);
|
||
|
}
|
||
| test/dbo/DboTest.C | ||
|---|---|---|
|
class B;
|
||
|
class C;
|
||
|
class D;
|
||
|
class E;
|
||
|
bool fractionalSeconds = true;
|
||
| ... | ... | |
|
session_->mapClass<B>(SCHEMA "table_b");
|
||
|
session_->mapClass<C>(SCHEMA "table_c");
|
||
|
session_->mapClass<D>(SCHEMA "table_d");
|
||
|
session_->mapClass<E>(SCHEMA "table_e");
|
||
|
try {
|
||
|
session_->dropTables();
|
||
| ... | ... | |
|
static const char *versionField() { return 0; }
|
||
|
};
|
||
|
template<>
|
||
|
struct dbo_traits<E> : public dbo_default_traits
|
||
|
{
|
||
|
static const char *versionField() { return 0; }
|
||
|
};
|
||
|
}
|
||
|
}
|
||
| ... | ... | |
|
}
|
||
|
};
|
||
|
class E {
|
||
|
public:
|
||
|
std::string name;
|
||
|
E() { }
|
||
|
E(const std::string& aName)
|
||
|
: name(aName)
|
||
|
{ }
|
||
|
bool operator== (const E& other) const {
|
||
|
return name == other.name;
|
||
|
}
|
||
|
template <class Action>
|
||
|
void persist(Action& a)
|
||
|
{
|
||
|
dbo::field(a, name, "name", 1000);
|
||
|
}
|
||
|
};
|
||
|
BOOST_AUTO_TEST_CASE( dbo_test1 )
|
||
|
{
|
||
|
DboFixture f;
|
||
| ... | ... | |
|
}
|
||
|
#endif //POSTGRES
|
||
|
}
|
||
|
BOOST_AUTO_TEST_CASE( dbo_test23 )
|
||
|
{
|
||
|
DboFixture f;
|
||
|
dbo::Session *session_ = f.session_;
|
||
|
{
|
||
|
dbo::Transaction t(*session_);
|
||
|
dbo::ptr<E> e1(new E("e1"));
|
||
|
dbo::ptr<C> c1(new C("c1"));
|
||
|
session_->add(e1);
|
||
|
session_->add(c1);
|
||
|
/*
|
||
|
* Note: E has no versionField
|
||
|
*/
|
||
|
typedef dbo::ptr_tuple<E, C>::type EC;
|
||
|
EC ec = session_->query< EC >
|
||
|
("select E, C from \"table_e\" E, \"table_c\" C");
|
||
|
BOOST_REQUIRE(ec.get<0>()->name == "e1");
|
||
|
BOOST_REQUIRE(ec.get<1>()->name == "c1");
|
||
|
}
|
||
|
}
|
||
|
BOOST_AUTO_TEST_CASE( dbo_test24 )
|
||
|
{
|
||
|
DboFixture f;
|
||
|
dbo::Session *session_ = f.session_;
|
||
|
{
|
||
|
dbo::Transaction t(*session_);
|
||
|
#ifdef POSTGRES
|
||
|
dbo::ptr<E> e1(new E("e1"));
|
||
|
session_->add(e1);
|
||
|
/*
|
||
|
* Note: E has no versionField, right join will result in E1 as null
|
||
|
*/
|
||
|
typedef dbo::ptr_tuple<E, E>::type EE;
|
||
|
EE ee = session_->query< EE >
|
||
|
("select \"E1\", \"E2\" from \"table_e\" \"E1\" "
|
||
|
"right join \"table_e\" \"E2\" on \"E1\".id != \"E2\".id");
|
||
|
BOOST_REQUIRE(ee.get<1>()->name == "e1");
|
||
|
#endif //POSTGRES
|
||
|
}
|
||
|
}
|
||
|
BOOST_AUTO_TEST_CASE( dbo_test25 )
|
||
|
{
|
||
|
DboFixture f;
|
||
|
dbo::Session *session_ = f.session_;
|
||
|
{
|
||
|
dbo::Transaction t(*session_);
|
||
|
dbo::ptr<D> d1(new D(Coordinate(42, 43), "d1"));
|
||
|
dbo::ptr<C> c1(new C("c1"));
|
||
|
session_->add(d1);
|
||
|
session_->add(c1);
|
||
|
/*
|
||
|
* Note: D has no versionField
|
||
|
*/
|
||
|
typedef dbo::ptr_tuple<D, C>::type DC;
|
||
|
DC dc = session_->query< DC >
|
||
|
("select D, C from \"table_d\" D, \"table_c\" C");
|
||
|
BOOST_REQUIRE(dc.get<0>()->name == "d1");
|
||
|
BOOST_REQUIRE(dc.get<1>()->name == "c1");
|
||
|
}
|
||
|
}
|
||