aboutsummaryrefslogtreecommitdiff
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
parenta2bd159c93aced832cae1927c32703d3306d1b03 (diff)
Schema versioning support for rest of database
-rw-r--r--odb/relational/mssql/source.cxx25
-rw-r--r--odb/relational/mysql/source.cxx59
-rw-r--r--odb/relational/source.cxx42
-rw-r--r--odb/relational/source.hxx24
-rw-r--r--odb/relational/sqlite/source.cxx59
5 files changed, 165 insertions, 44 deletions
diff --git a/odb/relational/mssql/source.cxx b/odb/relational/mssql/source.cxx
index ffc5897..8274b50 100644
--- a/odb/relational/mssql/source.cxx
+++ b/odb/relational/mssql/source.cxx
@@ -789,13 +789,17 @@ namespace relational
struct statement_columns_common: context
{
void
- process (relational::statement_columns& cols, statement_kind sk)
+ process (relational::statement_columns& cols,
+ statement_kind sk,
+ bool dynamic)
{
using relational::statement_columns;
- // Long data columns must come last in the SELECT statement.
+ // Long data columns must come last in the SELECT statement. If
+ // this statement is going to be processed at runtime, then this
+ // will be taken care of then.
//
- if (sk != statement_select)
+ if (sk != statement_select || dynamic)
return;
// Go over the columns list while keeping track of how many
@@ -839,9 +843,10 @@ namespace relational
virtual void
process_statement_columns (relational::statement_columns& cols,
- statement_kind sk)
+ statement_kind sk,
+ bool dynamic)
{
- statement_columns_common::process (cols, sk);
+ statement_columns_common::process (cols, sk, dynamic);
}
};
entry<container_traits> container_traits_;
@@ -859,9 +864,10 @@ namespace relational
virtual void
process_statement_columns (relational::statement_columns& cols,
- statement_kind sk)
+ statement_kind sk,
+ bool dynamic)
{
- statement_columns_common::process (cols, sk);
+ statement_columns_common::process (cols, sk, dynamic);
}
virtual string
@@ -1065,9 +1071,10 @@ namespace relational
virtual void
process_statement_columns (relational::statement_columns& cols,
- statement_kind sk)
+ statement_kind sk,
+ bool dynamic)
{
- statement_columns_common::process (cols, sk);
+ statement_columns_common::process (cols, sk, dynamic);
}
virtual string
diff --git a/odb/relational/mysql/source.cxx b/odb/relational/mysql/source.cxx
index e9cb6cc..df7f19c 100644
--- a/odb/relational/mysql/source.cxx
+++ b/odb/relational/mysql/source.cxx
@@ -327,15 +327,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
@@ -347,10 +400,10 @@ namespace relational
{
os << "if (composite_value_traits< " << mi.fq_type () <<
", id_mysql >::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
diff --git a/odb/relational/source.cxx b/odb/relational/source.cxx
index 796fc13..7a0627d 100644
--- a/odb/relational/source.cxx
+++ b/odb/relational/source.cxx
@@ -668,7 +668,7 @@ traverse_object (type& c)
statement_kind sk (statement_insert); // Imperfect forwarding.
instance<object_columns> ct (sk, sc);
ct->traverse (c);
- process_statement_columns (sc, statement_insert);
+ process_statement_columns (sc, statement_insert, versioned);
}
bool dv (sc.empty ()); // The DEFAULT VALUES syntax.
@@ -757,7 +757,7 @@ traverse_object (type& c)
object_section* s (&main_section); // Imperfect forwarding.
instance<object_columns> t (qtable, sk, sc, d, s);
t->traverse (c);
- process_statement_columns (sc, statement_select);
+ process_statement_columns (sc, statement_select, versioned);
find_column_counts[poly_depth - d] = sc.size ();
}
@@ -863,7 +863,7 @@ traverse_object (type& c)
if (opt != 0)
t->traverse (*opt);
- process_statement_columns (sc, statement_select);
+ process_statement_columns (sc, statement_select, false);
}
os << "const char " << traits << "::" << endl
@@ -910,7 +910,7 @@ traverse_object (type& c)
object_section* s (&main_section); // Imperfect forwarding.
instance<object_columns> t (sk, sc, p, s);
t->traverse (c);
- process_statement_columns (sc, statement_update);
+ process_statement_columns (sc, statement_update, versioned);
}
os << "const char " << traits << "::update_statement[] =" << endl
@@ -1022,15 +1022,6 @@ traverse_object (type& c)
{
// query_statement
//
- statement_columns sc;
- {
- statement_kind sk (statement_select); //@@ Imperfect forwarding.
- object_section* s (&main_section); //@@ Imperfect forwarding.
- instance<object_columns> oc (qtable, sk, sc, poly_depth, s);
- oc->traverse (c);
- process_statement_columns (sc, statement_select);
- }
-
strings joins;
if (poly_depth != 1)
{
@@ -1054,6 +1045,16 @@ traverse_object (type& c)
query_optimize = !joins.empty ();
+ statement_columns sc;
+ {
+ statement_kind sk (statement_select); //@@ Imperfect forwarding.
+ object_section* s (&main_section); //@@ Imperfect forwarding.
+ instance<object_columns> oc (qtable, sk, sc, poly_depth, s);
+ oc->traverse (c);
+ process_statement_columns (
+ sc, statement_select, versioned || query_optimize);
+ }
+
string sep (versioned || query_optimize ? "\n" : " ");
os << "const char " << traits << "::query_statement[] =" << endl
@@ -4318,13 +4319,6 @@ traverse_view (type& c)
}
else // vq.kind == view_query::condition
{
- statement_columns sc;
- {
- instance<view_columns> t (sc);
- t->traverse (c);
- process_statement_columns (sc, statement_select);
- }
-
// Generate the from-list.
//
strings from;
@@ -4828,6 +4822,14 @@ traverse_view (type& c)
}
} // End JOIN-generating for-loop.
+ statement_columns sc;
+ {
+ instance<view_columns> t (sc);
+ t->traverse (c);
+ process_statement_columns (
+ sc, statement_select, versioned || query_optimize);
+ }
+
string sep (versioned || query_optimize ? "\n" : " ");
os << "query_base_type r (" << endl
diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx
index 1ea6d3f..642c5ac 100644
--- a/odb/relational/source.hxx
+++ b/odb/relational/source.hxx
@@ -2127,7 +2127,9 @@ namespace relational
}
virtual void
- process_statement_columns (statement_columns&, statement_kind)
+ process_statement_columns (statement_columns&,
+ statement_kind,
+ bool /*dynamic*/)
{
}
@@ -2358,7 +2360,7 @@ namespace relational
}
}
- process_statement_columns (sc, statement_select);
+ process_statement_columns (sc, statement_select, versioned);
os << strlit ("SELECT" + sep) << endl;
@@ -2415,7 +2417,7 @@ namespace relational
t->traverse (m, vt, "value", "value");
- process_statement_columns (sc, statement_select);
+ process_statement_columns (sc, statement_select, versioned);
os << strlit ("SELECT" + sep) << endl;
@@ -2495,7 +2497,7 @@ namespace relational
t->traverse (m, vt, "value", "value");
- process_statement_columns (sc, statement_insert);
+ process_statement_columns (sc, statement_insert, versioned);
os << strlit ("INSERT INTO " + qtable + sep) << endl;
@@ -2551,7 +2553,7 @@ namespace relational
statement_kind sk (statement_update); // Imperfect forwarding.
instance<object_columns> t (sk, f, sc, p);
t->traverse (m, vt, "value", "value");
- process_statement_columns (sc, statement_update);
+ process_statement_columns (sc, statement_update, versioned);
}
for (statement_columns::const_iterator i (sc.begin ()),
@@ -4135,7 +4137,9 @@ namespace relational
}
virtual void
- process_statement_columns (statement_columns&, statement_kind)
+ process_statement_columns (statement_columns&,
+ statement_kind,
+ bool /*dynamic*/)
{
}
@@ -4605,7 +4609,7 @@ namespace relational
object_section* ps (&s); // Imperfect forwarding.
instance<object_columns> t (qtable, sk, sc, depth, ps);
t->traverse (c_);
- process_statement_columns (sc, statement_select);
+ process_statement_columns (sc, statement_select, s.versioned);
}
os << "const char " << scope << "::" << endl
@@ -4675,7 +4679,7 @@ namespace relational
object_section* ps (&s); // Imperfect forwarding.
instance<object_columns> t (sk, sc, p, ps);
t->traverse (c_);
- process_statement_columns (sc, statement_update);
+ process_statement_columns (sc, statement_update, s.versioned);
}
os << "const char " << scope << "::" << endl
@@ -5349,7 +5353,9 @@ namespace relational
}
virtual void
- process_statement_columns (statement_columns&, statement_kind)
+ process_statement_columns (statement_columns&,
+ statement_kind,
+ bool /*dynamic*/)
{
}
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