diff options
-rw-r--r-- | odb/relational/pgsql/model.cxx | 32 | ||||
-rw-r--r-- | odb/relational/pgsql/schema.cxx | 12 |
2 files changed, 34 insertions, 10 deletions
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 <sstream> +#include <odb/diagnostics.hxx> + #include <odb/relational/model.hxx> #include <odb/relational/pgsql/common.hxx> @@ -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<location> ("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 <set> -#include <odb/diagnostics.hxx> #include <odb/relational/schema.hxx> #include <odb/relational/pgsql/common.hxx> @@ -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<location> ("cxx-location")); - - error (l) << "automatically assigned object id must map " - << "to PostgreSQL INTEGER or BIGINT" << endl; - - throw operation_failed (); - } } else base::type (c, auto_); |