From 5ecb61d9ee61a53ddbba6b9dea93e7a4adc448b8 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 10 Sep 2013 14:09:54 +0200 Subject: Schema versioning support for rest of database --- odb/relational/mssql/source.cxx | 25 +++++++++++------ odb/relational/mysql/source.cxx | 59 ++++++++++++++++++++++++++++++++++++++-- odb/relational/source.cxx | 42 ++++++++++++++-------------- odb/relational/source.hxx | 24 ++++++++++------ odb/relational/sqlite/source.cxx | 59 ++++++++++++++++++++++++++++++++++++++-- 5 files changed, 165 insertions(+), 44 deletions(-) (limited to 'odb') 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_; @@ -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 (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 (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 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 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 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 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 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 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 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 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 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 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 (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 (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 -- cgit v1.1