From bebd8368d17b8bfe245cab04d6118f50933216d3 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 8 Jul 2011 13:20:09 +0200 Subject: Have separate table set for each schema generation pass --- odb/relational/schema.cxx | 17 ++++++-------- odb/relational/schema.hxx | 56 ++++++++++++++++++++++++++++------------------- odb/relational/source.hxx | 28 ++++++++++-------------- 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 c (emitter, pass); + instance 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 +#include #include #include @@ -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& 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_; + 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_; // Seperate table for each pass. instance 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_id_value_member_; - unsigned short pass_; schema_emitter schema_emitter_; instance schema_drop_; instance schema_create_; -- cgit v1.1