From b79afa6dbea19905b2a035365274616dd1dae2b1 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 22 Aug 2011 11:47:55 +0200 Subject: 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). --- odb/relational/header.hxx | 13 ++++++- odb/relational/pgsql/header.cxx | 3 +- odb/relational/pgsql/source.cxx | 28 ++++++++++----- odb/relational/source.hxx | 77 +++++++++++++++++++++++++++++++---------- 4 files changed, 92 insertions(+), 29 deletions(-) (limited to 'odb') diff --git a/odb/relational/header.hxx b/odb/relational/header.hxx index ceca095..49de640 100644 --- a/odb/relational/header.hxx +++ b/odb/relational/header.hxx @@ -948,7 +948,12 @@ namespace relational << "static const char* const erase_statement;"; if (options.generate_query ()) - os << "static const char* const query_clause;"; + { + os << "static const char* const query_clause;" + << "static const char* const erase_query_clause;" + << endl + << "static const char* const table_name;"; + } os << endl; @@ -999,11 +1004,17 @@ namespace relational // query () // if (options.generate_query ()) + { os << "template" << endl << "static result" << endl << "query (database&, const query_type&);" << endl; + os << "static unsigned long long" << endl + << "erase_query (database&, const query_type&);" + << endl; + } + // create_schema () // if (embedded_schema) diff --git a/odb/relational/pgsql/header.cxx b/odb/relational/pgsql/header.cxx index 64b02d8..edf9355 100644 --- a/odb/relational/pgsql/header.cxx +++ b/odb/relational/pgsql/header.cxx @@ -36,7 +36,8 @@ namespace relational // Query statement name. // if (options.generate_query ()) - os << "static const char* const query_statement_name;"; + os << "static const char* const query_statement_name;" + << "static const char* const erase_query_statement_name;"; os << endl; diff --git a/odb/relational/pgsql/source.cxx b/odb/relational/pgsql/source.cxx index 83aa8c4..bfc26ba 100644 --- a/odb/relational/pgsql/source.cxx +++ b/odb/relational/pgsql/source.cxx @@ -873,6 +873,10 @@ namespace relational { os << name_decl << endl << "query_statement_name = " << strlit (fn + "_query") << ";" + << endl + << name_decl << endl + << "erase_query_statement_name = " << + strlit (fn + "_erase_query") << ";" << endl; } @@ -936,21 +940,29 @@ namespace relational } virtual void - query_statement_ctor (type& c) + query_statement_ctor_args (type&) { - string const& type (c.fq_name ()); - string traits ("access::object_traits< " + type + " >"); - - os << "select_statement (" << endl - << "sts.connection ()," << endl + os << "sts.connection ()," << endl << "query_statement_name," << endl - << "query_clause + q.clause ()," << endl + << "query_clause + q.clause (table_name)," << endl << "q.parameter_types ()," << endl << "q.parameter_count ()," << endl << "q.parameters_binding ()," << endl - << "imb)"; + << "imb"; + } + + virtual void + erase_query_statement_ctor_args (type&) + { + os << "conn," << endl + << "erase_query_statement_name," << endl + << "erase_query_clause + q.clause (table_name)," << endl + << "q.parameter_types ()," << endl + << "q.parameter_count ()," << endl + << "q.parameters_binding ()"; } + virtual void post_query_ (type&) { diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx index 9289206..14589ac 100644 --- a/odb/relational/source.hxx +++ b/odb/relational/source.hxx @@ -1872,13 +1872,20 @@ namespace relational } virtual void - query_statement_ctor (type&) + query_statement_ctor_args (type&) { - os << "select_statement (" << endl - << "sts.connection ()," << endl - << "query_clause + q.clause ()," << endl + os << "sts.connection ()," << endl + << "query_clause + q.clause (table_name)," << endl << "q.parameters_binding ()," << endl - << "imb)"; + << "imb"; + } + + virtual void + erase_query_statement_ctor_args (type&) + { + os << "conn," << endl + << "erase_query_clause + q.clause (table_name)," << endl + << "q.parameters_binding ()"; } virtual void @@ -2147,10 +2154,10 @@ namespace relational << endl; } - // query_clause - // if (options.generate_query ()) { + // query_clause + // bool t (true); instance oj (c, t); //@@ (im)perfect forwarding oj->traverse (c); @@ -2170,6 +2177,18 @@ namespace relational oj->write (); os << strlit (" ") << ";" << endl; + + // erase_query_clause + // + os << "const char* const " << traits << "::erase_query_clause =" << endl + << strlit ("DELETE FROM " + table + " ") << ";" + << endl; + + // table_name + // + os << "const char* const " << traits << "::table_name =" << endl + << strlit (table) << ";" + << endl; } // persist () @@ -2180,7 +2199,7 @@ namespace relational << "{" << "using namespace " << db << ";" << endl - << "connection& conn (" << db << + << db << "::connection& conn (" << db << "::transaction::current ().connection ());" << "object_statements< object_type >& sts (" << endl << "conn.statement_cache ().find ());" @@ -2242,7 +2261,7 @@ namespace relational << "{" << "using namespace " << db << ";" << endl - << "connection& conn (" << db << + << db << "::connection& conn (" << db << "::transaction::current ().connection ());" << "object_statements< object_type >& sts (" << endl << "conn.statement_cache ().find ());" @@ -2294,7 +2313,7 @@ namespace relational << "{" << "using namespace " << db << ";" << endl - << "connection& conn (" << db << + << db << "::connection& conn (" << db << "::transaction::current ().connection ());" << "object_statements< object_type >& sts (" << endl << "conn.statement_cache ().find ());" @@ -2341,7 +2360,7 @@ namespace relational << "{" << "using namespace " << db << ";" << endl - << "connection& conn (" << db << + << db << "::connection& conn (" << db << "::transaction::current ().connection ());" << "object_statements< object_type >& sts (" << endl << "conn.statement_cache ().find ());" @@ -2383,7 +2402,7 @@ namespace relational << "{" << "using namespace " << db << ";" << endl - << "connection& conn (" << db << + << db << "::connection& conn (" << db << "::transaction::current ().connection ());" << "object_statements< object_type >& sts (" << endl << "conn.statement_cache ().find ());" @@ -2487,10 +2506,10 @@ namespace relational os << "}"; } - // query () - // if (options.generate_query ()) { + // query () + // os << "template<>" << endl << "result< " << traits << "::object_type >" << endl << traits << "::" << endl @@ -2500,7 +2519,7 @@ namespace relational << "{" << "using namespace " << db << ";" << endl - << "connection& conn (" << db << + << db << "::connection& conn (" << db << "::transaction::current ().connection ());" << endl << "object_statements< object_type >& sts (" << endl @@ -2524,7 +2543,7 @@ namespace relational << "{" << "using namespace " << db << ";" << endl - << "connection& conn (" << db << + << db << "::connection& conn (" << db << "::transaction::current ().connection ());" << endl << "object_statements< object_type >& sts (" << endl @@ -2556,16 +2575,36 @@ namespace relational << "sts.out_image_version (im.version);" << "imb.version++;" << "}" - << "st.reset (new (odb::details::shared) "; + << "st.reset (new (odb::details::shared) select_statement (" + << endl; - query_statement_ctor (c); + query_statement_ctor_args (c); - os << ");" << endl + os << "));" << endl << "st->execute ();"; post_query_ (c); os << "}"; + + // erase_query + // + os << "unsigned long long " << traits << "::" << endl + << "erase_query (database&, const query_type& q)" + << "{" + << "using namespace " << db << ";" + << endl + << db << "::connection& conn (" << db << + "::transaction::current ().connection ());" + << endl + << "delete_statement st (" << endl; + + erase_query_statement_ctor_args (c); + + os << ");" + << endl + << "return st.execute ();" + << "}"; } if (embedded_schema) -- cgit v1.1