summaryrefslogtreecommitdiff
path: root/odb/relational/sqlite
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-09-10 14:09:54 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-09-10 14:09:54 +0200
commit5ecb61d9ee61a53ddbba6b9dea93e7a4adc448b8 (patch)
tree825ac9d4048faa0044f389bc6dd8e270731a0176 /odb/relational/sqlite
parenta2bd159c93aced832cae1927c32703d3306d1b03 (diff)
Schema versioning support for rest of database
Diffstat (limited to 'odb/relational/sqlite')
-rw-r--r--odb/relational/sqlite/source.cxx59
1 files changed, 56 insertions, 3 deletions
diff --git a/odb/relational/sqlite/source.cxx b/odb/relational/sqlite/source.cxx
index d8d2cc4..09b5de7 100644
--- a/odb/relational/sqlite/source.cxx
+++ b/odb/relational/sqlite/source.cxx
@@ -104,15 +104,68 @@ namespace relational
e = ostr.str ();
if (var_override_.empty ())
+ {
os << "// " << mi.m.name () << endl
<< "//" << endl;
+ // 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 the addition/deletion version is the same as the section's,
+ // then we don't need the test.
+ //
+ if (user_section* s = dynamic_cast<user_section*> (section_))
+ {
+ if (av == added (*s->member))
+ av = 0;
+
+ if (dv == deleted (*s->member))
+ dv = 0;
+ }
+
+ if (av != 0 || dv != 0)
+ {
+ os << "if (";
+
+ if (av != 0)
+ os << "svm >= schema_version_migration (" << av << "ULL, true)";
+
+ if (av != 0 && dv != 0)
+ os << " &&" << endl;
+
+ if (dv != 0)
+ os << "svm <= schema_version_migration (" << dv << "ULL, true)";
+
+ os << ")"
+ << "{";
+ }
+ }
+
return true;
}
virtual void
post (member_info& mi)
{
+ if (var_override_.empty ())
+ {
+ unsigned long long av (added (mi.m));
+ unsigned long long dv (deleted (mi.m));
+ if (user_section* s = dynamic_cast<user_section*> (section_))
+ {
+ if (av == added (*s->member))
+ av = 0;
+
+ if (dv == deleted (*s->member))
+ dv = 0;
+ }
+
+ if (av != 0 || dv != 0)
+ os << "}";
+ }
+
if (semantics::class_* c = composite (mi.t))
index_ += column_count (*c).total;
else
@@ -124,10 +177,10 @@ namespace relational
{
os << "if (composite_value_traits< " << mi.fq_type () <<
", id_sqlite >::grow (" << endl
- << "i." << mi.var << "value, t + " << index_ << "UL))"
- << "{"
+ << "i." << mi.var << "value, t + " << index_ << "UL" <<
+ (versioned (*composite (mi.t)) ? ", svm" : "") << "))" << endl
<< "grew = true;"
- << "}";
+ << endl;
}
virtual void