From 2fe7a723c0b98d23531a76d9c1a451e3a57bf0c5 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 17 Nov 2010 18:05:06 +0200 Subject: Add support for unidirectional object relationships New test: common/relationship. --- odb/context.cxx | 64 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) (limited to 'odb/context.cxx') diff --git a/odb/context.cxx b/odb/context.cxx index 552bc28..285d610 100644 --- a/odb/context.cxx +++ b/odb/context.cxx @@ -168,7 +168,8 @@ column_type (semantics::data_member& m, string const& kp) const string context::data:: column_type_impl (semantics::type& t, string const& type, - semantics::context* ctx) const + semantics::context& ctx, + column_type_flags f) const { if (!type.empty ()) return type; @@ -180,7 +181,14 @@ column_type_impl (semantics::type& t, type_map_type::const_iterator i (type_map_.find (name)); if (i != type_map_.end ()) - return ctx != 0 && ctx->count ("id") ? i->second.id_type : i->second.type; + { + string r (ctx.count ("id") ? i->second.id_type : i->second.type); + + if ((f & ctf_default_null) == 0) + r += " NOT NULL"; + + return r; + } return string (); } @@ -387,6 +395,58 @@ id_member (semantics::class_& c) return *c.get ("id-member"); } +namespace +{ + struct has_a_impl: object_members_base + { + has_a_impl (unsigned short flags) + : r_ (false), flags_ (flags) + { + } + + bool + result () const + { + return r_; + } + + virtual void + simple (semantics::data_member& m) + { + r_ = r_ || context::is_a (m, flags_); + } + + private: + bool r_; + unsigned short flags_; + }; +} + +bool context:: +is_a (semantics::data_member& m, + unsigned short f, + semantics::type&, + string const& kp) +{ + bool r (false); + + if (f & eager_pointer) + { + r = r || object_pointer (m, kp); + } + + return r; +} + +bool context:: +has_a (semantics::type& t, unsigned short flags) +{ + has_a_impl impl (flags); + impl.dispatch (t); + return impl.result (); +} + + // namespace // -- cgit v1.1