aboutsummaryrefslogtreecommitdiff
path: root/odb/pragma.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-10-27 15:16:49 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-10-27 15:16:49 +0200
commit8d82c02a90cd7cc3f161828624db5b973585c34c (patch)
tree7b04f0b5e1b9e6eb3a2e76395df6a132be7a78d0 /odb/pragma.cxx
parent9d10c570acf1b7e8ed7c0a750ae3edfa70da200b (diff)
Add support for persistent classes without object ids
New pragma id (object). New test: common/no-id.
Diffstat (limited to 'odb/pragma.cxx')
-rw-r--r--odb/pragma.cxx59
1 files changed, 49 insertions, 10 deletions
diff --git a/odb/pragma.cxx b/odb/pragma.cxx
index 407f8f5..eee2677 100644
--- a/odb/pragma.cxx
+++ b/odb/pragma.cxx
@@ -302,11 +302,21 @@ check_spec_decl_type (tree d,
{
int tc (TREE_CODE (d));
- if (p == "id" ||
- p == "auto" ||
- p == "column" ||
- p == "inverse" ||
- p == "transient")
+ if (p == "id")
+ {
+ // Id can be used for both data members and objects.
+ //
+ if (tc != FIELD_DECL && !CLASS_TYPE_P (d))
+ {
+ error (l) << "name '" << name << "' in db pragma " << p << " does "
+ << "not refer to a data member or class" << endl;
+ return false;
+ }
+ }
+ else if (p == "auto" ||
+ p == "column" ||
+ p == "inverse" ||
+ p == "transient")
{
if (tc != FIELD_DECL)
{
@@ -473,6 +483,7 @@ add_pragma (pragma const& prag, tree decl)
static void
handle_pragma (cpp_reader* reader,
string const& p,
+ string const& qualifier,
tree decl,
string const& decl_name)
{
@@ -860,8 +871,8 @@ handle_pragma (cpp_reader* reader,
}
else if (p == "id")
{
- // id
- //
+ // id (member)
+ // id() (object)
// Make sure we've got the correct declaration type.
//
@@ -869,6 +880,34 @@ handle_pragma (cpp_reader* reader,
return;
tt = pragma_lex (&t);
+
+ if (tt == CPP_OPEN_PAREN)
+ {
+ if (qualifier == "member")
+ {
+ error () << "unexpected '(' after db pragma " << p << endl;
+ return;
+ }
+
+ if (pragma_lex (&t) != CPP_CLOSE_PAREN)
+ {
+ error () << "')' expected at the end of db pragma " << p << endl;
+ return;
+ }
+
+ val = false; // Object without id.
+ tt = pragma_lex (&t);
+ }
+ else
+ {
+ if (qualifier == "object")
+ {
+ error () << "expected '(' after db pragma " << p << endl;
+ return;
+ }
+
+ val = true; // Member is object id.
+ }
}
else if (p == "auto")
{
@@ -1463,7 +1502,7 @@ handle_pragma (cpp_reader* reader,
//
if (tt == CPP_NAME)
{
- handle_pragma (reader, IDENTIFIER_POINTER (t), decl, decl_name);
+ handle_pragma (reader, IDENTIFIER_POINTER (t), qualifier, decl, decl_name);
}
else if (tt != CPP_EOF)
error () << "unexpected text after " << p << " in db pragma" << endl;
@@ -1592,7 +1631,7 @@ handle_pragma_qualifier (cpp_reader* reader, string const& p)
p == "readonly" ||
p == "transient")
{
- handle_pragma (reader, p, 0, "");
+ handle_pragma (reader, p, "member", 0, "");
return;
}
else
@@ -1621,7 +1660,7 @@ handle_pragma_qualifier (cpp_reader* reader, string const& p)
//
if (tt == CPP_NAME)
{
- handle_pragma (reader, IDENTIFIER_POINTER (t), decl, decl_name);
+ handle_pragma (reader, IDENTIFIER_POINTER (t), p, decl, decl_name);
}
else if (tt != CPP_EOF)
error () << "unexpected text after " << p << " in db pragma" << endl;