// file : common/virtual/driver.cxx // license : GNU GPL v2; see accompanying LICENSE file // Test virtual data members. // #include // std::auto_ptr #include #include #include #include #include #include "test.hxx" #include "test-odb.hxx" #undef NDEBUG #include using namespace std; using namespace odb::core; int main (int argc, char* argv[]) { try { unique_ptr db (create_database (argc, argv)); // Test basic virtual data member functionality. // { using namespace test1; object o; o.i (123); o.c1.i = 123; o.c1.s = "abc"; o.v1.push_back ("abc"); o.v1.push_back ("abd"); o.v1.push_back ("abe"); o.p1 = new object; { transaction t (db->begin ()); db->persist (*o.p1); db->persist (o); t.commit (); } { transaction t (db->begin ()); unique_ptr p (db->load (o.id1.v)); t.commit (); assert (o == *p); } } // Test pragma resolution to virtual data member. // { using namespace test2; object1 o1 (1); o1.o2 = new object2 (1); o1.o2->o1 = &o1; { transaction t (db->begin ()); db->persist (*o1.o2); o1.n1 = o1.o2->id; db->persist (o1); t.commit (); } { session s; transaction t (db->begin ()); unique_ptr p (db->load (o1.id)); t.commit (); assert (p->o2->id == o1.o2->id); } { typedef odb::query query; typedef odb::result result; transaction t (db->begin ()); result r (db->query (query::object2::id == o1.o2->id)); result::iterator i (r.begin ()); assert (i != r.end () && i->i == o1.n1); assert (++i == r.end ()); t.commit (); } { typedef odb::query query; typedef odb::result result; transaction t (db->begin ()); result r (db->query (query::o2::id == o1.o2->id)); result::iterator i (r.begin ()); assert (i != r.end () && i->i == o1.n1); assert (++i == r.end ()); t.commit (); } { typedef odb::result result; transaction t (db->begin ()); result r (db->query ()); result::iterator i (r.begin ()); assert (i != r.end () && i->i == o1.n1); assert (++i == r.end ()); t.commit (); } } // Use virtual data members to implement multi-member composite object id. // { using namespace test3; person o; o.first_ = "John"; o.last_ = "Doe"; name id; { transaction t (db->begin ()); id = db->persist (o); t.commit (); } { transaction t (db->begin ()); unique_ptr p (db->load (id)); t.commit (); assert (o.first_ == p->first_ && o.last_ == p->last_); } } } catch (const odb::exception& e) { cerr << e.what () << endl; return 1; } }