diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2013-09-16 10:17:08 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2013-09-16 10:17:08 +0200 |
commit | 565ad74e164abdaaa31de146a1ef76f3d3f6734d (patch) | |
tree | 208af5125fa342c06cbcd962c4cecbb8eb2f4fe6 /odb/relational/pgsql | |
parent | f6eda10b4014ea75af1be88ab3498618e390ea47 (diff) |
Implement summary soft-deletion for composite value types
Diffstat (limited to 'odb/relational/pgsql')
-rw-r--r-- | odb/relational/pgsql/source.cxx | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/odb/relational/pgsql/source.cxx b/odb/relational/pgsql/source.cxx index a287dd2..b625524 100644 --- a/odb/relational/pgsql/source.cxx +++ b/odb/relational/pgsql/source.cxx @@ -308,11 +308,28 @@ namespace relational os << "// " << mi.m.name () << endl << "//" << endl; + semantics::class_* comp (composite (mi.t)); + // If the member is soft- added or deleted, check the version. // unsigned long long av (added (mi.m)); unsigned long long dv (deleted (mi.m)); + // If this is a composite member, see if it is summarily + // added/deleted. + // + if (comp != 0) + { + unsigned long long cav (added (*comp)); + unsigned long long cdv (deleted (*comp)); + + if (cav != 0 && (av == 0 || av < cav)) + av = cav; + + if (cdv != 0 && (dv == 0 || dv > cdv)) + dv = cdv; + } + // If the addition/deletion version is the same as the section's, // then we don't need the test. // @@ -349,10 +366,25 @@ namespace relational virtual void post (member_info& mi) { + semantics::class_* comp (composite (mi.t)); + if (var_override_.empty ()) { unsigned long long av (added (mi.m)); unsigned long long dv (deleted (mi.m)); + + if (comp != 0) + { + unsigned long long cav (added (*comp)); + unsigned long long cdv (deleted (*comp)); + + if (cav != 0 && (av == 0 || av < cav)) + av = cav; + + if (cdv != 0 && (dv == 0 || dv > cdv)) + dv = cdv; + } + if (user_section* s = dynamic_cast<user_section*> (section_)) { if (av == added (*s->member)) @@ -366,8 +398,8 @@ namespace relational os << "}"; } - if (semantics::class_* c = composite (mi.t)) - index_ += column_count (*c).total; + if (comp != 0) + index_ += column_count (*comp).total; else index_++; } |