diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2013-03-15 12:40:52 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2013-04-10 18:46:43 +0200 |
commit | ac0fa531c7aba9d921068acfb7fceda054c5aa27 (patch) | |
tree | 24cb7896f2ea436cbc08790a41ad8695a69416ff /odb/relational | |
parent | 62886c67aa1088a5e26b885bb0f44c0e02e0975d (diff) |
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.
Diffstat (limited to 'odb/relational')
-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_); |