From ab51fa65f9e8cad4ef5a1db85029dfe6404e9a1f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 13 Jan 2011 11:31:14 +0200 Subject: Add composite, relationship, and inverse examples All add the TR1 test for the latter two examples. --- relationship/driver.cxx | 168 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 168 insertions(+) create mode 100644 relationship/driver.cxx (limited to 'relationship/driver.cxx') diff --git a/relationship/driver.cxx b/relationship/driver.cxx new file mode 100644 index 0000000..9d09913 --- /dev/null +++ b/relationship/driver.cxx @@ -0,0 +1,168 @@ +// file : relationship/driver.cxx +// author : Boris Kolpackov +// copyright : not copyrighted - public domain + +#include // std::auto_ptr +#include + +#include +#include + +#include "database.hxx" // create_database + +#include "employee.hxx" +#include "employee-odb.hxx" + +using namespace std; +using namespace odb; + +void +print (const employee& e) +{ + cout << e.first () << " " << e.last () << endl + << " employer: " << e.employer ()->name () << endl; + + const projects& ps (e.projects ()); + + for (projects::const_iterator i (ps.begin ()); i != ps.end (); ++i) + { + shared_ptr p (*i); + cout << " project: " << p->name () << endl; + } + + cout << endl; +} + +int +main (int argc, char* argv[]) +{ + try + { + auto_ptr db (create_database (argc, argv)); + + // Create a few persistent objects. + // + { + // Simple Tech Ltd. + // + { + shared_ptr er (new employer ("Simple Tech Ltd")); + + shared_ptr sh (new project ("Simple Hardware")); + shared_ptr ss (new project ("Simple Software")); + + shared_ptr john (new employee ("John", "Doe", er)); + shared_ptr jane (new employee ("Jane", "Doe", er)); + + john->projects ().push_back (sh); + john->projects ().push_back (ss); + jane->projects ().push_back (ss); + + transaction t (db->begin ()); + + db->persist (er); + + db->persist (sh); + db->persist (ss); + + db->persist (john); + db->persist (jane); + + t.commit (); + } + + // Complex Systems Inc. + // + { + shared_ptr er (new employer ("Complex Systems Inc")); + + shared_ptr ch (new project ("Complex Hardware")); + shared_ptr cs (new project ("Complex Software")); + + shared_ptr john (new employee ("John", "Smith", er)); + shared_ptr jane (new employee ("Jane", "Smith", er)); + + john->projects ().push_back (cs); + jane->projects ().push_back (ch); + jane->projects ().push_back (cs); + + transaction t (db->begin ()); + + db->persist (er); + + db->persist (ch); + db->persist (cs); + + db->persist (john); + db->persist (jane); + + t.commit (); + } + } + + typedef odb::query query; + typedef odb::result result; + + // Load employees with "Doe" as the last name and print what we've got. + // We use a session in this and subsequent transactions to make sure + // that a single instance of any particular object (e.g., employer) is + // shared among all objects (e.g., employee) that relate to it. + // + { + session s; + transaction t (db->begin ()); + + result r (db->query (query::last == "Doe")); + + for (result::iterator i (r.begin ()); i != r.end (); ++i) + print (*i); + + t.commit (); + } + + // John Doe has moved to Complex Systems Inc and is now working on + // Complex Hardware. + // + { + session s; + transaction t (db->begin ()); + + shared_ptr csi (db->load ("Complex Systems Inc")); + shared_ptr ch (db->load ("Complex Hardware")); + + result r (db->query (query::first == "John" && + query::last == "Doe")); + + shared_ptr john (r.begin ().load ()); + + john->employer (csi); + john->projects ().clear (); + john->projects ().push_back (ch); + + db->update (john); + + t.commit (); + } + + // We can also use members of the pointed-to objects in the queries. The + // following transaction prints all the employees of Complex Systems Inc. + // + { + session s; + transaction t (db->begin ()); + + result r (db->query ( + query::employer::name == "Complex Systems Inc")); + + for (result::iterator i (r.begin ()); i != r.end (); ++i) + print (*i); + + t.commit (); + } + } + catch (const odb::exception& e) + { + cerr << e.what () << endl; + return 1; + } +} -- cgit v1.1