From 654826cdafaac4199c8a8c90ef3396e312f0944f Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 5 Sep 2013 13:02:10 +0200 Subject: Versioned section support --- odb/context.cxx | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 58 insertions(+), 8 deletions(-) (limited to 'odb/context.cxx') diff --git a/odb/context.cxx b/odb/context.cxx index ad0b889..bbde65a 100644 --- a/odb/context.cxx +++ b/odb/context.cxx @@ -342,6 +342,13 @@ count (unsigned short f) const (f & count_special_version) == 0) continue; + // Skip non-versioned sections if we are only interested in the + // versioned ones. + // + if ((f & count_versioned_only) != 0 && + !context::added (*i->member) && !context::deleted (*i->member)) + continue; + bool ovd (i->base != 0 && poly_derived); if (i->load != user_section::load_eager) @@ -2402,8 +2409,25 @@ namespace if (discriminator (m)) c_.discriminator++; - if (added (member_path_) || deleted (member_path_)) - c_.soft++; + { + unsigned long long av (added (member_path_)); + unsigned long long dv (deleted (member_path_)); + + // If the addition/deletion version is the same as the section's, + // then don't count. + // + if (user_section* s = dynamic_cast (section_)) + { + if (av == added (*s->member)) + av = 0; + + if (dv == deleted (*s->member)) + dv = 0; + } + + if (av != 0 || dv != 0) + c_.soft++; + } if (separate_load (member_path_)) c_.separate_load++; @@ -2482,8 +2506,7 @@ namespace // Ignore added/deleted members if so requested. // - if (((flags_ & exclude_added) != 0 && added (member_path_)) || - ((flags_ & exclude_deleted) != 0 && deleted (member_path_))) + if (check_soft ()) return; if (context::is_a (member_path_, member_scope_, flags_)) @@ -2497,8 +2520,7 @@ namespace { // Ignore added/deleted members if so requested. // - if (((flags_ & exclude_added) != 0 && added (member_path_)) || - ((flags_ & exclude_deleted) != 0 && deleted (member_path_))) + if (check_soft ()) return; if (context::is_a (member_path_, member_scope_, flags_)) @@ -2510,8 +2532,7 @@ namespace { // Ignore added/deleted members if so requested. // - if (((flags_ & exclude_added) != 0 && added (member_path_)) || - ((flags_ & exclude_deleted) != 0 && deleted (member_path_))) + if (check_soft ()) return; // Ignore versioned containers if so requested. @@ -2546,6 +2567,35 @@ namespace } private: + bool + check_soft () + { + if ((flags_ & exclude_added) != 0 || (flags_ & exclude_deleted) != 0) + { + unsigned long long av (added (member_path_)); + unsigned long long dv (deleted (member_path_)); + + // If the addition/deletion version is the same as the section's, + // then don't exclude. + // + if (user_section* s = dynamic_cast (section_)) + { + if (av == added (*s->member)) + av = 0; + + if (dv == deleted (*s->member)) + dv = 0; + } + + if ((av != 0 && (flags_ & exclude_added) != 0) || + (dv != 0 && (flags_ & exclude_deleted) != 0)) + return true; + } + + return false; + } + + private: size_t r_; unsigned short flags_; }; -- cgit v1.1