From 1d438c0c211d21e33f3eec833a307416000b32a2 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 2 Jul 2015 11:43:37 +0200 Subject: C++ type mapping support for container elements --- odb/context.cxx | 4 +- odb/context.hxx | 16 +++--- odb/processor.cxx | 21 +++---- odb/relational/common.hxx | 26 ++++++--- odb/relational/common.txx | 2 +- odb/relational/context.cxx | 1 + odb/relational/context.hxx | 6 +- odb/relational/context.ixx | 7 ++- odb/relational/header.hxx | 34 +++++++----- odb/relational/inline.hxx | 4 +- odb/relational/model.hxx | 6 +- odb/relational/mssql/common.cxx | 25 ++++++--- odb/relational/mssql/common.hxx | 9 ++- odb/relational/mysql/common.cxx | 29 +++++----- odb/relational/mysql/common.hxx | 9 ++- odb/relational/mysql/context.cxx | 24 +++++--- odb/relational/mysql/context.hxx | 5 +- odb/relational/oracle/common.cxx | 29 +++++----- odb/relational/oracle/common.hxx | 9 ++- odb/relational/pgsql/common.cxx | 25 +++++---- odb/relational/pgsql/common.hxx | 9 ++- odb/relational/pgsql/context.cxx | 22 +++++--- odb/relational/pgsql/context.hxx | 5 +- odb/relational/pgsql/source.cxx | 10 ++-- odb/relational/processor.cxx | 25 +++------ odb/relational/source.cxx | 8 +-- odb/relational/source.hxx | 112 ++++++++++++++++++++------------------ odb/relational/sqlite/common.cxx | 29 +++++----- odb/relational/sqlite/common.hxx | 8 ++- odb/relational/sqlite/context.cxx | 22 +++++--- odb/relational/sqlite/context.hxx | 5 +- odb/validator.cxx | 4 +- 32 files changed, 314 insertions(+), 236 deletions(-) diff --git a/odb/context.cxx b/odb/context.cxx index 5ce084a..4604a23 100644 --- a/odb/context.cxx +++ b/odb/context.cxx @@ -3067,7 +3067,7 @@ namespace } virtual void - traverse_container (semantics::data_member& m, semantics::type& c) + traverse_container (semantics::data_member& m, semantics::type&) { // Ignore added/deleted members if so requested. // @@ -3091,7 +3091,7 @@ namespace if (context::is_a (member_path_, member_scope_, f, - context::container_vt (c), + context::container_vt (m), "value")) r_++; } diff --git a/odb/context.hxx b/odb/context.hxx index 6e1d733..5eef193 100644 --- a/odb/context.hxx +++ b/odb/context.hxx @@ -1509,27 +1509,27 @@ public: } static semantics::type& - container_idt (semantics::data_member& m) + container_idt (semantics::data_member& m, const custom_cxx_type** trans = 0) { - return utype (m, "id"); + return utype (m, "id", trans); } static semantics::type& - container_vt (semantics::type& c) + container_vt (semantics::data_member& m, const custom_cxx_type** trans = 0) { - return *c.get ("value-tree-type"); + return utype (m, "value", trans); } static semantics::type& - container_it (semantics::type& c) + container_it (semantics::data_member& m, const custom_cxx_type** trans = 0) { - return *c.get ("index-tree-type"); + return utype (m, "index", trans); } static semantics::type& - container_kt (semantics::type& c) + container_kt (semantics::data_member& m, const custom_cxx_type** trans = 0) { - return *c.get ("key-tree-type"); + return utype (m, "key", trans); } static bool diff --git a/odb/processor.cxx b/odb/processor.cxx index facbbb4..f7a2be2 100644 --- a/odb/processor.cxx +++ b/odb/processor.cxx @@ -1410,20 +1410,14 @@ namespace { ck = t.get ("container-kind"); smart = t.get ("container-smart"); - vt = t.get ("value-tree-type"); - vh = t.get ("value-tree-hint"); + + vt = &utype (m, vh, "value"); if (ck == ck_ordered) - { - it = t.get ("index-tree-type"); - ih = t.get ("index-tree-hint"); - } + it = &utype (m, ih, "index"); if (ck == ck_map || ck == ck_multimap) - { - kt = t.get ("key-tree-type"); - kh = t.get ("key-tree-hint"); - } + kt = &utype (m, kh, "key"); } else { @@ -1553,6 +1547,7 @@ namespace t.set ("value-tree-type", vt); t.set ("value-tree-hint", vh); + vt = &utype (m, vh, "value"); // Map. // If we have a set container, automatically mark the value // column as not null. If we already have an explicit null for @@ -1610,9 +1605,10 @@ namespace throw; } + t.set ("index-not-null", true); t.set ("index-tree-type", it); t.set ("index-tree-hint", ih); - t.set ("index-not-null", true); + it = &utype (m, ih, "index"); // Map. } // Get the key type for maps. @@ -1644,9 +1640,10 @@ namespace throw; } + t.set ("key-not-null", true); t.set ("key-tree-type", kt); t.set ("key-tree-hint", kh); - t.set ("key-not-null", true); + kt = &utype (m, kh, "key"); // Map. } // Check if we are versioned. For now we are not allowing for diff --git a/odb/relational/common.hxx b/odb/relational/common.hxx index bc7e034..9bd2da6 100644 --- a/odb/relational/common.hxx +++ b/odb/relational/common.hxx @@ -18,10 +18,12 @@ namespace relational typedef member_base base; member_base (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix, object_section* section = 0) : type_override_ (type), + custom_override_ (ct), fq_type_override_ (fq_type), key_prefix_ (key_prefix), section_ (section) @@ -30,11 +32,13 @@ namespace relational member_base (string const& var, semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix, object_section* section = 0) : var_override_ (var), type_override_ (type), + custom_override_ (ct), fq_type_override_ (fq_type), key_prefix_ (key_prefix), section_ (section) @@ -49,6 +53,7 @@ namespace relational protected: string var_override_; semantics::type* type_override_; + const custom_cxx_type* custom_override_; string fq_type_override_; string key_prefix_; object_section* section_; @@ -122,7 +127,9 @@ namespace relational return t.fq_name (hint); } else - return fq_type_; + // If we are translated, then fq_type_ contains the original type. + // + return ct == 0 ? fq_type_ : t.fq_name (ct->as_hint); } string @@ -204,12 +211,13 @@ namespace relational { typedef member_image_type base; - member_image_type (semantics::type* type = 0, + member_image_type (): member_base (0, 0, string (), string ()) {} + + member_image_type (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type = string (), string const& key_prefix = string ()) - : member_base (type, fq_type, key_prefix) - { - } + : member_base (type, ct, fq_type, key_prefix) {} // Has to be overriden. // @@ -223,12 +231,12 @@ namespace relational { typedef member_database_type_id base; - member_database_type_id (semantics::type* type = 0, + member_database_type_id (): member_base (0, 0, string (), string ()) {} + member_database_type_id (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type = string (), string const& key_prefix = string ()) - : member_base (type, fq_type, key_prefix) - { - } + : member_base (type, ct, fq_type, key_prefix) {} // Has to be overriden. // diff --git a/odb/relational/common.txx b/odb/relational/common.txx index 893e16c..5e5c5ac 100644 --- a/odb/relational/common.txx +++ b/odb/relational/common.txx @@ -26,7 +26,7 @@ namespace relational } bool cq (type_override_ != 0 ? false : const_member (m)); - const custom_cxx_type* ct (0); + const custom_cxx_type* ct (type_override_ != 0 ? custom_override_ : 0); semantics::type& t (type_override_ != 0 ? *type_override_ : utype (m, &ct)); diff --git a/odb/relational/context.cxx b/odb/relational/context.cxx index 5f82103..237ea0c 100644 --- a/odb/relational/context.cxx +++ b/odb/relational/context.cxx @@ -118,6 +118,7 @@ namespace relational bool context:: grow_impl (semantics::data_member&, semantics::type&, + const custom_cxx_type*, string const&) { return false; diff --git a/odb/relational/context.hxx b/odb/relational/context.hxx index 45dbba6..02adfc7 100644 --- a/odb/relational/context.hxx +++ b/odb/relational/context.hxx @@ -88,7 +88,10 @@ namespace relational grow (semantics::data_member&); bool - grow (semantics::data_member&, semantics::type&, string const& key_prefix); + grow (semantics::data_member&, + semantics::type&, + const custom_cxx_type*, + string const& key_prefix); public: // Quote SQL string. @@ -216,6 +219,7 @@ namespace relational virtual bool grow_impl (semantics::data_member&, semantics::type&, + const custom_cxx_type*, string const&); // The default implementation uses the ISO quoting ('') and diff --git a/odb/relational/context.ixx b/odb/relational/context.ixx index b5865cf..6ffb3bb 100644 --- a/odb/relational/context.ixx +++ b/odb/relational/context.ixx @@ -17,9 +17,12 @@ namespace relational } inline bool context:: - grow (semantics::data_member& m, semantics::type& t, string const& kp) + grow (semantics::data_member& m, + semantics::type& t, + const custom_cxx_type* ct, + string const& kp) { - return current ().grow_impl (m, t, kp); + return current ().grow_impl (m, t, ct, kp); } inline context::string context:: diff --git a/odb/relational/header.hxx b/odb/relational/header.hxx index 63dea09..032884a 100644 --- a/odb/relational/header.hxx +++ b/odb/relational/header.hxx @@ -21,17 +21,14 @@ namespace relational typedef image_member base; image_member (string const& var = string ()) - : member_base (var, 0, string (), string ()) - { - } + : member_base (var, 0, 0, string (), string ()) {} image_member (string const& var, semantics::type& t, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base (var, &t, fq_type, key_prefix) - { - } + : member_base (var, &t, ct, fq_type, key_prefix) {} }; template @@ -43,6 +40,7 @@ namespace relational : member_base::base (x), // virtual base base (x), member_image_type_ (base::type_override_, + base::custom_override_, base::fq_type_override_, base::key_prefix_) { @@ -283,7 +281,11 @@ namespace relational container_kind_type ck (container_kind (c)); - type& vt (container_vt (c)); + const custom_cxx_type* vct (0); + const custom_cxx_type* ict (0); + const custom_cxx_type* kct (0); + + type& vt (container_vt (m, &vct)); type* it (0); type* kt (0); @@ -296,7 +298,7 @@ namespace relational { if (!unordered (m)) { - it = &container_it (c); + it = &container_it (m, &ict); ordered = true; } break; @@ -304,7 +306,7 @@ namespace relational case ck_map: case ck_multimap: { - kt = &container_kt (c); + kt = &container_kt (m, &kct); break; } case ck_set: @@ -578,7 +580,7 @@ namespace relational os << "// index" << endl << "//" << endl; instance im ( - "index_", *it, "index_type", "index"); + "index_", *it, ict, "index_type", "index"); im->traverse (m); } break; @@ -588,7 +590,7 @@ namespace relational { os << "// key" << endl << "//" << endl; - instance im ("key_", *kt, "key_type", "key"); + instance im ("key_", *kt, kct, "key_type", "key"); im->traverse (m); break; } @@ -597,7 +599,8 @@ namespace relational { os << "// value" << endl << "//" << endl; - instance im ("value_", vt, "value_type", "value"); + instance im ( + "value_", vt, vct, "value_type", "value"); im->traverse (m); break; } @@ -620,7 +623,8 @@ namespace relational { os << "// index" << endl << "//" << endl; - instance im ("index_", *it, "index_type", "index"); + instance im ( + "index_", *it, ict, "index_type", "index"); im->traverse (m); } break; @@ -630,7 +634,7 @@ namespace relational { os << "// key" << endl << "//" << endl; - instance im ("key_", *kt, "key_type", "key"); + instance im ("key_", *kt, kct, "key_type", "key"); im->traverse (m); break; } @@ -643,7 +647,7 @@ namespace relational os << "// value" << endl << "//" << endl; - instance im ("value_", vt, "value_type", "value"); + instance im ("value_", vt, vct, "value_type", "value"); im->traverse (m); os << "std::size_t version;" diff --git a/odb/relational/inline.hxx b/odb/relational/inline.hxx index 2bed1da..090779f 100644 --- a/odb/relational/inline.hxx +++ b/odb/relational/inline.hxx @@ -22,9 +22,7 @@ namespace relational typedef null_member base; null_member (bool get) - : member_base (string (), 0, string (), string ()), get_ (get) - { - } + : member_base (0, 0, string (), string ()), get_ (get) {} protected: bool get_; diff --git a/odb/relational/model.hxx b/odb/relational/model.hxx index 77631e2..00b3b46 100644 --- a/odb/relational/model.hxx +++ b/odb/relational/model.hxx @@ -702,7 +702,7 @@ namespace relational { bool f (false); //@@ (im)persfect forwarding. instance oc (model_, t, f); - oc->traverse (m, container_it (ct), "index", "index"); + oc->traverse (m, container_it (m), "index", "index"); } // This is a simple value so the name cannot be empty. It is @@ -751,7 +751,7 @@ namespace relational { bool f (false); //@@ (im)persfect forwarding. instance oc (model_, t, f); - oc->traverse (m, container_kt (ct), "key", "key"); + oc->traverse (m, container_kt (m), "key", "key"); } // value @@ -759,7 +759,7 @@ namespace relational { bool f (false); //@@ (im)persfect forwarding. instance oc (model_, t, f); - oc->traverse (m, container_vt (ct), "value", "value"); + oc->traverse (m, container_vt (m), "value", "value"); } } diff --git a/odb/relational/mssql/common.cxx b/odb/relational/mssql/common.cxx index e752f76..eb294cc 100644 --- a/odb/relational/mssql/common.cxx +++ b/odb/relational/mssql/common.cxx @@ -186,17 +186,18 @@ namespace relational member_image_type:: member_image_type (base const& x) : member_base::base (x), // virtual base - base (x) - { - } + base (x) {} + + member_image_type:: + member_image_type () + : relational::member_base (0, 0, string (), string ()) {} member_image_type:: member_image_type (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : relational::member_base (type, fq_type, key_prefix) - { - } + : relational::member_base (type, ct, fq_type, key_prefix) {} string member_image_type:: image_type (semantics::data_member& m) @@ -344,11 +345,19 @@ namespace relational } member_database_type_id:: + member_database_type_id () + : member_base::base (0, 0, string (), string ()), // virtual base + base (0, 0, string (), string ()) + { + } + + member_database_type_id:: member_database_type_id (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base::base (type, fq_type, key_prefix), // virtual base - base (type, fq_type, key_prefix) + : member_base::base (type, ct, fq_type, key_prefix), // virtual base + base (type, ct, fq_type, key_prefix) { } diff --git a/odb/relational/mssql/common.hxx b/odb/relational/mssql/common.hxx index eed08df..520b8b1 100644 --- a/odb/relational/mssql/common.hxx +++ b/odb/relational/mssql/common.hxx @@ -123,7 +123,9 @@ namespace relational member_base { member_image_type (base const&); - member_image_type (semantics::type* type = 0, + member_image_type (); + member_image_type (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); virtual string @@ -194,8 +196,9 @@ namespace relational member_base { member_database_type_id (base const&); - - member_database_type_id (semantics::type* type = 0, + member_database_type_id (); + member_database_type_id (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); diff --git a/odb/relational/mysql/common.cxx b/odb/relational/mysql/common.cxx index 98edfcd..a8f4668 100644 --- a/odb/relational/mysql/common.cxx +++ b/odb/relational/mysql/common.cxx @@ -152,17 +152,18 @@ namespace relational member_image_type:: member_image_type (base const& x) : member_base::base (x), // virtual base - base (x) - { - } + base (x) {} + + member_image_type:: + member_image_type () + : relational::member_base (0, 0, string (), string ()) {} member_image_type:: member_image_type (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : relational::member_base (type, fq_type, key_prefix) - { - } + : relational::member_base (type, ct, fq_type, key_prefix) {} string member_image_type:: image_type (semantics::data_member& m) @@ -294,18 +295,20 @@ namespace relational member_database_type_id:: member_database_type_id (base const& x) : member_base::base (x), // virtual base - base (x) - { - } + base (x) {} + + member_database_type_id:: + member_database_type_id () + : member_base::base (0, 0, string (), string ()), // virtual base + base (0, 0, string (), string ()) {} member_database_type_id:: member_database_type_id (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base::base (type, fq_type, key_prefix), // virtual base - base (type, fq_type, key_prefix) - { - } + : member_base::base (type, ct, fq_type, key_prefix), // virtual base + base (type, ct, fq_type, key_prefix) {} string member_database_type_id:: database_type_id (type& m) diff --git a/odb/relational/mysql/common.hxx b/odb/relational/mysql/common.hxx index cf159c1..38ee0b1 100644 --- a/odb/relational/mysql/common.hxx +++ b/odb/relational/mysql/common.hxx @@ -85,7 +85,9 @@ namespace relational member_base { member_image_type (base const&); - member_image_type (semantics::type* type = 0, + member_image_type (); + member_image_type (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); virtual string @@ -126,8 +128,9 @@ namespace relational member_base { member_database_type_id (base const&); - - member_database_type_id (semantics::type* type = 0, + member_database_type_id (); + member_database_type_id (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); diff --git a/odb/relational/mysql/context.cxx b/odb/relational/mysql/context.cxx index d2232bc..c03a77a 100644 --- a/odb/relational/mysql/context.cxx +++ b/odb/relational/mysql/context.cxx @@ -199,14 +199,17 @@ namespace relational struct has_grow_member: member_base { + has_grow_member (bool& r, user_section* section = 0) + : relational::member_base (0, 0, string (), string (), section), + r_ (r) {} + has_grow_member (bool& r, - user_section* section = 0, - semantics::type* type = 0, + user_section* section, + semantics::type* t, + const custom_cxx_type* ct, string const& key_prefix = string ()) - : relational::member_base (type, string (), key_prefix, section), - r_ (r) - { - } + : relational::member_base (t, ct, string (), key_prefix, section), + r_ (r) {} virtual bool pre (member_info& mi) @@ -279,16 +282,19 @@ namespace relational grow_impl (semantics::data_member& m) { bool r (false); - has_grow_member mt (r); + has_grow_member mt (r); mt.traverse (m); return r; } bool context:: - grow_impl (semantics::data_member& m, semantics::type& t, string const& kp) + grow_impl (semantics::data_member& m, + semantics::type& t, + const custom_cxx_type* ct, + string const& kp) { bool r (false); - has_grow_member mt (r, 0, &t, kp); + has_grow_member mt (r, 0, &t, ct, kp); mt.traverse (m); return r; } diff --git a/odb/relational/mysql/context.hxx b/odb/relational/mysql/context.hxx index 6fd8bd6..d7e1dc4 100644 --- a/odb/relational/mysql/context.hxx +++ b/odb/relational/mysql/context.hxx @@ -119,7 +119,10 @@ namespace relational grow_impl (semantics::data_member&); virtual bool - grow_impl (semantics::data_member&, semantics::type&, string const&); + grow_impl (semantics::data_member&, + semantics::type&, + const custom_cxx_type*, + string const&); protected: virtual string diff --git a/odb/relational/oracle/common.cxx b/odb/relational/oracle/common.cxx index b3ac7e2..30e4c79 100644 --- a/odb/relational/oracle/common.cxx +++ b/odb/relational/oracle/common.cxx @@ -172,17 +172,18 @@ namespace relational member_image_type:: member_image_type (base const& x) : member_base::base (x), // virtual base - base (x) - { - } + base (x) {} + + member_image_type:: + member_image_type () + : relational::member_base (0, 0, string (), string ()) {} member_image_type:: member_image_type (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : relational::member_base (type, fq_type, key_prefix) - { - } + : relational::member_base (type, ct, fq_type, key_prefix) {} string member_image_type:: image_type (semantics::data_member& m) @@ -305,18 +306,20 @@ namespace relational member_database_type_id:: member_database_type_id (base const& x) : member_base::base (x), // virtual base - base (x) - { - } + base (x) {} + + member_database_type_id:: + member_database_type_id () + : member_base::base (0, 0, string (), string ()), // virtual base + base (0, 0, string (), string ()) {} member_database_type_id:: member_database_type_id (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base::base (type, fq_type, key_prefix), // virtual base - base (type, fq_type, key_prefix) - { - } + : member_base::base (type, ct, fq_type, key_prefix), // virtual base + base (type, ct, fq_type, key_prefix) {} string member_database_type_id:: database_type_id (type& m) diff --git a/odb/relational/oracle/common.hxx b/odb/relational/oracle/common.hxx index 66cbfd2..a2a34a4 100644 --- a/odb/relational/oracle/common.hxx +++ b/odb/relational/oracle/common.hxx @@ -93,7 +93,9 @@ namespace relational member_base { member_image_type (base const&); - member_image_type (semantics::type* type = 0, + member_image_type (); + member_image_type (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); virtual string @@ -146,8 +148,9 @@ namespace relational member_base { member_database_type_id (base const&); - - member_database_type_id (semantics::type* type = 0, + member_database_type_id (); + member_database_type_id (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); diff --git a/odb/relational/pgsql/common.cxx b/odb/relational/pgsql/common.cxx index 7611299..43adb6a 100644 --- a/odb/relational/pgsql/common.cxx +++ b/odb/relational/pgsql/common.cxx @@ -133,12 +133,15 @@ namespace relational } member_image_type:: + member_image_type () + : relational::member_base (0, 0, string (), string ()) {} + + member_image_type:: member_image_type (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : relational::member_base (type, fq_type, key_prefix) - { - } + : relational::member_base (type, ct, fq_type, key_prefix) {} string member_image_type:: image_type (semantics::data_member& m) @@ -244,18 +247,20 @@ namespace relational member_database_type_id:: member_database_type_id (base const& x) : member_base::base (x), // virtual base - base (x) - { - } + base (x) {} + + member_database_type_id:: + member_database_type_id () + : member_base::base (0, 0, string (), string ()), // virtual base + base (0, 0, string (), string ()) {} member_database_type_id:: member_database_type_id (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base::base (type, fq_type, key_prefix), // virtual base - base (type, fq_type, key_prefix) - { - } + : member_base::base (type, ct, fq_type, key_prefix), // virtual base + base (type, ct, fq_type, key_prefix) {} string member_database_type_id:: database_type_id (type& m) diff --git a/odb/relational/pgsql/common.hxx b/odb/relational/pgsql/common.hxx index be6e33b..0d22aff 100644 --- a/odb/relational/pgsql/common.hxx +++ b/odb/relational/pgsql/common.hxx @@ -73,7 +73,9 @@ namespace relational member_base { member_image_type (base const&); - member_image_type (semantics::type* type = 0, + member_image_type (); + member_image_type (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); virtual string @@ -114,8 +116,9 @@ namespace relational member_base { member_database_type_id (base const&); - - member_database_type_id (semantics::type* type = 0, + member_database_type_id (); + member_database_type_id (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); diff --git a/odb/relational/pgsql/context.cxx b/odb/relational/pgsql/context.cxx index 1910187..f8a9fe2 100644 --- a/odb/relational/pgsql/context.cxx +++ b/odb/relational/pgsql/context.cxx @@ -155,14 +155,17 @@ namespace relational struct has_grow_member: member_base { + has_grow_member (bool& r, user_section* section = 0) + : relational::member_base (0, 0, string (), string (), section), + r_ (r) {} + has_grow_member (bool& r, - user_section* section = 0, - semantics::type* type = 0, + user_section* section, + semantics::type* t, + const custom_cxx_type* ct, string const& key_prefix = string ()) - : relational::member_base (type, string (), key_prefix, section), - r_ (r) - { - } + : relational::member_base (t, ct, string (), key_prefix, section), + r_ (r) {} virtual bool pre (member_info& mi) @@ -229,10 +232,13 @@ namespace relational } bool context:: - grow_impl (semantics::data_member& m, semantics::type& t, string const& kp) + grow_impl (semantics::data_member& m, + semantics::type& t, + const custom_cxx_type* ct, + string const& kp) { bool r (false); - has_grow_member mt (r, 0, &t, kp); + has_grow_member mt (r, 0, &t, ct, kp); mt.traverse (m); return r; } diff --git a/odb/relational/pgsql/context.hxx b/odb/relational/pgsql/context.hxx index b49ea99..53b1c95 100644 --- a/odb/relational/pgsql/context.hxx +++ b/odb/relational/pgsql/context.hxx @@ -120,7 +120,10 @@ namespace relational grow_impl (semantics::data_member&); virtual bool - grow_impl (semantics::data_member&, semantics::type&, string const&); + grow_impl (semantics::data_member&, + semantics::type&, + const custom_cxx_type*, + string const&); protected: virtual string diff --git a/odb/relational/pgsql/source.cxx b/odb/relational/pgsql/source.cxx index d009a7c..2bbe232 100644 --- a/odb/relational/pgsql/source.cxx +++ b/odb/relational/pgsql/source.cxx @@ -911,7 +911,7 @@ namespace relational // Statement types. // - semantics::type& vt (container_vt (t)); + semantics::type& vt (container_vt (m)); semantics::type& idt (container_idt (m)); // insert statement types. @@ -932,13 +932,13 @@ namespace relational case ck_ordered: { if (!unordered (m)) - so.traverse (m, container_it (t), "index", "index"); + so.traverse (m, container_it (m), "index", "index"); break; } case ck_map: case ck_multimap: { - so.traverse (m, container_kt (t), "key", "key"); + so.traverse (m, container_kt (m), "key", "key"); break; } case ck_set: @@ -982,7 +982,7 @@ namespace relational case ck_ordered: { if (!unordered (m)) - so.traverse (m, container_it (t), "index", "index"); + so.traverse (m, container_it (m), "index", "index"); break; } case ck_map: @@ -1018,7 +1018,7 @@ namespace relational case ck_ordered: { if (!unordered (m)) - so.traverse (m, container_it (t), "index", "index"); + so.traverse (m, container_it (m), "index", "index"); break; } case ck_map: diff --git a/odb/relational/processor.cxx b/odb/relational/processor.cxx index 09a468b..2979a34 100644 --- a/odb/relational/processor.cxx +++ b/odb/relational/processor.cxx @@ -400,25 +400,16 @@ namespace relational process_container (semantics::data_member& m, semantics::type& t) { container_kind_type ck (t.get ("container-kind")); - semantics::type* vt (t.get ("value-tree-type")); - semantics::type* it (0); - semantics::type* kt (0); - semantics::names* vh (t.get ("value-tree-hint")); + semantics::names* vh (0); semantics::names* ih (0); semantics::names* kh (0); - if (ck == ck_ordered) - { - it = t.get ("index-tree-type"); - ih = t.get ("index-tree-hint"); - } - - if (ck == ck_map || ck == ck_multimap) - { - kt = t.get ("key-tree-type"); - kh = t.get ("key-tree-hint"); - } + semantics::type* vt (&utype (m, vh, "value")); + semantics::type* it (ck == ck_ordered ? &utype (m, ih, "index") : 0); + semantics::type* kt (ck == ck_map || ck == ck_multimap + ? &utype (m, kh, "key") + : 0); // Process member data. // @@ -1483,10 +1474,10 @@ namespace relational } virtual void - traverse_container (semantics::data_member& m, semantics::type& t) + traverse_container (semantics::data_member& m, semantics::type&) { if (semantics::class_* c = - object_pointer (context::container_vt (t))) + object_pointer (context::container_vt (m))) { if (inverse (m, "value")) return; diff --git a/odb/relational/source.cxx b/odb/relational/source.cxx index 60d3b34..83e3c40 100644 --- a/odb/relational/source.cxx +++ b/odb/relational/source.cxx @@ -4655,8 +4655,8 @@ traverse_view (type& c) // semantics::class_* c (0); - if (semantics::type* cont = container (m)) - c = object_pointer (container_vt (*cont)); + if (container (m)) + c = object_pointer (container_vt (m)); else c = object_pointer (utype (m)); @@ -5899,8 +5899,8 @@ namespace relational type* t; - if (type* c = context::container (*m)) - t = &context::container_vt (*c); + if (context::container (*m)) + t = &context::container_vt (*m); else t = &context::utype (*m); diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx index 81e182b..e67931f 100644 --- a/odb/relational/source.hxx +++ b/odb/relational/source.hxx @@ -1208,9 +1208,9 @@ namespace relational } virtual void - traverse_container (semantics::data_member& m, semantics::type& t) + traverse_container (semantics::data_member& m, semantics::type&) { - semantics::type& vt (container_vt (t)); + semantics::type& vt (container_vt (m)); if (semantics::class_* cvt = composite_wrapper (vt)) { @@ -1328,20 +1328,17 @@ namespace relational bind_member (string const& var = string (), string const& arg = string (), object_section* section = 0) - : member_base (var, 0, string (), string (), section), - arg_override_ (arg) - { - } + : member_base (var, 0, 0, string (), string (), section), + arg_override_ (arg) {} bind_member (string const& var, string const& arg, semantics::type& t, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base (var, &t, fq_type, key_prefix), - arg_override_ (arg) - { - } + : member_base (var, &t, ct, fq_type, key_prefix), + arg_override_ (arg) {} protected: string arg_override_; @@ -1352,10 +1349,7 @@ namespace relational { typedef bind_member_impl base_impl; - bind_member_impl (base const& x) - : base (x) - { - } + bind_member_impl (base const& x): base (x) {} typedef typename member_base_impl::member_info member_info; @@ -1714,19 +1708,16 @@ namespace relational grow_member (size_t& index, string const& var = string (), user_section* section = 0) - : member_base (var, 0, string (), string (), section), - index_ (index) - { - } + : member_base (var, 0, 0, string (), string (), section), + index_ (index) {} grow_member (size_t& index, string const& var, semantics::type& t, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base (var, &t, fq_type, key_prefix), index_ (index) - { - } + : member_base (var, &t, ct, fq_type, key_prefix), index_ (index) {} protected: size_t& index_; @@ -1971,7 +1962,7 @@ namespace relational init_image_member (string const& var = string (), string const& member = string (), user_section* section = 0) - : member_base (var, 0, string (), string (), section), + : member_base (var, 0, 0, string (), string (), section), member_override_ (member) { } @@ -1979,9 +1970,10 @@ namespace relational init_image_member (string const& var, string const& member, semantics::type& t, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base (var, &t, fq_type, key_prefix), + : member_base (var, &t, ct, fq_type, key_prefix), member_override_ (member) { } @@ -1999,6 +1991,7 @@ namespace relational init_image_member_impl (base const& x) : base (x), member_database_type_id_ (base::type_override_, + base::custom_override_, base::fq_type_override_, base::key_prefix_) { @@ -2339,7 +2332,8 @@ namespace relational virtual void traverse_composite (member_info& mi) { - bool grow (generate_grow && context::grow (mi.m, mi.t, key_prefix_)); + bool grow (generate_grow && + context::grow (mi.m, mi.t, mi.ct, key_prefix_)); if (grow) os << "if ("; @@ -2433,7 +2427,7 @@ namespace relational string const& var = string (), bool ignore_implicit_discriminator = true, user_section* section = 0) - : member_base (var, 0, string (), string (), section), + : member_base (var, 0, 0, string (), string (), section), member_override_ (member), ignore_implicit_discriminator_ (ignore_implicit_discriminator) { @@ -2442,9 +2436,10 @@ namespace relational init_value_member (string const& var, string const& member, semantics::type& t, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base (var, &t, fq_type, key_prefix), + : member_base (var, &t, ct, fq_type, key_prefix), member_override_ (member), ignore_implicit_discriminator_ (true) { @@ -2467,6 +2462,7 @@ namespace relational init_value_member_impl (base const& x) : base (x), member_database_type_id_ (base::type_override_, + base::custom_override_, base::fq_type_override_, base::key_prefix_) { @@ -2966,7 +2962,7 @@ namespace relational typedef init_view_pointer_member base; init_view_pointer_member (bool pre, init_value_member const& ivm) - : member_base ("", 0, "", "", 0), + : member_base (0, 0, string (), string (), 0), pre_ (pre), init_value_member_ (ivm) {} virtual bool @@ -3438,7 +3434,11 @@ namespace relational container_kind_type ck (container_kind (t)); - type& vt (container_vt (t)); + const custom_cxx_type* vct (0); + const custom_cxx_type* ict (0); + const custom_cxx_type* kct (0); + + type& vt (container_vt (m, &vct)); type* it (0); type* kt (0); @@ -3454,11 +3454,11 @@ namespace relational { if (!unordered (m)) { - it = &container_it (t); + it = &container_it (m, &ict); ordered = true; if (generate_grow) - grow = grow || context::grow (m, *it, "index"); + grow = grow || context::grow (m, *it, ict, "index"); } break; @@ -3466,10 +3466,10 @@ namespace relational case ck_map: case ck_multimap: { - kt = &container_kt (t); + kt = &container_kt (m, &kct); if (generate_grow) - grow = grow || context::grow (m, *kt, "key"); + grow = grow || context::grow (m, *kt, kct, "key"); break; } @@ -3485,7 +3485,7 @@ namespace relational container_smart (t)); if (generate_grow) - grow = grow || context::grow (m, vt, "value"); + grow = grow || context::grow (m, vt, vct, "value"); bool eager_ptr (is_a (member_path_, member_scope_, @@ -3933,7 +3933,7 @@ namespace relational os << "// index" << endl << "//" << endl; instance bm ( - "index_", "c", *it, "index_type", "index"); + "index_", "c", *it, ict, "index_type", "index"); bm->traverse (m); } break; @@ -3943,7 +3943,8 @@ namespace relational { os << "// key" << endl << "//" << endl; - instance bm ("key_", "c", *kt, "key_type", "key"); + instance bm ( + "key_", "c", *kt, kct, "key_type", "key"); bm->traverse (m); break; } @@ -3953,7 +3954,7 @@ namespace relational os << "// value" << endl << "//" << endl; instance bm ( - "value_", "c", vt, "value_type", "value"); + "value_", "c", vt, vct, "value_type", "value"); bm->traverse (m); break; } @@ -4004,7 +4005,7 @@ namespace relational os << "// index" << endl << "//" << endl; instance bm ( - "index_", "d", *it, "index_type", "index"); + "index_", "d", *it, ict, "index_type", "index"); bm->traverse (m); os << "n++;" // Simple value. << endl; @@ -4016,7 +4017,8 @@ namespace relational { os << "// key" << endl << "//" << endl; - instance bm ("key_", "d", *kt, "key_type", "key"); + instance bm ( + "key_", "d", *kt, kct, "key_type", "key"); bm->traverse (m); if (semantics::class_* c = composite_wrapper (*kt)) @@ -4039,7 +4041,8 @@ namespace relational // os << "// value" << endl << "//" << endl; - instance bm ("value_", "d", vt, "value_type", "value"); + instance bm ( + "value_", "d", vt, vct, "value_type", "value"); bm->traverse (m); os << "}"; @@ -4074,7 +4077,8 @@ namespace relational os << "// value" << endl << "//" << endl; - instance bm ("value_", "d", vt, "value_type", "value"); + instance bm ( + "value_", "d", vt, vct, "value_type", "value"); bm->traverse (m); if (semantics::class_* c = composite_wrapper (vt)) @@ -4103,7 +4107,7 @@ namespace relational os << "// index" << endl << "//" << endl; instance bm ( - "index_", "c", *it, "index_type", "index"); + "index_", "c", *it, ict, "index_type", "index"); bm->traverse (m); } break; @@ -4113,7 +4117,8 @@ namespace relational { os << "// key" << endl << "//" << endl; - instance bm ("key_", "c", *kt, "key_type", "key"); + instance bm ( + "key_", "c", *kt, kct, "key_type", "key"); bm->traverse (m); break; } @@ -4123,7 +4128,7 @@ namespace relational os << "// value" << endl << "//" << endl; instance bm ( - "value_", "c", vt, "value_type", "value"); + "value_", "c", vt, vct, "value_type", "value"); bm->traverse (m); break; } @@ -4159,7 +4164,7 @@ namespace relational os << "// index" << endl << "//" << endl; instance gm ( - index, "index_", *it, "index_type", "index"); + index, "index_", *it, ict, "index_type", "index"); gm->traverse (m); } break; @@ -4169,7 +4174,8 @@ namespace relational { os << "// key" << endl << "//" << endl; - instance gm (index, "key_", *kt, "key_type", "key"); + instance gm ( + index, "key_", *kt, kct, "key_type", "key"); gm->traverse (m); break; } @@ -4183,7 +4189,7 @@ namespace relational os << "// value" << endl << "//" << endl; instance gm ( - index, "value_", vt, "value_type", "value"); + index, "value_", vt, vct, "value_type", "value"); gm->traverse (m); os << "if (grew)" << endl @@ -4246,7 +4252,7 @@ namespace relational << "if (j != 0)"; instance im ( - "index_", "*j", *it, "index_type", "index"); + "index_", "*j", *it, ict, "index_type", "index"); im->traverse (m); } break; @@ -4259,7 +4265,7 @@ namespace relational << "if (k != 0)"; instance im ( - "key_", "*k", *kt, "key_type", "key"); + "key_", "*k", *kt, kct, "key_type", "key"); im->traverse (m); break; @@ -4275,7 +4281,7 @@ namespace relational << "//" << endl; { instance im ( - "value_", "v", vt, "value_type", "value"); + "value_", "v", vt, vct, "value_type", "value"); im->traverse (m); } @@ -4305,7 +4311,7 @@ namespace relational << endl; instance im ( - "index_", "j", *it, "index_type", "index"); + "index_", "j", *it, ict, "index_type", "index"); im->traverse (m); os << "}"; @@ -4379,7 +4385,7 @@ namespace relational << "//" << endl; instance im ( - "index_", "j", *it, "index_type", "index"); + "index_", "j", *it, ict, "index_type", "index"); im->traverse (m); } @@ -4392,7 +4398,7 @@ namespace relational << "//" << endl; instance im ( - "key_", "k", *kt, "key_type", "key"); + "key_", "k", *kt, kct, "key_type", "key"); im->traverse (m); break; @@ -4409,7 +4415,7 @@ namespace relational // type override. // instance im ( - "value_", "v", vt, "value_type", "value"); + "value_", "v", vt, vct, "value_type", "value"); im->traverse (m); } os << "}"; diff --git a/odb/relational/sqlite/common.cxx b/odb/relational/sqlite/common.cxx index d64c252..36a0e86 100644 --- a/odb/relational/sqlite/common.cxx +++ b/odb/relational/sqlite/common.cxx @@ -62,17 +62,18 @@ namespace relational member_image_type:: member_image_type (base const& x) : member_base::base (x), // virtual base - base (x) - { - } + base (x) {} + + member_image_type:: + member_image_type () + : relational::member_base (0, 0, string (), string ()) {} member_image_type:: member_image_type (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : relational::member_base (type, fq_type, key_prefix) - { - } + : relational::member_base (type, ct, fq_type, key_prefix) {} string member_image_type:: image_type (semantics::data_member& m) @@ -116,18 +117,20 @@ namespace relational member_database_type_id:: member_database_type_id (base const& x) : member_base::base (x), // virtual base - base (x) - { - } + base (x) {} + + member_database_type_id:: + member_database_type_id () + : member_base::base (0, 0, string (), string ()), // virtual base + base (0, 0, string (), string ()) {} member_database_type_id:: member_database_type_id (semantics::type* type, + const custom_cxx_type* ct, string const& fq_type, string const& key_prefix) - : member_base::base (type, fq_type, key_prefix), // virtual base - base (type, fq_type, key_prefix) - { - } + : member_base::base (type, ct, fq_type, key_prefix), // virtual base + base (type, ct, fq_type, key_prefix) {} string member_database_type_id:: database_type_id (type& m) diff --git a/odb/relational/sqlite/common.hxx b/odb/relational/sqlite/common.hxx index 808f489..bea0889 100644 --- a/odb/relational/sqlite/common.hxx +++ b/odb/relational/sqlite/common.hxx @@ -62,7 +62,9 @@ namespace relational member_base { member_image_type (base const&); - member_image_type (semantics::type* type = 0, + member_image_type (); + member_image_type (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); virtual string @@ -88,7 +90,9 @@ namespace relational member_base { member_database_type_id (base const&); - member_database_type_id (semantics::type* type = 0, + member_database_type_id (); + member_database_type_id (semantics::type* type, + const custom_cxx_type*, string const& fq_type = string (), string const& key_prefix = string ()); diff --git a/odb/relational/sqlite/context.cxx b/odb/relational/sqlite/context.cxx index 1b60945..007d67f 100644 --- a/odb/relational/sqlite/context.cxx +++ b/odb/relational/sqlite/context.cxx @@ -162,14 +162,17 @@ namespace relational struct has_grow_member: member_base { + has_grow_member (bool& r, user_section* section = 0) + : relational::member_base (0, 0, string (), string (), section), + r_ (r) {} + has_grow_member (bool& r, - user_section* section = 0, - semantics::type* type = 0, + user_section* section, + semantics::type* t, + const custom_cxx_type* ct, string const& key_prefix = string ()) - : relational::member_base (type, string (), key_prefix, section), - r_ (r) - { - } + : relational::member_base (t, ct, string (), key_prefix, section), + r_ (r) {} virtual bool pre (member_info& mi) @@ -224,10 +227,13 @@ namespace relational } bool context:: - grow_impl (semantics::data_member& m, semantics::type& t, string const& kp) + grow_impl (semantics::data_member& m, + semantics::type& t, + const custom_cxx_type* ct, + string const& kp) { bool r (false); - has_grow_member mt (r, 0, &t, kp); + has_grow_member mt (r, 0, &t, ct, kp); mt.traverse (m); return r; } diff --git a/odb/relational/sqlite/context.hxx b/odb/relational/sqlite/context.hxx index 968767f..7c5107e 100644 --- a/odb/relational/sqlite/context.hxx +++ b/odb/relational/sqlite/context.hxx @@ -73,7 +73,10 @@ namespace relational grow_impl (semantics::data_member&); virtual bool - grow_impl (semantics::data_member&, semantics::type&, string const&); + grow_impl (semantics::data_member&, + semantics::type&, + const custom_cxx_type*, + string const&); protected: virtual string diff --git a/odb/validator.cxx b/odb/validator.cxx index a843b59..a76848f 100644 --- a/odb/validator.cxx +++ b/odb/validator.cxx @@ -1227,11 +1227,11 @@ namespace } virtual void - traverse_container (semantics::data_member& m, semantics::type& t) + traverse_container (semantics::data_member& m, semantics::type&) { traverse_simple (m); // Do simple value tests. - if (semantics::class_* c = object_pointer (container_vt (t))) + if (semantics::class_* c = object_pointer (container_vt (m))) { // Pointer must be deleted before the pointed-to object. // -- cgit v1.1