From 6d0c7119137749ca31b3d66406c6a270fbbb5fc2 Mon Sep 17 00:00:00 2001
From: Boris Kolpackov 12.1.3 abstract
12.1.4 readonly
- 12.1.5 optimistic
+ 12.1.6 id
12.1.6 no_id
12.1.7 callback
12.1.8 schema
@@ -2271,7 +2271,7 @@ class person
default-constructible. It is also possible to declare a persistent
class without an object id, however, such a class will have limited
functionality (Section 12.1.6,
- "12.1.9 polymorphic
id
").
no_id
").
The above two pragmas are the minimum required to declare a persistent class with an object id. Other pragmas can be used to @@ -9221,7 +9221,7 @@ class person
id
no_id
For a more detailed discussion of optimistic concurrency, refer to Chapter 11, "Optimistic Concurrency".
-id
no_id
The id
specifier specifies that the persistent class
- has no object id. It should be followed by opening and closing
- parenthesis. For example:
The no_id
specifier specifies that the persistent class
+ has no object id. For example:
-#pragma db object id() +#pragma db object no_id class person { ... @@ -10920,8 +10919,8 @@ class personNormally, every persistent class has a data member designated as an object's identifier. However, it is possible to declare a - persistent class without an id using the object
+ persistent class without an id using the objectid
- specifier (Section 12.1.6, "id
").no_id
+ specifier (Section 12.1.6, "no_id
").Note also that the
diff --git a/odb/pragma.cxx b/odb/pragma.cxx index 5cae6b1..9d97d2a 100644 --- a/odb/pragma.cxx +++ b/odb/pragma.cxx @@ -362,18 +362,19 @@ check_spec_decl_type (declaration const& d, int tc (d.tree_code ()); bool type (TREE_CODE_CLASS (tc) == tcc_type); - if (p == "id") + if (p == "no_id") { - // Id can be used for both data members and objects. + // No_id can be used on objects only. // - if (tc != FIELD_DECL && tc != RECORD_TYPE) + if (tc != RECORD_TYPE) { error (l) << "name '" << name << "' in db pragma " << p << " does " << "not refer to a data member or class" << endl; return false; } } - else if (p == "auto" || + else if (p == "id" || + p == "auto" || p == "column" || p == "inverse" || p == "version" || @@ -1434,43 +1435,24 @@ handle_pragma (cxx_lexer& l, } else if (p == "id") { - // id (member) - // id() (object) - // Make sure we've got the correct declaration type. // if (decl && !check_spec_decl_type (decl, decl_name, p, loc)) return; tt = l.next (tl, &tn); + } + else if (p == "no_id") + { + // Make sure we've got the correct declaration type. + // + if (decl && !check_spec_decl_type (decl, decl_name, p, loc)) + return; - if (tt == CPP_OPEN_PAREN) - { - if (qualifier == "member") - { - error (l) << "unexpected '(' after db pragma " << p << endl; - return; - } - - if (l.next (tl, &tn) != CPP_CLOSE_PAREN) - { - error (l) << "')' expected at the end of db pragma " << p << endl; - return; - } - - val = false; // Object without id. - tt = l.next (tl, &tn); - } - else - { - if (qualifier == "object") - { - error (l) << "expected '(' after db pragma " << p << endl; - return; - } + name = "id"; + val = false; - val = true; // Member is object id. - } + tt = l.next (tl, &tn); } else if (p == "auto") { diff --git a/odb/validator.cxx b/odb/validator.cxx index 55f7edf..225a2a1 100644 --- a/odb/validator.cxx +++ b/odb/validator.cxx @@ -423,7 +423,7 @@ namespace os << c.file () << ":" << c.line () << ":" << c.column () << ":" << " info: or explicitly declare that this persistent class " - << "has no object id" << endl; + << "has no object id with '#pragma db object no_id'" << endl; valid_ = false; } -- cgit v1.1id
specifier cannot be used for data members of composite value types or views.