From ac0fa531c7aba9d921068acfb7fceda054c5aa27 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 15 Mar 2013 12:40:52 +0200 Subject: Move type check to model creation instead of schema generation This way we make sure cxx-location is only used during model creation. As a result, we can now generate schema from a model instantiated from XML. --- odb/relational/pgsql/model.cxx | 32 ++++++++++++++++++++++++++++++++ odb/relational/pgsql/schema.cxx | 12 ++---------- 2 files changed, 34 insertions(+), 10 deletions(-) (limited to 'odb/relational/pgsql') diff --git a/odb/relational/pgsql/model.cxx b/odb/relational/pgsql/model.cxx index ff2ce39..7361c6e 100644 --- a/odb/relational/pgsql/model.cxx +++ b/odb/relational/pgsql/model.cxx @@ -4,6 +4,8 @@ #include +#include + #include #include @@ -23,6 +25,36 @@ namespace relational { object_columns (base const& x): base (x) {} + virtual void + traverse_object (semantics::class_& c) + { + base::traverse_object (c); + + if (context::top_object == &c) + { + // Make sure that the auto id type is INTEGER or BIGINT. + // + if (pkey_ != 0 && pkey_->auto_ ()) + { + // Should be a single column. + // + sema_rel::column& c (pkey_->contains_begin ()->column ()); + + // This should never fail since we have already parsed this. + // + sql_type const& t (parse_sql_type (c.type ())); + + if (t.type != sql_type::INTEGER && t.type != sql_type::BIGINT) + { + location const& l (c.get ("cxx-location")); + error (l) << "automatically assigned object id must map " + << "to PostgreSQL INTEGER or BIGINT" << endl; + throw operation_failed (); + } + } + } + } + virtual string default_bool (semantics::data_member&, bool v) { diff --git a/odb/relational/pgsql/schema.cxx b/odb/relational/pgsql/schema.cxx index 0885200..0a2b82d 100644 --- a/odb/relational/pgsql/schema.cxx +++ b/odb/relational/pgsql/schema.cxx @@ -4,7 +4,6 @@ #include -#include #include #include @@ -69,19 +68,12 @@ namespace relational // sql_type const& t (parse_sql_type (c.type ())); + // The model creation code makes sure it is one of these type. + // if (t.type == sql_type::INTEGER) os << "SERIAL"; else if (t.type == sql_type::BIGINT) os << "BIGSERIAL"; - else - { - location const& l (c.get ("cxx-location")); - - error (l) << "automatically assigned object id must map " - << "to PostgreSQL INTEGER or BIGINT" << endl; - - throw operation_failed (); - } } else base::type (c, auto_); -- cgit v1.1