aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2016-11-27 15:27:00 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2016-11-27 15:27:00 +0200
commit5d969f916178eb5e223d658dd55f5f2bc9ab526d (patch)
tree5f4e8235a0e36cced937b7e01b66cce9293529c5
parent4fd2c107242fe9f8e6ba7ded2a789f4de2ccd040 (diff)
Fix bug in handling section members that require growth
-rw-r--r--odb/relational/common.hxx32
-rw-r--r--odb/relational/mssql/common.cxx4
-rw-r--r--odb/relational/mysql/common.cxx4
-rw-r--r--odb/relational/mysql/context.cxx9
-rw-r--r--odb/relational/oracle/common.cxx4
-rw-r--r--odb/relational/pgsql/common.cxx4
-rw-r--r--odb/relational/pgsql/context.cxx9
-rw-r--r--odb/relational/sqlite/common.cxx4
-rw-r--r--odb/relational/sqlite/context.cxx9
9 files changed, 51 insertions, 28 deletions
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;
}