From 7f6c64f2211d37db76a97fbc79a4b5492302ef2f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 27 Oct 2010 17:36:59 +0200 Subject: Implement support for composite value types New test: common/composite. --- odb/mysql/context.cxx | 107 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) (limited to 'odb/mysql/context.cxx') diff --git a/odb/mysql/context.cxx b/odb/mysql/context.cxx index 7665ed6..f33916e 100644 --- a/odb/mysql/context.cxx +++ b/odb/mysql/context.cxx @@ -9,6 +9,7 @@ #include #include +#include using namespace std; @@ -76,6 +77,112 @@ namespace mysql { } + namespace + { + struct has_grow: traversal::class_ + { + has_grow (context& c) + : member_ (c, *this) + { + *this >> member_names_ >> member_; + *this >> inherits_ >> *this; + } + + bool + dispatch (semantics::type& t) + { + r_ = false; + traversal::class_::dispatch (t); + return r_; + } + + virtual void + traverse (type& c) + { + if (c.count ("mysql::grow")) + r_ = c.get ("mysql::grow"); + else + { + // r_ should be false. + // + inherits (c); + + if (!r_) + names (c); + + c.set ("mysql::grow", r_); + } + } + + private: + struct member: member_base + { + member (context& c, has_grow& hg) : member_base (c, false), hg_ (hg) {} + + virtual void + traverse_composite (type& m) + { + if (!hg_.r_) + hg_.r_ = hg_.dispatch (m.type ()); + } + + virtual void + traverse_decimal (type&, sql_type const&) + { + hg_.r_ = true; + } + + virtual void + traverse_long_string (type&, sql_type const&) + { + hg_.r_ = true; + } + + virtual void + traverse_short_string (type&, sql_type const&) + { + hg_.r_ = true; // @@ Short string optimization disabled. + } + + virtual void + traverse_enum (type&, sql_type const&) + { + hg_.r_ = true; + } + + virtual void + traverse_set (type&, sql_type const&) + { + hg_.r_ = true; + } + + private: + has_grow& hg_; + }; + + bool r_; + + member member_; + traversal::names member_names_; + + traversal::inherits inherits_; + }; + } + + bool context:: + grow (semantics::class_& c) + { + if (c.count ("mysql::grow")) + return c.get ("mysql::grow"); + + has_grow t (*this); + return t.dispatch (c); + } + + // + // SQL type parsing. + // + string context:: column_type (semantics::data_member& m) const { -- cgit v1.1