From 5d969f916178eb5e223d658dd55f5f2bc9ab526d Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Sun, 27 Nov 2016 15:27:00 +0200 Subject: Fix bug in handling section members that require growth --- odb/relational/common.hxx | 32 ++++++++++++++++++++++++++------ odb/relational/mssql/common.cxx | 4 ++-- odb/relational/mysql/common.cxx | 4 ++-- odb/relational/mysql/context.cxx | 9 +++++---- odb/relational/oracle/common.cxx | 4 ++-- odb/relational/pgsql/common.cxx | 4 ++-- odb/relational/pgsql/context.cxx | 9 +++++---- odb/relational/sqlite/common.cxx | 4 ++-- odb/relational/sqlite/context.cxx | 9 +++++---- 9 files changed, 51 insertions(+), 28 deletions(-) (limited to 'odb') diff --git a/odb/relational/common.hxx b/odb/relational/common.hxx index 9bd2da6..fe959ed 100644 --- a/odb/relational/common.hxx +++ b/odb/relational/common.hxx @@ -26,7 +26,8 @@ namespace relational custom_override_ (ct), fq_type_override_ (fq_type), key_prefix_ (key_prefix), - section_ (section) + section_ (section), + top_level_ (false) { } @@ -41,7 +42,8 @@ namespace relational custom_override_ (ct), fq_type_override_ (fq_type), key_prefix_ (key_prefix), - section_ (section) + section_ (section), + top_level_ (false) { } @@ -57,6 +59,12 @@ namespace relational string fq_type_override_; string key_prefix_; object_section* section_; + + // True during the top-level call of pre() and post() below. Note that + // call via another tarverser (e.g., for a class) is not considered top- + // level. + // + bool top_level_; }; // Template argument is the database SQL type (sql_type). @@ -75,8 +83,13 @@ namespace relational virtual T const& member_sql_type (semantics::data_member&) = 0; - virtual void - traverse (semantics::data_member&); + void + traverse (semantics::data_member& m, bool top_level) + { + top_level_ = top_level; + traverse (m); + top_level_ = false; + } struct member_info { @@ -180,8 +193,8 @@ namespace relational return type_override_ == 0 && context::container (mi.m); } - // The false return value indicates that no further callbacks - // should be called for this member. + // The false return value indicates that no further callbacks should be + // called for this member. // virtual bool pre (member_info&) {return true;} @@ -189,6 +202,9 @@ namespace relational virtual void post (member_info&) {} + // Note: calling these directly will mess up the top_level logic. + // + protected: virtual void traverse_composite (member_info&) {} @@ -203,6 +219,10 @@ namespace relational virtual void traverse_simple (member_info&) {} + + private: + virtual void + traverse (semantics::data_member&); }; // diff --git a/odb/relational/mssql/common.cxx b/odb/relational/mssql/common.cxx index eb294cc..8f11bc0 100644 --- a/odb/relational/mssql/common.cxx +++ b/odb/relational/mssql/common.cxx @@ -203,7 +203,7 @@ namespace relational image_type (semantics::data_member& m) { type_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_; } @@ -365,7 +365,7 @@ namespace relational database_type_id (semantics::data_member& m) { type_id_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_id_; } diff --git a/odb/relational/mysql/common.cxx b/odb/relational/mysql/common.cxx index a8f4668..af53a50 100644 --- a/odb/relational/mysql/common.cxx +++ b/odb/relational/mysql/common.cxx @@ -169,7 +169,7 @@ namespace relational image_type (semantics::data_member& m) { type_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_; } @@ -314,7 +314,7 @@ namespace relational database_type_id (type& m) { type_id_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_id_; } diff --git a/odb/relational/mysql/context.cxx b/odb/relational/mysql/context.cxx index 4a5187a..c2f0df1 100644 --- a/odb/relational/mysql/context.cxx +++ b/odb/relational/mysql/context.cxx @@ -215,9 +215,10 @@ namespace relational pre (member_info& mi) { // If we have a key prefix (container), then it can't be in a - // section (while mi.m can). + // section (while mi.m can). The same for top-level -- if we got + // called, then we shouldn't ignore it. // - return !key_prefix_.empty () || + return !key_prefix_.empty () || top_level_ || (section_ == 0 && !separate_load (mi.m)) || (section_ != 0 && *section_ == section (mi.m)); } @@ -287,7 +288,7 @@ namespace relational { bool r (false); has_grow_member mt (r); - mt.traverse (m); + mt.traverse (m, true); return r; } @@ -299,7 +300,7 @@ namespace relational { bool r (false); has_grow_member mt (r, 0, &t, ct, kp); - mt.traverse (m); + mt.traverse (m, true); return r; } diff --git a/odb/relational/oracle/common.cxx b/odb/relational/oracle/common.cxx index 30e4c79..0c310a4 100644 --- a/odb/relational/oracle/common.cxx +++ b/odb/relational/oracle/common.cxx @@ -189,7 +189,7 @@ namespace relational image_type (semantics::data_member& m) { type_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_; } @@ -325,7 +325,7 @@ namespace relational database_type_id (type& m) { type_id_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_id_; } diff --git a/odb/relational/pgsql/common.cxx b/odb/relational/pgsql/common.cxx index 43adb6a..0a06019 100644 --- a/odb/relational/pgsql/common.cxx +++ b/odb/relational/pgsql/common.cxx @@ -147,7 +147,7 @@ namespace relational image_type (semantics::data_member& m) { type_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_; } @@ -266,7 +266,7 @@ namespace relational database_type_id (type& m) { type_id_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_id_; } diff --git a/odb/relational/pgsql/context.cxx b/odb/relational/pgsql/context.cxx index cd73cf9..dc04285 100644 --- a/odb/relational/pgsql/context.cxx +++ b/odb/relational/pgsql/context.cxx @@ -171,9 +171,10 @@ namespace relational pre (member_info& mi) { // If we have a key prefix (container), then it can't be in a - // section (while mi.m can). + // section (while mi.m can). The same for top-level -- if we got + // called, then we shouldn't ignore it. // - return !key_prefix_.empty () || + return !key_prefix_.empty () || top_level_ || (section_ == 0 && !separate_load (mi.m)) || (section_ != 0 && *section_ == section (mi.m)); } @@ -231,7 +232,7 @@ namespace relational { bool r (false); has_grow_member mt (r); - mt.traverse (m); + mt.traverse (m, true); return r; } @@ -243,7 +244,7 @@ namespace relational { bool r (false); has_grow_member mt (r, 0, &t, ct, kp); - mt.traverse (m); + mt.traverse (m, true); return r; } diff --git a/odb/relational/sqlite/common.cxx b/odb/relational/sqlite/common.cxx index 4ab8968..f884e83 100644 --- a/odb/relational/sqlite/common.cxx +++ b/odb/relational/sqlite/common.cxx @@ -85,7 +85,7 @@ namespace relational image_type (semantics::data_member& m) { type_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_; } @@ -148,7 +148,7 @@ namespace relational database_type_id (type& m) { type_id_.clear (); - member_base::traverse (m); + member_base::traverse (m, true); return type_id_; } diff --git a/odb/relational/sqlite/context.cxx b/odb/relational/sqlite/context.cxx index a959477..2088d96 100644 --- a/odb/relational/sqlite/context.cxx +++ b/odb/relational/sqlite/context.cxx @@ -178,9 +178,10 @@ namespace relational pre (member_info& mi) { // If we have a key prefix (container), then it can't be in a - // section (while mi.m can). + // section (while mi.m can). The same for top-level -- if we got + // called, then we shouldn't ignore it. // - return !key_prefix_.empty () || + return !key_prefix_.empty () || top_level_ || (section_ == 0 && !separate_load (mi.m)) || (section_ != 0 && *section_ == section (mi.m)); } @@ -226,7 +227,7 @@ namespace relational { bool r (false); has_grow_member mt (r); - mt.traverse (m); + mt.traverse (m, true); return r; } @@ -238,7 +239,7 @@ namespace relational { bool r (false); has_grow_member mt (r, 0, &t, ct, kp); - mt.traverse (m); + mt.traverse (m, true); return r; } -- cgit v1.1