aboutsummaryrefslogtreecommitdiff
path: root/odb/relational/pgsql
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-02-04 17:23:54 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-02-04 17:23:54 +0200
commit8e69f40ab32dc8604b68f360ae30fa961ba036ee (patch)
tree5448cea6c20f7e6c5cd80ae752b49e1a696bcd6e /odb/relational/pgsql
parent36920a538c7b207c0b36b2270108a717479e0ed1 (diff)
Implement object loading views
See section 10.2 in the manual for details.
Diffstat (limited to 'odb/relational/pgsql')
-rw-r--r--odb/relational/pgsql/common.cxx9
-rw-r--r--odb/relational/pgsql/common.hxx6
-rw-r--r--odb/relational/pgsql/header.cxx42
-rw-r--r--odb/relational/pgsql/source.cxx158
4 files changed, 27 insertions, 188 deletions
diff --git a/odb/relational/pgsql/common.cxx b/odb/relational/pgsql/common.cxx
index 41cfc6b..6f04824 100644
--- a/odb/relational/pgsql/common.cxx
+++ b/odb/relational/pgsql/common.cxx
@@ -126,6 +126,13 @@ namespace relational
}
member_image_type::
+ member_image_type (base const& x)
+ : member_base::base (x), // virtual base
+ base (x)
+ {
+ }
+
+ member_image_type::
member_image_type (semantics::type* type,
string const& fq_type,
string const& key_prefix)
@@ -196,6 +203,8 @@ namespace relational
type_ = "unsigned char*";
}
+ entry<member_image_type> member_image_type_;
+
//
// member_database_type
//
diff --git a/odb/relational/pgsql/common.hxx b/odb/relational/pgsql/common.hxx
index bb9d961..7fa8b60 100644
--- a/odb/relational/pgsql/common.hxx
+++ b/odb/relational/pgsql/common.hxx
@@ -69,12 +69,14 @@ namespace relational
}
};
- struct member_image_type: member_base
+ struct member_image_type: relational::member_image_type,
+ member_base
{
+ member_image_type (base const&);
member_image_type (semantics::type* type = 0,
string const& fq_type = string (),
string const& key_prefix = string ());
- string
+ virtual string
image_type (semantics::data_member&);
virtual void
diff --git a/odb/relational/pgsql/header.cxx b/odb/relational/pgsql/header.cxx
index a23ec9e..fd9093b 100644
--- a/odb/relational/pgsql/header.cxx
+++ b/odb/relational/pgsql/header.cxx
@@ -177,39 +177,14 @@ namespace relational
};
entry<section_traits> section_traits_;
- struct image_member: relational::image_member, member_base
+ struct image_member: relational::image_member_impl<sql_type>,
+ member_base
{
image_member (base const& x)
- : member_base::base (x), // virtual base
- base (x),
- member_base (x),
- member_image_type_ (base::type_override_,
- base::fq_type_override_,
- base::key_prefix_)
- {
- }
-
- virtual bool
- pre (member_info& mi)
- {
- if (container (mi))
- return false;
-
- image_type = member_image_type_.image_type (mi.m);
-
- if (var_override_.empty ())
- os << "// " << mi.m.name () << endl
- << "//" << endl;
-
- return true;
- }
-
- virtual void
- traverse_composite (member_info& mi)
- {
- os << image_type << " " << mi.var << "value;"
- << endl;
- }
+ : member_base::base (x), // virtual base
+ member_base::base_impl (x), // virtual base
+ base_impl (x),
+ member_base (x) {}
virtual void
traverse_integer (member_info& mi)
@@ -290,11 +265,6 @@ namespace relational
<< "bool " << mi.var << "null;"
<< endl;
}
-
- private:
- string image_type;
-
- member_image_type member_image_type_;
};
entry<image_member> image_member_;
}
diff --git a/odb/relational/pgsql/source.cxx b/odb/relational/pgsql/source.cxx
index b3d934d..9606e71 100644
--- a/odb/relational/pgsql/source.cxx
+++ b/odb/relational/pgsql/source.cxx
@@ -267,153 +267,14 @@ namespace relational
// grow
//
- struct grow_member: relational::grow_member, member_base
+ struct grow_member: relational::grow_member_impl<sql_type>,
+ member_base
{
grow_member (base const& x)
- : member_base::base (x), // virtual base
- base (x),
- member_base (x)
- {
- }
-
- virtual bool
- pre (member_info& mi)
- {
- if (container (mi))
- return false;
-
- if (section_ != 0 && *section_ != section (mi.m))
- return false;
-
- if (var_override_.empty ())
- {
- // Ignore separately loaded members.
- //
- if (section_ == 0 && separate_load (mi.m))
- return false;
- }
-
- // Ignore polymorphic id references; they are not returned by
- // the select statement.
- //
- if (mi.ptr != 0 && mi.m.count ("polymorphic-ref"))
- return false;
-
- ostringstream ostr;
- ostr << "t[" << index_ << "UL]";
- e = ostr.str ();
-
- if (var_override_.empty ())
- {
- os << "// " << mi.m.name () << endl
- << "//" << endl;
-
- semantics::class_* comp (composite (mi.t));
-
- // 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 this is a composite member, see if it is summarily
- // added/deleted.
- //
- if (comp != 0)
- {
- unsigned long long cav (added (*comp));
- unsigned long long cdv (deleted (*comp));
-
- if (cav != 0 && (av == 0 || av < cav))
- av = cav;
-
- if (cdv != 0 && (dv == 0 || dv > cdv))
- dv = cdv;
- }
-
- // 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<user_section*> (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)
- {
- semantics::class_* comp (composite (mi.t));
-
- if (var_override_.empty ())
- {
- unsigned long long av (added (mi.m));
- unsigned long long dv (deleted (mi.m));
-
- if (comp != 0)
- {
- unsigned long long cav (added (*comp));
- unsigned long long cdv (deleted (*comp));
-
- if (cav != 0 && (av == 0 || av < cav))
- av = cav;
-
- if (cdv != 0 && (dv == 0 || dv > cdv))
- dv = cdv;
- }
-
- if (user_section* s = dynamic_cast<user_section*> (section_))
- {
- if (av == added (*s->member))
- av = 0;
-
- if (dv == deleted (*s->member))
- dv = 0;
- }
-
- if (av != 0 || dv != 0)
- os << "}";
- }
-
- if (comp != 0)
- index_ += column_count (*comp).total;
- else
- index_++;
- }
-
- virtual void
- traverse_composite (member_info& mi)
- {
- os << "if (composite_value_traits< " << mi.fq_type () <<
- ", id_pgsql >::grow (" << endl
- << "i." << mi.var << "value, t + " << index_ << "UL" <<
- (versioned (*composite (mi.t)) ? ", svm" : "") << "))" << endl
- << "grew = true;"
- << endl;
- }
+ : member_base::base (x), // virtual base
+ member_base::base_impl (x), // virtual base
+ base_impl (x),
+ member_base (x) {}
virtual void
traverse_integer (member_info&)
@@ -479,9 +340,6 @@ namespace relational
os << e << " = 0;"
<< endl;
}
-
- private:
- string e;
};
entry<grow_member> grow_member_;
@@ -617,9 +475,9 @@ namespace relational
}
virtual void
- get_null (member_info& mi)
+ get_null (string const& var) const
{
- os << "i." << mi.var << "null";
+ os << "i." << var << "null";
}
virtual void