aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--odb/context.cxx7
-rw-r--r--odb/context.hxx4
-rw-r--r--odb/processor.cxx52
-rw-r--r--odb/relational/header.cxx6
-rw-r--r--odb/relational/header.hxx109
-rw-r--r--odb/relational/inline.hxx12
-rw-r--r--odb/relational/source.cxx64
-rw-r--r--odb/relational/source.hxx259
8 files changed, 379 insertions, 134 deletions
diff --git a/odb/context.cxx b/odb/context.cxx
index af07007..ad0b889 100644
--- a/odb/context.cxx
+++ b/odb/context.cxx
@@ -2506,7 +2506,7 @@ namespace
}
virtual void
- traverse_container (semantics::data_member&, semantics::type& c)
+ traverse_container (semantics::data_member& m, semantics::type& c)
{
// Ignore added/deleted members if so requested.
//
@@ -2514,6 +2514,11 @@ namespace
((flags_ & exclude_deleted) != 0 && deleted (member_path_)))
return;
+ // Ignore versioned containers if so requested.
+ //
+ if ((flags_ & exclude_versioned) != 0 && versioned (m))
+ return;
+
// We don't cross the container boundaries (separate table).
//
unsigned short f (flags_ & (context::test_container |
diff --git a/odb/context.hxx b/odb/context.hxx
index 9c52282..9bd0057 100644
--- a/odb/context.hxx
+++ b/odb/context.hxx
@@ -1317,6 +1317,10 @@ public:
static unsigned short const test_readwrite_container = 0x80;
static unsigned short const test_smart_container = 0x100;
+ // Exclude versioned containers.
+ //
+ static unsigned short const exclude_versioned = 0x200;
+
// Treat eager loaded members as belonging to the main section.
// If this flag is specified, then section must be main_section.
//
diff --git a/odb/processor.cxx b/odb/processor.cxx
index 8c4efaf..14370c4 100644
--- a/odb/processor.cxx
+++ b/odb/processor.cxx
@@ -1657,12 +1657,54 @@ namespace
t.set ("key-not-null", true);
}
- // Check if we are versioned.
+ // Check if we are versioned. For now we are not allowing for
+ // soft-add/delete in container keys (might be used in WHERE,
+ // primary key).
//
- // @@ TODO
- //
- if (force_versioned)
- t.set ("versioned", true);
+ {
+ semantics::class_* comp;
+ switch (ck)
+ {
+ case ck_ordered:
+ {
+ comp = composite (*vt);
+ break;
+ }
+ case ck_map:
+ case ck_multimap:
+ {
+ comp = composite (*kt);
+ if (comp == 0 || column_count (*comp).soft == 0)
+ {
+ comp = composite (*vt);
+ break;
+ }
+
+ error (m.location ()) << "map key type cannot have soft-" <<
+ "added/deleted data members" << endl;
+ info (kt->location ()) << "key type is defined here" << endl;
+ throw operation_failed ();
+ }
+ case ck_set:
+ case ck_multiset:
+ {
+ comp = composite (*vt);
+ if (comp == 0 || column_count (*comp).soft == 0)
+ {
+ comp = 0;
+ break;
+ }
+
+ error (m.location ()) << "set value type cannot have soft-" <<
+ "added/deleted data members" << endl;
+ info (vt->location ()) << "value type is defined here" << endl;
+ throw operation_failed ();
+ }
+ }
+
+ if (force_versioned || (comp != 0 && column_count (*comp).soft != 0))
+ t.set ("versioned", true);
+ }
}
// Process member data.
diff --git a/odb/relational/header.cxx b/odb/relational/header.cxx
index f3df52b..8c37eb0 100644
--- a/odb/relational/header.cxx
+++ b/odb/relational/header.cxx
@@ -657,7 +657,11 @@ traverse_object (type& c)
os << "static void" << endl
<< "load_ (statements_type&," << endl
<< "object_type&," << endl
- << "bool reload = false";
+ << "bool reload";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
if (poly_derived)
os << "," << endl
diff --git a/odb/relational/header.hxx b/odb/relational/header.hxx
index 4aab05c..3a4d244 100644
--- a/odb/relational/header.hxx
+++ b/odb/relational/header.hxx
@@ -242,7 +242,7 @@ namespace relational
// Figure out column counts.
//
size_t id_columns, value_columns, data_columns, cond_columns;
- bool versioned;
+ bool versioned (context::versioned (m));
if (!reuse_abst)
{
@@ -324,8 +324,6 @@ namespace relational
data_columns += value_columns;
}
- versioned = context::versioned (m);
-
// Store column counts for the source generator.
//
m.set ("id-column-count", id_columns);
@@ -586,26 +584,47 @@ namespace relational
<< "bind (" << bind_vector << "," << endl
<< "const " << bind_vector << " id," << endl
<< "std::size_t id_size," << endl
- << "data_image_type&);"
+ << "data_image_type&";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ");"
<< endl;
// bind (cond_image, data_image) (update)
//
if (smart)
+ {
os << "static void" << endl
<< "bind (" << bind_vector << "," << endl
<< "const " << bind_vector << " id," << endl
<< "std::size_t id_size," << endl
<< "cond_image_type&," << endl
- << "data_image_type&);"
+ << "data_image_type&";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ");"
<< endl;
+ }
// grow ()
//
if (generate_grow)
{
os << "static void" << endl
- << "grow (data_image_type&, " << truncated_vector << ");"
+ << "grow (data_image_type&," << endl
+ << truncated_vector;
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ");"
<< endl;
}
@@ -613,33 +632,36 @@ namespace relational
//
if (!inverse)
{
- os << "static void" << endl;
+ os << "static void" << endl
+ << "init (data_image_type&," << endl;
switch (ck)
{
case ck_ordered:
{
if (ordered)
- os << "init (data_image_type&, index_type*, const value_type&);";
- else
- os << "init (data_image_type&, const value_type&);";
+ os << "index_type*," << endl;
break;
}
case ck_map:
case ck_multimap:
{
- os << "init (data_image_type&, const key_type*, const value_type&);";
+ os << "const key_type*," << endl;
break;
}
case ck_set:
case ck_multiset:
- {
- os << "init (data_image_type&, const value_type&);";
- break;
- }
+ break;
}
- os << endl;
+ os << "const value_type&";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ");"
+ << endl;
}
// init (cond_image)
@@ -674,33 +696,37 @@ namespace relational
// init (data)
//
- os << "static void" << endl;
+ os << "static void" << endl
+ << "init (";
switch (ck)
{
case ck_ordered:
{
if (ordered)
- os << "init (index_type&, value_type&, ";
- else
- os << "init (value_type&, ";
+ os << "index_type&," << endl;
break;
}
case ck_map:
case ck_multimap:
{
- os << "init (key_type&, value_type&, ";
+ os << "key_type&," << endl;
break;
}
case ck_set:
case ck_multiset:
- {
- os << "init (value_type&, ";
- break;
- }
+ break;
}
- os << "const data_image_type&, database*);"
+ os << "value_type&," << endl;
+ os << "const data_image_type&," << endl
+ << "database*";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ");"
<< endl;
// insert
@@ -820,22 +846,47 @@ namespace relational
// persist
//
if (!inverse)
+ {
os << "static void" << endl
- << "persist (const container_type&, statements_type&);"
+ << "persist (const container_type&," << endl
+ << "statements_type&";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ");"
<< endl;
+ }
// load
//
os << "static void" << endl
- << "load (container_type&, statements_type&);"
+ << "load (container_type&," << endl
+ << "statements_type&";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ");"
<< endl;
// update
//
if (!(inverse || readonly (member_path_, member_scope_)))
+ {
os << "static void" << endl
- << "update (const container_type&, statements_type&);"
+ << "update (const container_type&," << endl
+ << "statements_type&";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ");"
<< endl;
+ }
// erase
//
diff --git a/odb/relational/inline.hxx b/odb/relational/inline.hxx
index 8bdf5a6..f5c5102 100644
--- a/odb/relational/inline.hxx
+++ b/odb/relational/inline.hxx
@@ -53,7 +53,7 @@ namespace relational
if (av != 0)
os << "svm >= schema_version_migration (" << av << "ULL, true)";
- if (av != 0 || dv != 0)
+ if (av != 0 && dv != 0)
os << " &&" << endl;
if (dv != 0)
@@ -222,6 +222,8 @@ namespace relational
bool abst (abstract (c));
bool reuse_abst (abst && !poly);
+ bool versioned (context::versioned (c));
+
string const& type (class_fq_name (c));
string traits ("access::object_traits_impl< " + type + ", id_" +
db.string () + " >");
@@ -413,7 +415,13 @@ namespace relational
<< "void " << traits << "::" << endl
<< "load_ (statements_type&," << endl
<< "object_type& obj," << endl
- << "bool)"
+ << "bool";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration&";
+
+ os << ")"
<< "{"
<< "ODB_POTENTIALLY_UNUSED (obj);"
<< endl;
diff --git a/odb/relational/source.cxx b/odb/relational/source.cxx
index 4363dcb..0a8b224 100644
--- a/odb/relational/source.cxx
+++ b/odb/relational/source.cxx
@@ -1091,7 +1091,12 @@ traverse_object (type& c)
// persist ()
//
- bool persist_containers (has_a (c, test_straight_container));
+ size_t persist_containers (has_a (c, test_straight_container));
+ bool persist_versioned_containers (
+ persist_containers >
+ has_a (c,
+ test_straight_container |
+ exclude_deleted | exclude_added | exclude_versioned));
os << "void " << traits << "::" << endl
<< "persist (database& db, " << (auto_id ? "" : "const ") <<
@@ -1132,7 +1137,7 @@ traverse_object (type& c)
<< "throw abstract_class ();"
<< endl;
- if (versioned)
+ if (versioned || persist_versioned_containers)
os << "const schema_version_migration& svm (" <<
"db.schema_version_migration (" << schema_name << "));";
@@ -1369,9 +1374,16 @@ traverse_object (type& c)
//
if (id != 0 && (!readonly || poly))
{
- bool update_containers (
+ size_t update_containers (
has_a (c, test_readwrite_container, &main_section));
+ bool update_versioned_containers (
+ update_containers >
+ has_a (c,
+ test_readwrite_container |
+ exclude_deleted | exclude_added | exclude_versioned,
+ &main_section));
+
// See if we have any sections that we might have to update.
//
bool sections (false);
@@ -1437,6 +1449,11 @@ traverse_object (type& c)
<< endl;
}
+ if ((versioned && update_columns) || update_versioned_containers)
+ os << "const schema_version_migration& svm (" <<
+ "db.schema_version_migration (" << schema_name << "));"
+ << endl;
+
// If we have change-updated sections that contain change-tracking
// containers, then mark such sections as changed if any of the
// containers was changed. Do this before calling the base so that
@@ -1458,6 +1475,9 @@ traverse_object (type& c)
os << "// " << m.name () << endl
<< "//" << endl
+
+ //@@ TODO version check.
+
<< "{";
// Section access is always by reference.
@@ -1490,11 +1510,6 @@ traverse_object (type& c)
<< "}";
}
- if (versioned && update_columns)
- os << "const schema_version_migration& svm (" <<
- "db.schema_version_migration (" << schema_name << "));"
- << endl;
-
if (poly_derived)
{
bool readonly_base (context::readonly (*poly_base));
@@ -2535,7 +2550,7 @@ traverse_object (type& c)
if (delay_freeing_statement_result)
os << "ar.free ();";
- os << "load_ (sts, obj);";
+ os << "load_ (sts, obj, false" << (versioned ? ", svm" : "") << ");";
if (poly)
// Load the dynamic part of the object unless static and dynamic
@@ -2659,7 +2674,7 @@ traverse_object (type& c)
if (delay_freeing_statement_result)
os << "ar.free ();";
- os << "load_ (sts, obj);"
+ os << "load_ (sts, obj, false" << (versioned ? ", svm" : "") << ");"
<< rsts << ".load_delayed (" << (versioned ? "&svm" : "0") << ");"
<< "l.unlock ();"
<< "callback (db, obj, callback_event::post_load);"
@@ -2781,7 +2796,7 @@ traverse_object (type& c)
if (delay_freeing_statement_result)
os << "ar.free ();";
- os << "load_ (sts, obj, true);"
+ os << "load_ (sts, obj, true" << (versioned ? ", svm" : "") << ");"
<< rsts << ".load_delayed (" << (versioned ? "&svm" : "0") << ");"
<< "l.unlock ();"
<< "callback (db, obj, callback_event::post_load);"
@@ -3240,9 +3255,16 @@ traverse_object (type& c)
//
// Load containers, reset/reload sections.
//
- bool load_containers (
+ size_t load_containers (
has_a (c, test_container | include_eager_load, &main_section));
+ bool load_versioned_containers (
+ load_containers >
+ has_a (c,
+ test_container | include_eager_load |
+ exclude_deleted | exclude_added | exclude_versioned,
+ &main_section));
+
if (poly_derived ||
load_containers ||
uss.count (user_sections::count_new |
@@ -3254,18 +3276,25 @@ traverse_object (type& c)
<< "object_type& obj," << endl
<< "bool reload";
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
if (poly_derived)
os << "," << endl
<< "std::size_t d";
os << ")"
<< "{"
- << "ODB_POTENTIALLY_UNUSED (reload);"
- << endl;
+ << "ODB_POTENTIALLY_UNUSED (reload);";
+ if (versioned)
+ os << "ODB_POTENTIALLY_UNUSED (svm);";
+ os << endl;
if (poly_derived)
os << "if (--d != 0)" << endl
<< "base_traits::load_ (sts.base_statements (), obj, reload" <<
+ (context::versioned (*poly_base) ? ", svm" : "") <<
(poly_base != poly_root ? ", d" : "") << ");"
<< endl;
@@ -3277,6 +3306,11 @@ traverse_object (type& c)
if (load_containers)
{
+ if (load_versioned_containers && !versioned)
+ os << "const schema_version_migration& svm (" << endl
+ << "sts.connection ().database ().schema_version_migration (" <<
+ schema_name << "));";
+
instance<container_calls> t (container_calls::load_call, &main_section);
t->traverse (c);
}
@@ -3406,7 +3440,7 @@ traverse_object (type& c)
if (empty_depth != 0)
os << "}";
- os << "load_ (sts, obj, false, d);"
+ os << "load_ (sts, obj, false, " << (versioned ? "svm, " : "") << "d);"
<< "}";
}
diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx
index 453a620..06d781f 100644
--- a/odb/relational/source.hxx
+++ b/odb/relational/source.hxx
@@ -2174,6 +2174,8 @@ namespace relational
eager_ptr = has_a (*cvt, test_eager_pointer);
}
+ bool versioned (context::versioned (m));
+
string name (flat_prefix_ + public_name (m) + "_traits");
string scope (scope_ + "::" + name);
@@ -2188,7 +2190,6 @@ namespace relational
//
if (!reuse_abst)
{
- bool versioned (context::versioned (m));
string sep (versioned ? "\n" : " ");
semantics::type& idt (container_idt (m));
@@ -2641,7 +2642,13 @@ namespace relational
<< "bind (" << bind_vector << " b," << endl
<< "const " << bind_vector << " id," << endl
<< "std::size_t id_size," << endl
- << "data_image_type& d)"
+ << "data_image_type& d";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
+ os << ")"
<< "{"
<< "using namespace " << db << ";"
<< endl
@@ -2721,7 +2728,13 @@ namespace relational
<< "const " << bind_vector << " id," << endl
<< "std::size_t id_size," << endl
<< "cond_image_type& c," << endl
- << "data_image_type& d)"
+ << "data_image_type& d";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
+ os << ")"
<< "{"
<< "using namespace " << db << ";"
<< endl
@@ -2799,7 +2812,14 @@ namespace relational
size_t index (0);
os << "void " << scope << "::" << endl
- << "grow (data_image_type& i, " << truncated_vector << " t)"
+ << "grow (data_image_type& i," << endl
+ << truncated_vector << " t";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
+ os << ")"
<< "{"
<< "bool grew (false);"
<< endl;
@@ -2849,35 +2869,36 @@ namespace relational
//
if (!inverse)
{
- os << "void " << scope << "::" << endl;
+ os << "void " << scope << "::" << endl
+ << "init (data_image_type& i," << endl;
switch (ck)
{
case ck_ordered:
{
if (ordered)
- os << "init (data_image_type& i, index_type* j, " <<
- "const value_type& v)";
- else
- os << "init (data_image_type& i, const value_type& v)";
+ os << "index_type* j," << endl;
break;
}
case ck_map:
case ck_multimap:
{
- os << "init (data_image_type& i, const key_type* k, " <<
- "const value_type& v)";
+ os << "const key_type* k," << endl;
break;
}
case ck_set:
case ck_multiset:
- {
- os << "init (data_image_type& i, const value_type& v)";
- break;
- }
+ break;
}
- os << "{"
+ os << "const value_type& v";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
+ os << ")"
+ << "{"
<< "using namespace " << db << ";"
<< endl
<< "statement_kind sk (statement_insert);"
@@ -2987,23 +3008,45 @@ namespace relational
// init (data)
//
- os << "void " << scope << "::" << endl;
+ os << "void " << scope << "::" << endl
+ << "init (";
switch (ck)
{
case ck_ordered:
{
if (ordered)
- os << "init (index_type& j, value_type& v, " <<
- "const data_image_type& i, database* db)";
- else
- os << "init (value_type& v, const data_image_type& i, " <<
- "database* db)";
+ os << "index_type& j," << endl;
+ break;
+ }
+ case ck_map:
+ case ck_multimap:
+ {
+ os << "key_type& k," << endl;
+ break;
+ }
+ case ck_set:
+ case ck_multiset:
+ break;
+ }
- os << "{"
- << "ODB_POTENTIALLY_UNUSED (db);"
- << endl;
+ os << "value_type& v," << endl;
+ os << "const data_image_type& i," << endl
+ << "database* db";
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
+ os << ")"
+ << "{"
+ << "ODB_POTENTIALLY_UNUSED (db);"
+ << endl;
+
+ switch (ck)
+ {
+ case ck_ordered:
+ {
if (ordered)
{
os << "// index" << endl
@@ -3019,12 +3062,7 @@ namespace relational
case ck_map:
case ck_multimap:
{
- os << "init (key_type& k, value_type& v, " <<
- "const data_image_type& i, database* db)"
- << "{"
- << "ODB_POTENTIALLY_UNUSED (db);"
- << endl
- << "// key" << endl
+ os << "// key" << endl
<< "//" << endl;
instance<init_value_member> im (
@@ -3035,14 +3073,7 @@ namespace relational
}
case ck_set:
case ck_multiset:
- {
- os << "init (value_type& v, const data_image_type& i, " <<
- "database* db)"
- << "{"
- << "ODB_POTENTIALLY_UNUSED (db);"
- << endl;
- break;
- }
+ break;
}
os << "// value" << endl
@@ -3105,35 +3136,42 @@ namespace relational
os << "using namespace " << db << ";"
<< endl
<< "statements_type& sts (*static_cast< statements_type* > (d));"
- << "data_image_type& di (sts.data_image ());"
- << endl;
+ << "data_image_type& di (sts.data_image ());";
+
+ if (versioned)
+ os << "const schema_version_migration& svm (" <<
+ "sts.version_migration ());";
+
+ os << endl
+ << "init (di, ";
switch (ck)
{
case ck_ordered:
{
- os << "init (di, " << (ordered ? "&i, " : "") << "v);";
+ if (ordered)
+ os << "&i, ";
break;
}
case ck_map:
case ck_multimap:
{
- os << "init (di, &k, v);";
+ os << "&k, ";
break;
}
case ck_set:
case ck_multiset:
- {
- os << "init (di, v);";
- break;
- }
+ break;
}
+ os << "v" << (versioned ? ", svm" : "") << ");";
+
os << endl
<< "if (sts.data_binding_test_version ())"
<< "{"
<< "const binding& id (sts.id_binding ());"
- << "bind (sts.data_bind (), id.bind, id.count, di);"
+ << "bind (sts.data_bind (), id.bind, id.count, di" <<
+ (versioned ? ", svm" : "") << ");"
<< "sts.data_binding_update_version ();"
<< "}"
<< "if (!sts.insert_statement ().execute ())" << endl
@@ -3174,15 +3212,20 @@ namespace relational
<< endl
<< "statements_type& sts (*static_cast< statements_type* > (d));"
<< "cond_image_type& ci (sts.cond_image ());"
- << "data_image_type& di (sts.data_image ());"
- << endl;
+ << "data_image_type& di (sts.data_image ());";
+
+ if (versioned)
+ os << "const schema_version_migration& svm (" <<
+ "sts.version_migration ());";
+
+ os << endl;
switch (ck)
{
case ck_ordered:
{
os << "init (ci, i);";
- os << "init (di, 0, v);";
+ os << "init (di, 0, v" << (versioned ? ", svm" : "") << ");";
break;
}
case ck_map:
@@ -3203,7 +3246,8 @@ namespace relational
<< "if (sts.update_binding_test_version ())"
<< "{"
<< "const binding& id (sts.id_binding ());"
- << "bind (sts.update_bind (), id.bind, id.count, ci, di);"
+ << "bind (sts.update_bind (), id.bind, id.count, ci, di" <<
+ (versioned ? ", svm" : "") << ");"
<< "sts.update_binding_update_version ();"
<< "}";
@@ -3245,33 +3289,38 @@ namespace relational
<< "statements_type& sts (*static_cast< statements_type* > (d));"
<< "data_image_type& di (sts.data_image ());";
+ if (versioned)
+ os << "const schema_version_migration& svm (" <<
+ "sts.version_migration ());";
+
+ os << endl
+ << "init (";
+
// Extract current element.
//
switch (ck)
{
case ck_ordered:
{
- os << "init (" << (ordered ? "i, " : "") <<
- "v, di, &sts.connection ().database ());"
- << endl;
+ if (ordered)
+ os << "i, ";
break;
}
case ck_map:
case ck_multimap:
{
- os << "init (k, v, di, &sts.connection ().database ());"
- << endl;
+ os << "k, ";
break;
}
case ck_set:
case ck_multiset:
- {
- os << "init (v, di, &sts.connection ().database ());"
- << endl;
- break;
- }
+ break;
}
+ os << "v, di, &sts.connection ().database ()" <<
+ (versioned ? ", svm" : "") << ");"
+ << endl;
+
init_value_extra ();
// If we are loading an eager pointer, then the call to init
@@ -3283,7 +3332,8 @@ namespace relational
os << "if (sts.data_binding_test_version ())"
<< "{"
<< "const binding& id (sts.id_binding ());"
- << "bind (sts.data_bind (), id.bind, id.count, di);"
+ << "bind (sts.data_bind (), id.bind, id.count, di" <<
+ (versioned ? ", svm" : "") << ");"
<< "sts.data_binding_update_version ();"
<< "}";
}
@@ -3297,13 +3347,15 @@ namespace relational
os << endl
<< "if (r == select_statement::truncated)"
<< "{"
- << "grow (di, sts.select_image_truncated ());"
+ << "grow (di, sts.select_image_truncated ()" <<
+ (versioned ? ", svm" : "") << ");"
<< endl
<< "if (sts.data_binding_test_version ())"
<< "{"
// Id cannot change.
//
- << "bind (sts.data_bind (), 0, sts.id_binding ().count, di);"
+ << "bind (sts.data_bind (), 0, sts.id_binding ().count, di" <<
+ (versioned ? ", svm" : "") << ");"
<< "sts.data_binding_update_version ();"
<< "st.refetch ();"
<< "}"
@@ -3391,12 +3443,22 @@ namespace relational
if (!inverse)
{
os << "void " << scope << "::" << endl
- << "persist (const container_type& c, statements_type& sts)"
+ << "persist (const container_type& c," << endl
+ << "statements_type& sts";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
+ os << ")"
<< "{"
<< "using namespace " << db << ";"
<< endl
<< "functions_type& fs (sts.functions ());";
+ if (versioned)
+ os << "sts.version_migration (svm);";
+
if (!smart && ck == ck_ordered)
os << "fs.ordered_ = " << ordered << ";";
@@ -3407,7 +3469,14 @@ namespace relational
// load
//
os << "void " << scope << "::" << endl
- << "load (container_type& c, statements_type& sts)"
+ << "load (container_type& c," << endl
+ << "statements_type& sts";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
+ os << ")"
<< "{"
<< "using namespace " << db << ";"
<< "using " << db << "::select_statement;" // Conflicts.
@@ -3416,7 +3485,8 @@ namespace relational
<< endl
<< "if (sts.data_binding_test_version ())"
<< "{"
- << "bind (sts.data_bind (), id.bind, id.count, sts.data_image ());"
+ << "bind (sts.data_bind (), id.bind, id.count, sts.data_image ()" <<
+ (versioned ? ", svm" : "") << ");"
<< "sts.data_binding_update_version ();"
<< "}"
// We use the id binding directly so no need to check cond binding.
@@ -3438,13 +3508,15 @@ namespace relational
<< "if (r == select_statement::truncated)"
<< "{"
<< "data_image_type& di (sts.data_image ());"
- << "grow (di, sts.select_image_truncated ());"
+ << "grow (di, sts.select_image_truncated ()" <<
+ (versioned ? ", svm" : "") << ");"
<< endl
<< "if (sts.data_binding_test_version ())"
<< "{"
// Id cannot change.
//
- << "bind (sts.data_bind (), 0, id.count, di);"
+ << "bind (sts.data_bind (), 0, id.count, di" <<
+ (versioned ? ", svm" : "") << ");"
<< "sts.data_binding_update_version ();"
<< "st.refetch ();"
<< "}"
@@ -3454,6 +3526,9 @@ namespace relational
<< endl
<< "functions_type& fs (sts.functions ());";
+ if (versioned)
+ os << "sts.version_migration (svm);";
+
if (!smart && ck == ck_ordered)
os << "fs.ordered_ = " << ordered << ";";
@@ -3465,19 +3540,22 @@ namespace relational
if (!(inverse || readonly (member_path_, member_scope_)))
{
os << "void " << scope << "::" << endl
- << "update (const container_type& c, statements_type& sts)"
+ << "update (const container_type& c," << endl
+ << "statements_type& sts";
+
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
+
+ os << ")"
<< "{"
<< "using namespace " << db << ";"
<< endl
- << "const binding& id (sts.id_binding ());"
- << endl
- << "if (sts.data_binding_test_version ())"
- << "{"
- << "bind (sts.data_bind (), id.bind, id.count, sts.data_image ());"
- << "sts.data_binding_update_version ();"
- << "}"
<< "functions_type& fs (sts.functions ());";
+ if (versioned)
+ os << "sts.version_migration (svm);";
+
if (!smart && ck == ck_ordered)
os << "fs.ordered_ = " << ordered << ";";
@@ -3746,6 +3824,7 @@ namespace relational
bool inverse (context::inverse (m, "value"));
bool smart (!inverse && !unordered (m) && container_smart (c));
+ bool versioned (context::versioned (m));
// In certain cases we don't need to do anything.
//
@@ -3865,21 +3944,39 @@ namespace relational
{
os << traits << "::persist (" << endl
<< var << "," << endl
- << "esc." << sts_name << ");";
+ << "esc." << sts_name;
+
+ if (versioned)
+ os << "," << endl
+ << "svm";
+
+ os << ");";
break;
}
case load_call:
{
os << traits << "::load (" << endl
<< var << "," << endl
- << "esc." << sts_name << ");";
+ << "esc." << sts_name;
+
+ if (versioned)
+ os << "," << endl
+ << "svm";
+
+ os << ");";
break;
}
case update_call:
{
os << traits << "::update (" << endl
<< var << "," << endl
- << "esc." << sts_name << ");";
+ << "esc." << sts_name;
+
+ if (versioned)
+ os << "," << endl
+ << "svm";
+
+ os << ");";
break;
}
case erase_obj_call: