From c93d7f6453f8aebdc80fba44032f692eb5da8a9c Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 4 Sep 2013 12:57:25 +0200 Subject: Container versioning support --- odb/context.cxx | 7 +- odb/context.hxx | 4 + odb/processor.cxx | 52 +++++++++- odb/relational/header.cxx | 6 +- odb/relational/header.hxx | 109 +++++++++++++------ odb/relational/inline.hxx | 12 ++- odb/relational/source.cxx | 64 +++++++++--- odb/relational/source.hxx | 259 +++++++++++++++++++++++++++++++--------------- 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 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 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: -- cgit v1.1