aboutsummaryrefslogtreecommitdiff
path: root/odb
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-06-16 08:28:17 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-06-16 08:28:17 +0200
commitf88e9b93fd99b89e30ef702273f8272a2c8866ce (patch)
tree8b28d7301938e05fded62d9a0f1fb86db4750258 /odb
parent521216e0a696fa698c88fc1e18958c82626873cc (diff)
Redo index members parsing to use new resolve_data_members()
Diffstat (limited to 'odb')
-rw-r--r--odb/relational/processor.cxx85
1 files changed, 5 insertions, 80 deletions
diff --git a/odb/relational/processor.cxx b/odb/relational/processor.cxx
index 0dbacbd..09a468b 100644
--- a/odb/relational/processor.cxx
+++ b/odb/relational/processor.cxx
@@ -1064,9 +1064,6 @@ namespace relational
// First resolve member names.
//
- string tl;
- cpp_ttype tt (CPP_EOF);
-
index::members_type::iterator j (in.members.begin ());
for (; j != in.members.end (); ++j)
{
@@ -1075,83 +1072,10 @@ namespace relational
if (!im.path.empty ())
continue; // Already resolved.
- try
- {
- using semantics::data_member;
-
- // The name was already verified to be syntactically correct so
- // we don't need to do any extra error checking in this area.
- //
- lex_.start (im.name);
- tt = lex_.next (tl);
-
- data_member& m (
- c.lookup<data_member> (tl, type::include_hidden));
-
- im.path.push_back (&m);
- tt = lex_.next (tl);
-
- if (container (m))
- break;
-
- // Resolve nested members if any.
- //
- for (; tt == CPP_DOT; tt = lex_.next (tl))
- {
- lex_.next (tl); // Get CPP_NAME.
-
- data_member& om (*im.path.back ());
+ im.path = resolve_data_members (c, im.name, im.loc, lex_);
- // Check that the outer member is composite and also
- // unwrap it while at it.
- //
- semantics::class_* comp (composite_wrapper (utype (om)));
- if (comp == 0)
- {
- error (im.loc) << "data member '" << om.name () << "' " <<
- "specified in db pragma member is not composite" << endl;
- throw operation_failed ();
- }
-
- data_member& nm (
- comp->lookup<data_member> (tl, type::include_hidden));
-
- im.path.push_back (&nm);
-
- if (container (nm))
- {
- tt = lex_.next (tl); // Get CPP_DOT.
- break; // Only breaks out of the inner loop.
- }
- }
-
- if (container (*im.path.back ()))
- break;
- }
- catch (semantics::unresolved const& e)
- {
- if (e.type_mismatch)
- error (im.loc) << "name '" << e.name << "' in db pragma " <<
- "member does not refer to a data member" << endl;
- else
- error (im.loc) << "unable to resolve data member '" <<
- e.name << "' specified with db pragma member" << endl;
-
- throw operation_failed ();
- }
- catch (semantics::ambiguous const& e)
- {
- error (im.loc) << "data member name '" << e.first.name () <<
- "' specified with db pragma member is ambiguous" << endl;
-
- info (e.first.named ().location ()) << "could resolve to " <<
- "this data member" << endl;
-
- info (e.second.named ().location ()) << "or could resolve " <<
- "to this data member" << endl;
-
- throw operation_failed ();
- }
+ if (container (*im.path.back ()))
+ break;
}
// Add the table prefix if this database has global index names.
@@ -1172,7 +1096,8 @@ namespace relational
throw operation_failed ();
}
- if (tt != CPP_DOT || lex_.next (tl) != CPP_NAME ||
+ string tl;
+ if (lex_.next (tl) != CPP_DOT || lex_.next (tl) != CPP_NAME ||
(tl != "id" && tl != "index"))
{
error (j->loc) << ".id or .index special member expected in a "