aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-04-27 11:36:43 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-04-27 11:36:43 +0200
commitc8458a266eb258cf61b1e66066c72a2dc0f0ad8b (patch)
treec51449d2e0ad3100d80eedb91178e55264d13882
parent6a3ddb6bd80f3c0c4d7b6957cb7be1f3d8713720 (diff)
Add support for NULL pointers to objects with composite object ids
-rw-r--r--common/composite-id/driver.cxx71
-rw-r--r--common/composite-id/test.hxx54
2 files changed, 124 insertions, 1 deletions
diff --git a/common/composite-id/driver.cxx b/common/composite-id/driver.cxx
index 2066335..8a230eb 100644
--- a/common/composite-id/driver.cxx
+++ b/common/composite-id/driver.cxx
@@ -624,6 +624,77 @@ main (int argc, char* argv[])
}
}
+ // Test 8.
+ //
+ {
+ using namespace test8;
+
+ object2 o2a, o2b;
+ object3 o3;
+
+ o2b.o1 = new object1 (scomp ("222", "aaa", "bbb"), 123);
+ o3.o1.push_back (0);
+ o3.o1.push_back (new object1 (scomp ("333", "aaa", "bbb"), 234));
+
+ // Persist.
+ //
+ {
+ transaction t (db->begin ());
+ db->persist (o2a);
+ db->persist (o2b);
+ db->persist (o2b.o1);
+ db->persist (o3);
+ db->persist (o3.o1[1]);
+ t.commit ();
+ }
+
+ // Load.
+ //
+ {
+ transaction t (db->begin ());
+ auto_ptr<object2> p2a (db->load<object2> (o2a.id));
+ auto_ptr<object2> p2b (db->load<object2> (o2b.id));
+ auto_ptr<object3> p3 (db->load<object3> (o3.id));
+ t.commit ();
+
+ assert (p2a->o1 == 0);
+ assert (p2b->o1 != 0 && *p2b->o1 == *o2b.o1);
+ assert (p3->o1[0] == 0);
+ assert (p3->o1[1] != 0 && *p3->o1[1] == *o3.o1[1]);
+ }
+
+ // Update.
+ //
+ {
+ object1* o1 (o3.o1[1]);
+
+ o3.o1.clear ();
+ o3.o1.push_back (o2b.o1);
+ o3.o1.push_back (0);
+
+ o2a.o1 = o1;
+ o2b.o1 = 0;
+
+ transaction t (db->begin ());
+ db->update (o2a);
+ db->update (o2b);
+ db->update (o3);
+ t.commit ();
+ }
+
+ {
+ transaction t (db->begin ());
+ auto_ptr<object2> p2a (db->load<object2> (o2a.id));
+ auto_ptr<object2> p2b (db->load<object2> (o2b.id));
+ auto_ptr<object3> p3 (db->load<object3> (o3.id));
+ t.commit ();
+
+ assert (p2a->o1 != 0 && *p2a->o1 == *o2a.o1);
+ assert (p2b->o1 == 0);
+ assert (p3->o1[0] != 0 && *p3->o1[0] == *o3.o1[0]);
+ assert (p3->o1[1] == 0);
+ }
+ }
}
catch (const odb::exception& e)
{
diff --git a/common/composite-id/test.hxx b/common/composite-id/test.hxx
index 512c980..9c2b2b3 100644
--- a/common/composite-id/test.hxx
+++ b/common/composite-id/test.hxx
@@ -414,8 +414,60 @@ namespace test7
inline bool
operator== (const object& x, const object& y)
{
- return x.id == y.id && x.ver == y.ver && x.num == y.num ;
+ return x.id == y.id && x.ver == y.ver && x.num == y.num;
}
}
+// Test composite NULL pointers.
+//
+#pragma db namespace table("t8_")
+namespace test8
+{
+ #pragma db object
+ struct object1
+ {
+ object1 () {}
+ object1 (scomp const& i, unsigned long n): id (i), num (n) {}
+
+ #pragma db id
+ scomp id;
+
+ unsigned long num;
+ };
+
+ inline bool
+ operator== (const object1& x, const object1& y)
+ {
+ return x.id == y.id && x.num == y.num;
+ }
+
+ #pragma db object
+ struct object2
+ {
+ object2 (): o1 (0) {}
+ ~object2 () {delete o1;}
+
+ #pragma db id auto
+ unsigned long id;
+
+ object1* o1;
+ };
+
+ #pragma db object
+ struct object3
+ {
+ ~object3 ()
+ {
+ for (std::vector<object1*>::iterator i (o1.begin ());
+ i != o1.end (); ++i)
+ delete *i;
+ }
+
+ #pragma db id auto
+ unsigned long id;
+
+ std::vector<object1*> o1;
+ };
+}
+
#endif // TEST_HXX