diff options
Diffstat (limited to 'odb/relational/oracle')
-rw-r--r-- | odb/relational/oracle/common.cxx | 27 | ||||
-rw-r--r-- | odb/relational/oracle/common.hxx | 30 | ||||
-rw-r--r-- | odb/relational/oracle/schema.cxx | 3 | ||||
-rw-r--r-- | odb/relational/oracle/source.cxx | 27 |
4 files changed, 64 insertions, 23 deletions
diff --git a/odb/relational/oracle/common.cxx b/odb/relational/oracle/common.cxx index cf8ba6c..f7dddf2 100644 --- a/odb/relational/oracle/common.cxx +++ b/odb/relational/oracle/common.cxx @@ -33,14 +33,20 @@ namespace relational var = name + (name[name.size () - 1] == '_' ? "" : "_"); } - semantics::type& t (type_override_ != 0 ? *type_override_ : m.type ()); + bool cq (type_override_ != 0 ? false: const_type (m.type ())); + semantics::type& t (type_override_ != 0 ? *type_override_ : utype (m)); if (semantics::class_* c = composite_wrapper (t)) { // If t is a wrapper, pass the wrapped type. Also pass the // original, wrapper type. // - member_info mi (m, *c, (wrapper (t) ? &t : 0), var, fq_type_override_); + member_info mi (m, + *c, + (wrapper (t) ? &t : 0), + cq, + var, + fq_type_override_); if (pre (mi)) { traverse_composite (mi); @@ -51,7 +57,12 @@ namespace relational { // The same unwrapping logic as for composite values. // - member_info mi (m, *c, (wrapper (t) ? &t : 0), var, fq_type_override_); + member_info mi (m, + *c, + (wrapper (t) ? &t : 0), + cq, + var, + fq_type_override_); if (pre (mi)) { traverse_container (mi); @@ -64,8 +75,12 @@ namespace relational if (semantics::class_* c = object_pointer (t)) { - member_info mi ( - m, id_member (*c)->type (), 0, var, fq_type_override_); + member_info mi (m, + utype (*id_member (*c)), + 0, + cq, + var, + fq_type_override_); mi.st = &st; if (pre (mi)) { @@ -75,7 +90,7 @@ namespace relational } else { - member_info mi (m, t, 0, var, fq_type_override_); + member_info mi (m, t, 0, cq, var, fq_type_override_); mi.st = &st; if (pre (mi)) { diff --git a/odb/relational/oracle/common.hxx b/odb/relational/oracle/common.hxx index 1bd52e8..55768b4 100644 --- a/odb/relational/oracle/common.hxx +++ b/odb/relational/oracle/common.hxx @@ -29,9 +29,13 @@ namespace relational struct member_info { semantics::data_member& m; // Member. - semantics::type& t; // Member C++ type (m.type () may != t). - semantics::type* wrapper; // Wrapper type if member is a wrapper. + semantics::type& t; // Cvr-unqualified member C++ type, note + // that m.type () may not be the same as t. + semantics::type* wrapper; // Wrapper type if member is a composite or + // container wrapper, also cvr-unqualified. // In this case t is the wrapped type. + bool cq; // True if the original (wrapper) type + // is const-qualified. sql_type const* st; // Member SQL type (only simple values). string& var; // Member variable name with trailing '_'. @@ -40,21 +44,29 @@ namespace relational string fq_type (bool unwrap = true) const { + semantics::names* hint; + if (wrapper != 0 && unwrap) { - // Use the hint from the wrapper. + // Use the hint from the wrapper unless the wrapped type + // is qualified. // - return t.fq_name ( - wrapper->get<semantics::names*> ("wrapper-hint")); + hint = wrapper->get<semantics::names*> ("wrapper-hint"); + utype (*context::wrapper (*wrapper), hint); + return t.fq_name (hint); } // Use the original type from 'm' instead of 't' since the hint // may be invalid for a different type. Plus, if a type is // overriden, then the fq_type must be as well. // - return fq_type_.empty () - ? m.type ().fq_name (m.belongs ().hint ()) - : fq_type_; + if (fq_type_.empty ()) + { + semantics::type& t (utype (m, hint)); + return t.fq_name (hint); + } + else + return fq_type_; } string const& fq_type_; @@ -62,11 +74,13 @@ namespace relational member_info (semantics::data_member& m_, semantics::type& t_, semantics::type* wrapper_, + bool cq_, string& var_, string const& fq_type) : m (m_), t (t_), wrapper (wrapper_), + cq (cq_), st (0), var (var_), fq_type_ (fq_type) diff --git a/odb/relational/oracle/schema.cxx b/odb/relational/oracle/schema.cxx index 2eb44d6..8469761 100644 --- a/odb/relational/oracle/schema.cxx +++ b/odb/relational/oracle/schema.cxx @@ -201,7 +201,8 @@ namespace relational if (inverse (m)) return false; - if (semantics::class_* c = object_pointer (member_type (m, prefix_))) + if (semantics::class_* c = + object_pointer (member_utype (m, prefix_))) { pre_statement (); diff --git a/odb/relational/oracle/source.cxx b/odb/relational/oracle/source.cxx index ad58bb0..800de57 100644 --- a/odb/relational/oracle/source.cxx +++ b/odb/relational/oracle/source.cxx @@ -377,7 +377,7 @@ namespace relational // When handling a pointer, mi.t is the id type of the referenced // object. // - semantics::type& mt (member_type (mi.m, key_prefix_)); + semantics::type& mt (member_utype (mi.m, key_prefix_)); if (semantics::class_* c = object_pointer (mt)) { @@ -450,7 +450,7 @@ namespace relational // When handling a pointer, mi.t is the id type of the referenced // object. // - if (object_pointer (member_type (mi.m, key_prefix_))) + if (object_pointer (member_utype (mi.m, key_prefix_))) { os << "}"; @@ -609,6 +609,10 @@ namespace relational string const& name (mi.m.name ()); member = "o." + name; + if (mi.cq) + member = "const_cast< " + mi.fq_type (false) + "& > (" + + member + ")"; + os << "// " << name << endl << "//" << endl; } @@ -622,7 +626,7 @@ namespace relational // Here we need the wrapper type, not the wrapped type. // member = "wrapper_traits< " + mi.fq_type (false) + " >::" + - "set_ref (" + member + ")"; + "set_ref (\n" + member + ")"; } if (composite (mi.t)) @@ -632,7 +636,7 @@ namespace relational // When handling a pointer, mi.t is the id type of the referenced // object. // - semantics::type& mt (member_type (mi.m, key_prefix_)); + semantics::type& mt (member_utype (mi.m, key_prefix_)); if (semantics::class_* c = object_pointer (mt)) { @@ -683,13 +687,20 @@ namespace relational // When handling a pointer, mi.t is the id type of the referenced // object. // - semantics::type& mt (member_type (mi.m, key_prefix_)); + semantics::type& mt (member_utype (mi.m, key_prefix_)); if (object_pointer (mt)) { - member = member_override_.empty () - ? "o." + mi.m.name () - : member_override_; + if (!member_override_.empty ()) + member = member_override_; + else + { + member = "o." + mi.m.name (); + + if (mi.cq) + member = "const_cast< " + mi.fq_type (false) + "& > (" + + member + ")"; + } if (lazy_pointer (mt)) os << member << " = ptr_traits::pointer_type (db, id);"; |