aboutsummaryrefslogtreecommitdiff
path: root/odb/relational/pgsql
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-03-15 12:40:52 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-04-10 18:46:43 +0200
commitac0fa531c7aba9d921068acfb7fceda054c5aa27 (patch)
tree24cb7896f2ea436cbc08790a41ad8695a69416ff /odb/relational/pgsql
parent62886c67aa1088a5e26b885bb0f44c0e02e0975d (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/pgsql')
-rw-r--r--odb/relational/pgsql/model.cxx32
-rw-r--r--odb/relational/pgsql/schema.cxx12
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_);