From 1a6a0652a6ef5b319cfc8ad05a0acee6910f7560 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 25 Apr 2011 15:02:43 +0200 Subject: Add support for abstract object types --- odb/relational/type-processor.cxx | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'odb/relational/type-processor.cxx') diff --git a/odb/relational/type-processor.cxx b/odb/relational/type-processor.cxx index 18d411c..5c86b10 100644 --- a/odb/relational/type-processor.cxx +++ b/odb/relational/type-processor.cxx @@ -22,7 +22,7 @@ namespace relational id_tree_type () { context& c (context::current ()); - semantics::data_member& id (context::id_member (*c.object)); + semantics::data_member& id (*context::id_member (*c.top_object)); return &id.type (); } @@ -30,7 +30,7 @@ namespace relational id_column_type () { context& c (context::current ()); - semantics::data_member& id (context::id_member (*c.object)); + semantics::data_member& id (*context::id_member (*c.top_object)); return id.get ("column-type"); } @@ -118,7 +118,7 @@ namespace relational // This is an object pointer. The column type is the pointed-to // object id type. Except by default it can be NULL. // - semantics::data_member& id (id_member (*c)); + semantics::data_member& id (*id_member (*c)); semantics::type& idt (id.type ()); if (type.empty () && id.count ("type")) @@ -203,7 +203,7 @@ namespace relational // This is an object pointer. The column type is the pointed-to // object id type. Except by default it can be NULL. // - semantics::data_member& id (id_member (*c)); + semantics::data_member& id (*id_member (*c)); semantics::type& idt (id.type ()); if (type.empty () && id.count ("type")) @@ -660,6 +660,20 @@ namespace relational throw generation_failed (); } + // Make sure the pointed-to class is not abstract. + // + if (context::abstract (*c)) + { + os << m.file () << ":" << m.line () << ":" << m.column () << ": " + << "error: pointed-to class '" << c->fq_name () << "' " + << "is abstract" << endl; + + os << c->file () << ":" << c->line () << ":" << c->column () << ": " + << "info: class '" << c->name () << "' is defined here" << endl; + + throw generation_failed (); + } + if (m.count ("not-null") && !kp.empty ()) { m.remove ("not-null"); -- cgit v1.1