aboutsummaryrefslogtreecommitdiff
path: root/odb/relational/processor.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/relational/processor.cxx')
-rw-r--r--odb/relational/processor.cxx52
1 files changed, 40 insertions, 12 deletions
diff --git a/odb/relational/processor.cxx b/odb/relational/processor.cxx
index 82852f0..83adb39 100644
--- a/odb/relational/processor.cxx
+++ b/odb/relational/processor.cxx
@@ -1169,7 +1169,7 @@ namespace relational
if (j != amap_.end ())
{
i->table = j->first;
- obj = j->second->object;
+ obj = j->second->obj;
// Skip '::'.
//
@@ -1215,7 +1215,7 @@ namespace relational
throw operation_failed ();
}
- obj = j->second->object;
+ obj = j->second->obj;
i->table = table_name (*obj);
}
@@ -1308,7 +1308,10 @@ namespace relational
member_resolver resolver (exact_members, pub_members, m);
for (view_objects::iterator i (objs.begin ()); i != objs.end (); ++i)
- resolver.traverse (*i);
+ {
+ if (i->kind == view_object::object)
+ resolver.traverse (*i);
+ }
assoc_members& members (
!exact_members.empty () ? exact_members : pub_members);
@@ -1362,7 +1365,7 @@ namespace relational
ep.kind = column_expr_part::reference;
ep.table = am.vo->alias.empty ()
- ? table_name (*am.vo->object)
+ ? table_name (*am.vo->obj)
: am.vo->alias;
ep.member_path.push_back (am.m);
@@ -1395,7 +1398,7 @@ namespace relational
traverse (view_object& vo)
{
member_.vo_ = &vo;
- traverse (*vo.object);
+ traverse (*vo.obj);
}
virtual void
@@ -1636,6 +1639,9 @@ namespace relational
view_alias_map& amap (c.set ("alias-map", view_alias_map ()));
view_object_map& omap (c.set ("object-map", view_object_map ()));
+ size_t& obj_count (c.set ("object-count", size_t (0)));
+ size_t& tbl_count (c.set ("table-count", size_t (0)));
+
if (has_o)
{
using semantics::class_;
@@ -1644,6 +1650,25 @@ namespace relational
for (view_objects::iterator i (objs.begin ()); i != objs.end (); ++i)
{
+ if (i->kind != view_object::object)
+ {
+ // Make sure we have join conditions for tables unless it
+ // is the first entry.
+ //
+ if (i != objs.begin () && i->cond.empty ())
+ {
+ error (i->loc)
+ << "missing join condition in db pragma table" << endl;
+
+ throw operation_failed ();
+ }
+
+ tbl_count++;
+ continue;
+ }
+ else
+ obj_count++;
+
tree n (TYPE_MAIN_VARIANT (i->node));
if (TREE_CODE (n) != RECORD_TYPE)
@@ -1669,7 +1694,7 @@ namespace relational
throw operation_failed ();
}
- i->object = &o;
+ i->obj = &o;
if (i->alias.empty ())
{
@@ -1716,6 +1741,9 @@ namespace relational
//
for (view_objects::iterator j (objs.begin ()); j != i; ++j)
{
+ if (j->kind != view_object::object)
+ continue; // Skip tables.
+
// First see if any of the objects that were specified
// prior to this object point to it.
//
@@ -1785,7 +1813,7 @@ namespace relational
relationship const& r (rs.back ());
string name (r.pointer->alias.empty ()
- ? r.pointer->object->fq_name ()
+ ? r.pointer->obj->fq_name ()
: r.pointer->alias);
name += "::";
name += r.name;
@@ -1832,7 +1860,7 @@ namespace relational
traverse (view_object& pointer)
{
pointer_ = &pointer;
- object_members_base::traverse (*pointer.object);
+ object_members_base::traverse (*pointer.obj);
}
virtual void
@@ -1849,10 +1877,10 @@ namespace relational
// Ignore self-pointers if requested.
//
- if (!self_pointer_ && pointer_->object == c)
+ if (!self_pointer_ && pointer_->obj == c)
return;
- if (pointee_.object == c)
+ if (pointee_.obj == c)
{
relationships_.push_back (relationship ());
relationships_.back ().member = &m;
@@ -1874,10 +1902,10 @@ namespace relational
// Ignore self-pointers if requested.
//
- if (!self_pointer_ && pointer_->object == c)
+ if (!self_pointer_ && pointer_->obj == c)
return;
- if (pointee_.object == c)
+ if (pointee_.obj == c)
{
relationships_.push_back (relationship ());
relationships_.back ().member = &m;