diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-09-06 14:42:43 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-09-06 14:42:43 +0200 |
commit | 61663c06d351a7c5cb868840d3c94cb95335b2d6 (patch) | |
tree | 0e1ec7d8509dc39d7ac9618dfe126186c07cd347 /odb/relational | |
parent | 428558c89850fe8c79b9c89a943bd996912d12f5 (diff) |
Add support for object pragma
This pragma is used to specify objects in a view declaration.
Diffstat (limited to 'odb/relational')
-rw-r--r-- | odb/relational/header.hxx | 31 | ||||
-rw-r--r-- | odb/relational/type-processor.cxx | 68 |
2 files changed, 85 insertions, 14 deletions
diff --git a/odb/relational/header.hxx b/odb/relational/header.hxx index f7e1058..30cb01e 100644 --- a/odb/relational/header.hxx +++ b/odb/relational/header.hxx @@ -1133,17 +1133,26 @@ namespace relational // query_type // - os << "typedef query_base_type query_type;" - << endl; - - /* - os << "struct query_type: query_base_type, query_columns" - << "{" - << "query_type ();" - << "query_type (const std::string&);" - << "query_type (const query_base_type&);" - << "};"; - */ + if (c.count ("objects")) + { + /* + typedef std::vector<semantics::class_*> objects; + + objects const& objs (c.get<objects> ("objects")); + */ + + /* + os << "struct query_type: query_base_type, query_columns" + << "{" + << "query_type ();" + << "query_type (const std::string&);" + << "query_type (const query_base_type&);" + << "};"; + */ + } + else + os << "typedef query_base_type query_type;" + << endl; // // Functions. diff --git a/odb/relational/type-processor.cxx b/odb/relational/type-processor.cxx index 362fab3..14b546e 100644 --- a/odb/relational/type-processor.cxx +++ b/odb/relational/type-processor.cxx @@ -5,6 +5,8 @@ #include <odb/gcc.hxx> +#include <vector> + #include <odb/cxx-lexer.hxx> #include <odb/relational/context.hxx> @@ -1087,17 +1089,77 @@ namespace relational virtual void traverse (type& c) { - bool ov (object (c) || view (c)); + class_kind_type k (class_kind (c)); - if (!(ov || composite (c))) + if (k == class_other) return; names (c); // Assign pointer. // - if (ov) + if (k == class_object || k == class_view) assign_pointer (c); + + // Do some additional processing for views. + // + if (k == class_view) + traverse_view (c); + } + + virtual void + traverse_view (type& c) + { + // Convert referenced objects from tree nodes to semantic graph + // nodes. + // + if (c.count ("objects")) + { + using semantics::class_; + + typedef vector<tree> tree_nodes; + typedef vector<class_*> class_nodes; + + strings names (c.get<strings> ("objects")); + tree_nodes tnodes (c.get<tree_nodes> ("objects-node")); + + c.remove ("objects"); + c.remove ("objects-node"); + + c.set ("objects", class_nodes ()); + class_nodes& nodes (c.get<class_nodes> ("objects")); + + for (size_t i (0); i < names.size (); ++i) + { + tree n (TYPE_MAIN_VARIANT (tnodes[i])); + + if (TREE_CODE (n) != RECORD_TYPE) + { + os << c.file () << ":" << c.line () << ":" << c.column () << ":" + << " error: name '" << names[i] << "' in db pragma object " + << " does not name a class" << endl; + + throw generation_failed (); + } + + class_& o (dynamic_cast<class_&> (*unit.find (n))); + + if (!object (o)) + { + os << c.file () << ":" << c.line () << ":" << c.column () << ":" + << " error: name '" << names[i] << "' in db pragma object " + << "does not name a persistent class" << endl; + + os << o.file () << ":" << o.line () << ":" << o.column () << ":" + << " info: class '" << names[i] << "' is defined here" + << endl; + + throw generation_failed (); + } + + nodes.push_back (&o); + } + } } void |