aboutsummaryrefslogtreecommitdiff
path: root/common/erase-query/driver.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-08-22 11:47:55 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-08-22 11:47:55 +0200
commit70a28c298dfe7f047c1390d097c18d5bb0618d07 (patch)
tree5983b81ce4724096565e11f8250e4c30dd548665 /common/erase-query/driver.cxx
parentab0fb8ac7e097dcdd3111dc2865f0de14ab27118 (diff)
Add database::erase_query() function
New test: common/erase-query. Documentation is in Section 3.9, "Deleting Persistent Objects". The current implementation does not work well with the session (no removal of the erased objects from the cache).
Diffstat (limited to 'common/erase-query/driver.cxx')
-rw-r--r--common/erase-query/driver.cxx117
1 files changed, 117 insertions, 0 deletions
diff --git a/common/erase-query/driver.cxx b/common/erase-query/driver.cxx
new file mode 100644
index 0000000..67d4e8d
--- /dev/null
+++ b/common/erase-query/driver.cxx
@@ -0,0 +1,117 @@
+// file : common/erase-query/driver.cxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+// Test query-based erase.
+//
+
+#include <memory> // std::auto_ptr
+#include <cassert>
+#include <iostream>
+
+#include <odb/database.hxx>
+#include <odb/transaction.hxx>
+
+#include <common/config.hxx> // @@ DATABASE_MYSQL
+#include <common/common.hxx>
+
+#include "test.hxx"
+#include "test-odb.hxx"
+
+using namespace std;
+using namespace odb::core;
+
+void
+persist (database& db)
+{
+ object o1 (1);
+ object o2 (2);
+ object o3 (3);
+ object o4 (4);
+
+ transaction t (db.begin ());
+ db.persist (o1);
+ db.persist (o2);
+ db.persist (o3);
+ db.persist (o4);
+ t.commit ();
+}
+
+int
+main (int argc, char* argv[])
+{
+ try
+ {
+ typedef odb::query<object> query;
+
+ auto_ptr<database> db (create_database (argc, argv));
+
+ // erase_query()
+ //
+ persist (*db);
+
+ {
+ transaction t (db->begin ());
+ assert (db->erase_query<object> () == 4);
+ t.commit ();
+ }
+
+ // erase_query(const char*)
+ //
+ persist (*db);
+
+ {
+ transaction t (db->begin ());
+ assert (db->erase_query<object> ("id < 3") == 2);
+ db->erase_query<object> ();
+ t.commit ();
+ }
+
+ // erase_query(query)
+ //
+ persist (*db);
+
+ {
+ transaction t (db->begin ());
+ assert (db->erase_query<object> (query::id == 2 || query::id == 4) == 2);
+ db->erase_query<object> ();
+ t.commit ();
+ }
+
+ // Make sure container data is deleted.
+ //
+ {
+ object o (1);
+ o.v.push_back (1);
+ o.v.push_back (2);
+ o.v.push_back (3);
+
+ transaction t (db->begin ());
+ db->persist (o);
+ t.commit ();
+ }
+
+ {
+ transaction t (db->begin ());
+ assert (db->erase_query<object> () == 1);
+ t.commit ();
+ }
+
+ // @@ Temporarily disabled until we have out-of-line constraints
+ // in MySQL (coming with evolution support).
+ //
+#ifndef DATABASE_MYSQL
+ {
+ transaction t (db->begin ());
+ assert (db->execute ("SELECT * FROM object_v WHERE object_id = 1") == 0);
+ t.commit ();
+ }
+#endif
+ }
+ catch (const odb::exception& e)
+ {
+ cerr << e.what () << endl;
+ return 1;
+ }
+}