diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-08-26 12:13:19 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-08-28 14:15:45 +0200 |
commit | 0e4095ffecdc1f65a48d21730b0c8a0d96bc0c93 (patch) | |
tree | e6497bdbd52b112e44f41c2f8d5a83815e1cf4c8 /common | |
parent | 70ed1235b68bf7a36cfefabf0aa078608c83dfd1 (diff) |
Add wrapper support for composite values
NULL semantics for composite values is not yet supported.
Diffstat (limited to 'common')
-rw-r--r-- | common/wrapper/driver.cxx | 39 | ||||
-rw-r--r-- | common/wrapper/test.hxx | 74 |
2 files changed, 111 insertions, 2 deletions
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 |