From 0e4095ffecdc1f65a48d21730b0c8a0d96bc0c93 Mon Sep 17 00:00:00 2001
From: Boris Kolpackov <boris@codesynthesis.com>
Date: Fri, 26 Aug 2011 12:13:19 +0200
Subject: Add wrapper support for composite values

NULL semantics for composite values is not yet supported.
---
 common/wrapper/driver.cxx | 39 ++++++++++++++++++++++++-
 common/wrapper/test.hxx   | 74 ++++++++++++++++++++++++++++++++++++++++++++++-
 2 files changed, 111 insertions(+), 2 deletions(-)

(limited to 'common')

diff --git a/common/wrapper/driver.cxx b/common/wrapper/driver.cxx
index ed4d83f..32ac412 100644
--- a/common/wrapper/driver.cxx
+++ b/common/wrapper/driver.cxx
@@ -29,11 +29,15 @@ main (int argc, char* argv[])
     auto_ptr<database> db (create_database (argc, argv));
 
     //
+    // Simple values.
+    //
+
+    //
     //
     unsigned long id;
     {
       object o;
-      o.num.reset (new unsigned long (123));
+      o.num.reset (new int (123));
       o.nstrs.push_back (nullable_string ());
       o.nstrs.push_back (nullable_string ("123"));
 #ifdef HAVE_TR1_MEMORY
@@ -64,6 +68,39 @@ main (int argc, char* argv[])
       assert (*o->tr1_strs[1] == "123");
 #endif
     }
+
+    //
+    // Composite values.
+    //
+    {
+      comp_object co;
+
+      co.c1.reset (new comp1 ("123", 123));
+      co.vc1.push_back (comp1 ("1", 1));
+      co.vc1.push_back (comp1 ("2", 2));
+      co.vc1.push_back (comp1 ("3", 3));
+
+      co.c2.reset (new comp2 ("123", 123));
+      co.c2->strs.push_back ("1");
+      co.c2->strs.push_back ("2");
+      co.c2->strs.push_back ("3");
+
+      {
+        transaction t (db->begin ());
+        id = db->persist (co);
+        t.commit ();
+      }
+
+      {
+        transaction t (db->begin ());
+        auto_ptr<comp_object> o (db->load<comp_object> (id));
+        t.commit ();
+
+        assert (*o->c1 == *co.c1);
+        assert (o->vc1 == co.vc1);
+        assert (*o->c2 == *co.c2);
+      }
+    }
   }
   catch (const odb::exception& e)
   {
diff --git a/common/wrapper/test.hxx b/common/wrapper/test.hxx
index 68a8750..b28d7a0 100644
--- a/common/wrapper/test.hxx
+++ b/common/wrapper/test.hxx
@@ -21,6 +21,10 @@
 
 using odb::nullable;
 
+//
+// Simple values.
+//
+
 typedef nullable<std::string> nullable_string;
 
 #ifdef HAVE_TR1_MEMORY
@@ -33,7 +37,7 @@ struct object
   #pragma db id auto
   unsigned long id_;
 
-  std::auto_ptr<unsigned long> num;
+  std::auto_ptr<int> num;
 
   #pragma db null
   std::auto_ptr<std::string> str;
@@ -50,4 +54,72 @@ struct object
 #endif
 };
 
+//
+// Composite values.
+//
+
+#pragma db value
+struct comp1
+{
+  comp1 () {}
+  comp1 (const std::string& s, int n): str (s), num (n) {}
+
+  std::string str;
+  int num;
+};
+
+inline bool
+operator== (const comp1& x, const comp1 y)
+{
+  return x.str == y.str && x.num == y.num;
+}
+
+
+#pragma db value
+struct comp2
+{
+  comp2 () {}
+  comp2 (const std::string& s, int n): str (s), num (n) {}
+
+  std::string str;
+  int num;
+
+  std::vector<std::string> strs;
+};
+
+inline bool
+operator== (const comp2& x, const comp2 y)
+{
+  return x.str == y.str && x.num == y.num && x.strs == y.strs;
+}
+
+#pragma db object
+struct comp_object
+{
+  #pragma db id auto
+  unsigned long id_;
+
+  std::auto_ptr<comp1> c1;           // Wrapped comp value.
+  std::vector<nullable<comp1> > vc1; // Container of wrapped comp values.
+  std::auto_ptr<comp2> c2;           // Container inside wrapped comp value.
+};
+
+// This one is just a compilation test to cover more convolute cases.
+//
+#pragma db value
+struct comp3: comp2
+{
+  std::auto_ptr<comp1> c1;
+  std::vector<nullable<comp1> > vc1;
+};
+
+#pragma db object
+struct comp_object2
+{
+  #pragma db id auto
+  unsigned long id_;
+
+  std::auto_ptr<comp3> c3;
+};
+
 #endif // TEST_HXX
-- 
cgit v1.1