aboutsummaryrefslogtreecommitdiff
path: root/common/erase-query
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
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')
-rw-r--r--common/erase-query/driver.cxx117
-rw-r--r--common/erase-query/makefile109
-rw-r--r--common/erase-query/test.hxx31
-rw-r--r--common/erase-query/test.std0
4 files changed, 257 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;
+ }
+}
diff --git a/common/erase-query/makefile b/common/erase-query/makefile
new file mode 100644
index 0000000..a31aeab
--- /dev/null
+++ b/common/erase-query/makefile
@@ -0,0 +1,109 @@
+# file : common/erase-query/makefile
+# author : Boris Kolpackov <boris@codesynthesis.com>
+# copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+# license : GNU GPL v2; see accompanying LICENSE file
+
+include $(dir $(lastword $(MAKEFILE_LIST)))../../build/bootstrap.make
+
+cxx_tun := driver.cxx
+odb_hdr := test.hxx
+cxx_obj := $(addprefix $(out_base)/,$(cxx_tun:.cxx=.o) $(odb_hdr:.hxx=-odb.o))
+cxx_od := $(cxx_obj:.o=.o.d)
+
+common.l := $(out_root)/libcommon/common/common.l
+common.l.cpp-options := $(out_root)/libcommon/common/common.l.cpp-options
+
+driver := $(out_base)/driver
+dist := $(out_base)/.dist
+test := $(out_base)/.test
+clean := $(out_base)/.clean
+
+# Import.
+#
+$(call import,\
+ $(scf_root)/import/odb/stub.make,\
+ odb: odb,odb-rules: odb_rules)
+
+# Build.
+#
+$(driver): $(cxx_obj) $(common.l)
+$(cxx_obj) $(cxx_od): cpp_options := -I$(out_base) -I$(src_base)
+$(cxx_obj) $(cxx_od): $(common.l.cpp-options)
+
+genf := $(addprefix $(odb_hdr:.hxx=-odb),.hxx .ixx .cxx) $(odb_hdr:.hxx=.sql)
+gen := $(addprefix $(out_base)/,$(genf))
+
+$(gen): $(odb)
+$(gen): odb := $(odb)
+$(gen) $(dist): export odb_options += --database $(db_id) --generate-schema \
+--generate-query
+$(gen): cpp_options := -I$(src_base)
+$(gen): $(common.l.cpp-options)
+
+$(call include-dep,$(cxx_od),$(cxx_obj),$(gen))
+
+# Alias for default target.
+#
+$(out_base)/: $(driver)
+
+# Dist
+#
+name := $(subst /,-,$(subst $(src_root)/common/,,$(src_base)))
+
+$(dist): db_id := @database@
+$(dist): sources := $(cxx_tun)
+$(dist): headers := $(odb_hdr)
+$(dist): data_dist := test.std
+$(dist): export name := $(name)
+$(dist): export extra_dist := $(data_dist) $(call vc9projs,$(name)) \
+$(call vc10projs,$(name))
+$(dist):
+ $(call dist-data,$(sources) $(headers) $(data_dist))
+ $(call meta-automake,../template/Makefile.am)
+ $(call meta-vc9projs,../template/template,$(name))
+ $(call meta-vc10projs,../template/template,$(name))
+
+# Test.
+#
+$(test): $(driver) $(src_base)/test.std
+ $(call schema)
+ $(call message,test $<,$< --options-file $(dcf_root)/db.options \
+>$(out_base)/test.out)
+ $(call message,,diff -u $(src_base)/test.std $(out_base)/test.out)
+ $(call message,,rm -f $(out_base)/test.out)
+
+# Clean.
+#
+$(clean): \
+ $(driver).o.clean \
+ $(addsuffix .cxx.clean,$(cxx_obj)) \
+ $(addsuffix .cxx.clean,$(cxx_od)) \
+ $(addprefix $(out_base)/,$(odb_hdr:.hxx=-odb.cxx.hxx.clean))
+ $(call message,,rm -f $(out_base)/test.out)
+
+# Generated .gitignore.
+#
+ifeq ($(out_base),$(src_base))
+$(driver): | $(out_base)/.gitignore
+
+$(out_base)/.gitignore: files := driver $(genf)
+$(clean): $(out_base)/.gitignore.clean
+
+$(call include,$(bld_root)/git/gitignore.make)
+endif
+
+# How to.
+#
+$(call include,$(bld_root)/dist.make)
+$(call include,$(bld_root)/meta/vc9proj.make)
+$(call include,$(bld_root)/meta/vc10proj.make)
+$(call include,$(bld_root)/meta/automake.make)
+
+$(call include,$(odb_rules))
+$(call include,$(bld_root)/cxx/cxx-d.make)
+$(call include,$(bld_root)/cxx/cxx-o.make)
+$(call include,$(bld_root)/cxx/o-e.make)
+
+# Dependencies.
+#
+$(call import,$(src_root)/libcommon/makefile)
diff --git a/common/erase-query/test.hxx b/common/erase-query/test.hxx
new file mode 100644
index 0000000..be5539f
--- /dev/null
+++ b/common/erase-query/test.hxx
@@ -0,0 +1,31 @@
+// file : common/erase-query/test.hxx
+// author : Boris Kolpackov <boris@codesynthesis.com>
+// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC
+// license : GNU GPL v2; see accompanying LICENSE file
+
+#ifndef TEST_HXX
+#define TEST_HXX
+
+#include <vector>
+
+#include <odb/core.hxx>
+
+#pragma db object
+struct object
+{
+ object (unsigned long id)
+ : id_ (id)
+ {
+ }
+
+ object ()
+ {
+ }
+
+ #pragma db id
+ unsigned long id_;
+
+ std::vector<int> v;
+};
+
+#endif // TEST_HXX
diff --git a/common/erase-query/test.std b/common/erase-query/test.std
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/common/erase-query/test.std