aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-07-08 13:20:09 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-07-08 13:20:09 +0200
commitbebd8368d17b8bfe245cab04d6118f50933216d3 (patch)
tree3b25082333d7d615ee34f4ae4cc897dff187769c
parent8ea45e39522f7040048c28dbeae853eea6b03b71 (diff)
Have separate table set for each schema generation pass
-rw-r--r--odb/relational/schema.cxx17
-rw-r--r--odb/relational/schema.hxx56
-rw-r--r--odb/relational/source.hxx28
3 files changed, 51 insertions, 50 deletions
diff --git a/odb/relational/schema.cxx b/odb/relational/schema.cxx
index 87e0533..6acb6dc 100644
--- a/odb/relational/schema.cxx
+++ b/odb/relational/schema.cxx
@@ -86,9 +86,7 @@ namespace relational
traversal::unit unit;
traversal::defines unit_defines;
traversal::namespace_ ns;
-
- unsigned short pass (1);
- instance<class_create> c (emitter, pass);
+ instance<class_create> c (emitter);
unit >> unit_defines >> ns;
unit_defines >> c;
@@ -98,14 +96,13 @@ namespace relational
ns >> ns_defines >> ns;
ns_defines >> c;
- // Pass 1.
+ // Pass 1 and 2.
//
- unit.dispatch (ctx.unit);
-
- // Pass 2.
- //
- pass = 2;
- unit.dispatch (ctx.unit);
+ for (unsigned short pass (1); pass < 3; ++pass)
+ {
+ c->pass (pass);
+ unit.dispatch (ctx.unit);
+ }
}
}
}
diff --git a/odb/relational/schema.hxx b/odb/relational/schema.hxx
index 28a893a..b9243df 100644
--- a/odb/relational/schema.hxx
+++ b/odb/relational/schema.hxx
@@ -7,6 +7,7 @@
#define ODB_RELATIONAL_SCHEMA_HXX
#include <set>
+#include <vector>
#include <cassert>
#include <odb/emitter.hxx>
@@ -248,15 +249,15 @@ namespace relational
{
typedef member_create base;
- member_create (emitter& e,
- ostream& os,
- tables& t,
- unsigned short const& pass)
- : object_members_base (false, true),
- common (e, os),
- tables_ (t),
- pass_ (pass)
+ member_create (emitter& e, ostream& os, std::vector<tables>& t)
+ : object_members_base (false, true), common (e, os), tables_ (t)
+ {
+ }
+
+ void
+ pass (unsigned short p)
{
+ pass_ = p;
}
virtual void
@@ -276,7 +277,7 @@ namespace relational
string const& name (table_name (m, table_prefix_));
- if (tables_.count (name))
+ if (tables_[pass_].count (name))
return;
pre_statement ();
@@ -345,7 +346,7 @@ namespace relational
create_table_post ();
post_statement ();
- tables_.insert (name);
+ tables_[pass_].insert (name);
// Create indexes.
//
@@ -362,20 +363,18 @@ namespace relational
}
protected:
- tables& tables_;
- unsigned short const& pass_;
+ std::vector<tables>& tables_;
+ unsigned short pass_;
};
struct class_create: traversal::class_, common, virtual create_common
{
typedef class_create base;
- class_create (emitter& e, unsigned short const& pass)
- : common (e, os_),
- os_ (e),
- pass_ (pass),
- member_create_ (e, os_, tables_, pass_)
+ class_create (emitter& e)
+ : common (e, os_), os_ (e), member_create_ (e, os_, tables_)
{
+ tables_.push_back (tables ()); // Dummy entry.
}
class_create (class_create const& x)
@@ -383,9 +382,20 @@ namespace relational
context (),
common (x.e_, os_),
os_ (x.e_),
- pass_ (x.pass_),
- member_create_ (x.e_, os_, tables_, pass_)
+ member_create_ (x.e_, os_, tables_)
{
+ tables_.push_back (tables ()); // Dummy entry.
+ }
+
+ void
+ pass (unsigned short p)
+ {
+ pass_ = p;
+
+ if (tables_.size () == pass_)
+ tables_.push_back (tables ());
+
+ member_create_->pass (p);
}
virtual void
@@ -408,7 +418,7 @@ namespace relational
// If the table with this name was already created, assume the
// user knows what they are doing and skip it.
//
- if (tables_.count (name))
+ if (tables_[pass_].count (name))
return;
pre_statement ();
@@ -422,7 +432,7 @@ namespace relational
create_table_post ();
post_statement ();
- tables_.insert (name);
+ tables_[pass_].insert (name);
// Create tables for members.
//
@@ -430,9 +440,9 @@ namespace relational
}
protected:
- tables tables_;
emitter_ostream os_;
- unsigned short const& pass_;
+ unsigned short pass_;
+ std::vector<tables> tables_; // Seperate table for each pass.
instance<member_create> member_create_;
};
}
diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx
index 8221ec2..3d82863 100644
--- a/odb/relational/source.hxx
+++ b/odb/relational/source.hxx
@@ -1780,7 +1780,7 @@ namespace relational
init_id_image_member_ ("id_", "id"),
init_id_value_member_ ("id"),
schema_drop_ (schema_emitter_),
- schema_create_ (schema_emitter_, pass_)
+ schema_create_ (schema_emitter_)
{
init ();
}
@@ -1794,7 +1794,7 @@ namespace relational
init_id_image_member_ ("id_", "id"),
init_id_value_member_ ("id"),
schema_drop_ (schema_emitter_),
- schema_create_ (schema_emitter_, pass_)
+ schema_create_ (schema_emitter_)
{
init ();
}
@@ -2629,24 +2629,19 @@ namespace relational
// Pass 0.
//
- pass_ = 0;
- schema_emitter_.pass (pass_);
+ schema_emitter_.pass (0);
schema_drop_->traverse (c);
close = close || !schema_emitter_.empty ();
- // Pass 1.
+ // Pass 1 and 2.
//
- pass_ = 1;
- schema_emitter_.pass (pass_);
- schema_create_->traverse (c);
- close = close || !schema_emitter_.empty ();
-
- // Pass 2.
- //
- pass_ = 2;
- schema_emitter_.pass (pass_);
- schema_create_->traverse (c);
- close = close || !schema_emitter_.empty ();
+ for (unsigned short pass (1); pass < 3; ++pass)
+ {
+ schema_emitter_.pass (pass);
+ schema_create_->pass (pass);
+ schema_create_->traverse (c);
+ close = close || !schema_emitter_.empty ();
+ }
if (close) // Close the last case and the switch block.
os << "return false;"
@@ -2776,7 +2771,6 @@ namespace relational
traversal::names init_value_member_names_;
instance<init_value_member> init_id_value_member_;
- unsigned short pass_;
schema_emitter schema_emitter_;
instance<schema::class_drop> schema_drop_;
instance<schema::class_create> schema_create_;