From ec780ddf732bbed6cc8fca711d01bfc38b53a435 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 18 Nov 2010 14:58:20 +0200 Subject: Split object image binding into in and out variants --- odb/context.cxx | 33 ++++++++++++++++++++++-------- odb/context.hxx | 5 ++++- odb/mysql/header.cxx | 14 +++++++------ odb/mysql/source.cxx | 58 +++++++++++++++++++++++++++------------------------- 4 files changed, 66 insertions(+), 44 deletions(-) (limited to 'odb') diff --git a/odb/context.cxx b/odb/context.cxx index 285d610..436b60f 100644 --- a/odb/context.cxx +++ b/odb/context.cxx @@ -305,21 +305,23 @@ namespace { struct column_count_impl: object_members_base { - column_count_impl () - : count_ (0) + column_count_impl (bool out) + : out_ (out), count_ (0) { } virtual void traverse (semantics::class_& c) { - if (c.count ("column-count")) - count_ += c.get ("column-count"); + char const* key (out_ ? "out-column-count" : "in-column-count"); + + if (c.count (key)) + count_ += c.get (key); else { size_t n (count_); object_members_base::traverse (c); - c.set ("column-count", count_ - n); + c.set (key, count_ - n); } } @@ -330,20 +332,33 @@ namespace } private: + bool out_; size_t count_; }; } size_t context:: -column_count (semantics::class_& c) +in_column_count (semantics::class_& c) +{ + if (!c.count ("in-column-count")) + { + column_count_impl t (false); + t.traverse (c); + } + + return c.get ("in-column-count"); +} + +size_t context:: +out_column_count (semantics::class_& c) { - if (!c.count ("column-count")) + if (!c.count ("out-column-count")) { - column_count_impl t; + column_count_impl t (true); t.traverse (c); } - return c.get ("column-count"); + return c.get ("out-column-count"); } namespace diff --git a/odb/context.hxx b/odb/context.hxx index 2703380..4d6dd10 100644 --- a/odb/context.hxx +++ b/odb/context.hxx @@ -136,7 +136,10 @@ public: // public: static size_t - column_count (semantics::class_&); + in_column_count (semantics::class_&); + + static size_t + out_column_count (semantics::class_&); semantics::data_member& id_member (semantics::class_&); diff --git a/odb/mysql/header.cxx b/odb/mysql/header.cxx index b555344..bedf2c9 100644 --- a/odb/mysql/header.cxx +++ b/odb/mysql/header.cxx @@ -286,7 +286,7 @@ namespace mysql size_t n; if (class_* kc = comp_value (*kt)) - n = column_count (*kc); + n = in_column_count (*kc); else n = 1; @@ -300,7 +300,7 @@ namespace mysql // Value is also a key. // if (class_* vc = comp_value (vt)) - cond_columns += column_count (*vc); + cond_columns += in_column_count (*vc); else cond_columns++; @@ -309,7 +309,7 @@ namespace mysql } if (class_* vc = comp_value (vt)) - data_columns += column_count (*vc); + data_columns += in_column_count (*vc); else data_columns++; @@ -743,8 +743,10 @@ namespace mysql // column_count // - os << "static const std::size_t column_count = " << - column_count (c) << "UL;" + os << "static const std::size_t in_column_count = " << + in_column_count (c) << "UL;" + << "static const std::size_t out_column_count = " << + out_column_count (c) << "UL;" << endl; // Statements. @@ -794,7 +796,7 @@ namespace mysql // bind (image_type) // os << "static void" << endl - << "bind (MYSQL_BIND*, image_type&);" + << "bind (MYSQL_BIND*, image_type&, bool);" << endl; // bind (id_image_type) diff --git a/odb/mysql/source.cxx b/odb/mysql/source.cxx index 78d9e0c..8bc8969 100644 --- a/odb/mysql/source.cxx +++ b/odb/mysql/source.cxx @@ -138,7 +138,7 @@ namespace mysql if (container (mi.t)) return; else if (semantics::class_* c = comp_value (mi.t)) - index_ += column_count (*c); + index_ += in_column_count (*c); else index_++; } @@ -301,7 +301,7 @@ namespace mysql " >::bind (b + " << index_ << "UL, i);" << endl; - index_ += column_count (c); + index_ += in_column_count (c); } private: @@ -350,7 +350,7 @@ namespace mysql if (container (mi.t)) return; else if (semantics::class_* c = comp_value (mi.t)) - index_ += column_count (*c); + index_ += in_column_count (*c); else index_++; } @@ -475,7 +475,7 @@ namespace mysql << "grew = true;" << "}"; - index_ += column_count (c); + index_ += in_column_count (c); } private: @@ -2022,7 +2022,7 @@ namespace mysql os << "\"" << endl << "\") VALUES ("; - for (size_t i (0), n (column_count (c)); i < n; ++i) + for (size_t i (0), n (in_column_count (c)); i < n; ++i) os << (i != 0 ? "," : "") << '?'; os << ")\";" @@ -2100,8 +2100,10 @@ namespace mysql // bind (image_type) // os << "void " << traits << "::" << endl - << "bind (MYSQL_BIND* b, image_type& i)" - << "{"; + << "bind (MYSQL_BIND* b, image_type& i, bool out)" + << "{" + << "ODB_POTENTIALLY_UNUSED (out);" + << endl; index_ = 0; inherits (c, bind_base_inherits_); @@ -2160,7 +2162,7 @@ namespace mysql << "object_statements& sts (" << endl << "conn.statement_cache ().find ());" << "image_type& im (sts.image ());" - << "binding& imb (sts.image_binding ());" + << "binding& imb (sts.in_image_binding ());" << endl; if (auto_id) @@ -2168,10 +2170,10 @@ namespace mysql os << "init (im, obj);" << endl - << "if (im.version != sts.image_version () || imb.version == 0)" + << "if (im.version != sts.in_image_version () || imb.version == 0)" << "{" - << "bind (imb.bind, im);" - << "sts.image_version (im.version);" + << "bind (imb.bind, im, false);" + << "sts.in_image_version (im.version);" << "imb.version++;" << "}" << "insert_statement& st (sts.persist_statement ());" @@ -2246,13 +2248,13 @@ namespace mysql // Initialize data image. // os << "image_type& im (sts.image ());" - << "binding& imb (sts.image_binding ());" + << "binding& imb (sts.in_image_binding ());" << "init (im, obj);" << endl - << "if (im.version != sts.image_version () || imb.version == 0)" + << "if (im.version != sts.in_image_version () || imb.version == 0)" << "{" - << "bind (imb.bind, im);" - << "sts.image_version (im.version);" + << "bind (imb.bind, im, false);" + << "sts.in_image_version (im.version);" << "imb.version++;" << "}" << "sts.update_statement ().execute ();"; @@ -2406,12 +2408,12 @@ namespace mysql // Rebind data image. // os << "image_type& im (sts.image ());" - << "binding& imb (sts.image_binding ());" + << "binding& imb (sts.out_image_binding ());" << endl - << "if (im.version != sts.image_version () || imb.version == 0)" + << "if (im.version != sts.out_image_version () || imb.version == 0)" << "{" - << "bind (imb.bind, im);" - << "sts.image_version (im.version);" + << "bind (imb.bind, im, true);" + << "sts.out_image_version (im.version);" << "imb.version++;" << "}" << "select_statement& st (sts.find_statement ());" @@ -2422,12 +2424,12 @@ namespace mysql os << endl << "if (r == select_statement::truncated)" << "{" - << "grow (im, sts.image_error ());" + << "grow (im, sts.out_image_error ());" << endl - << "if (im.version != sts.image_version ())" + << "if (im.version != sts.out_image_version ())" << "{" - << "bind (imb.bind, im);" - << "sts.image_version (im.version);" + << "bind (imb.bind, im, true);" + << "sts.out_image_version (im.version);" << "imb.version++;" << "st.refetch ();" << "}" @@ -2452,12 +2454,12 @@ namespace mysql << "conn.statement_cache ().find ());" << endl << "image_type& im (sts.image ());" - << "binding& imb (sts.image_binding ());" + << "binding& imb (sts.out_image_binding ());" << endl - << "if (im.version != sts.image_version () || imb.version == 0)" + << "if (im.version != sts.out_image_version () || imb.version == 0)" << "{" - << "bind (imb.bind, im);" - << "sts.image_version (im.version);" + << "bind (imb.bind, im, true);" + << "sts.out_image_version (im.version);" << "imb.version++;" << "}" << "details::shared_ptr st (" << endl @@ -2477,7 +2479,7 @@ namespace mysql virtual void traverse_value (type& c) { - bool columns (column_count (c) != 0); + bool columns (in_column_count (c) != 0); string const& type (c.fq_name ()); string traits ("access::composite_value_traits< " + type + " >"); -- cgit v1.1