diff options
Diffstat (limited to 'odb/relational/schema.hxx')
-rw-r--r-- | odb/relational/schema.hxx | 205 |
1 files changed, 99 insertions, 106 deletions
diff --git a/odb/relational/schema.hxx b/odb/relational/schema.hxx index 4f31dca..6551119 100644 --- a/odb/relational/schema.hxx +++ b/odb/relational/schema.hxx @@ -58,65 +58,65 @@ namespace relational // Drop. // - struct drop_table: trav_rel::table, common + struct drop_index: trav_rel::index, common { - typedef drop_table base; + typedef drop_index base; - drop_table (emitter_type& e, ostream& os, schema_format f) + drop_index (emitter_type& e, ostream& os, schema_format f) : common (e, os), format_ (f) { } - virtual void - drop (sema_rel::qname const& table) + virtual string + name (sema_rel::index& in) { - os << "DROP TABLE IF EXISTS " << quote_id (table) << endl; + return quote_id (in.name ()); + } + + virtual string + table_name (sema_rel::index& in) + { + return quote_id (static_cast<sema_rel::table&> (in.scope ()).name ()); } virtual void - traverse (sema_rel::table& t) + drop (string const& /*name*/, string const& /*table*/) { - // By default we do everything in a single pass. But some - // databases may require the second pass. + // Most database systems drop indexes together with the table. // - if (pass_ > 1) - return; - - pre_statement (); - drop (t.name ()); - post_statement (); + // os << "DROP INDEX IF EXISTS " << quote_id (name) << " ON " << + // table << endl; } - void - pass (unsigned short p) + virtual void + traverse (sema_rel::index& in) { - pass_ = p; + pre_statement (); + drop (name (in), table_name (in)); + post_statement (); } protected: schema_format format_; - unsigned short pass_; }; - struct drop_index: trav_rel::index, common + struct drop_table: trav_rel::table, common { - typedef drop_index base; + typedef drop_table base; - drop_index (emitter_type& e, ostream& os, schema_format f) + drop_table (emitter_type& e, ostream& os, schema_format f) : common (e, os), format_ (f) { } virtual void - drop (sema_rel::qname const& /*index*/) + drop (sema_rel::qname const& table) { - // Most database systems drop indexes together with the table. - // - //os << "DROP INDEX IF EXISTS " << quote_id (index); + os << "DROP TABLE IF EXISTS " << quote_id (table) << endl; } virtual void - traverse (sema_rel::index& in) + traverse (sema_rel::table& t) { // By default we do everything in a single pass. But some // databases may require the second pass. @@ -124,8 +124,16 @@ namespace relational if (pass_ > 1) return; + // Drop indexes. + // + { + instance<drop_index> in (emitter (), stream (), format_); + trav_rel::unames n (*in); + names (t, n); + } + pre_statement (); - drop (in.name ()); + drop (t.name ()); post_statement (); } @@ -456,65 +464,6 @@ namespace relational create_table& create_table_; }; - struct create_table: trav_rel::table, common - { - typedef create_table base; - - create_table (emitter_type& e, ostream& os, schema_format f) - : common (e, os), format_ (f) - { - } - - virtual void - create_pre (sema_rel::qname const& table) - { - os << "CREATE TABLE " << quote_id (table) << " (" << endl; - } - - virtual void - create_post () - { - os << ")" << endl; - } - - virtual void - traverse (sema_rel::table& t) - { - // By default we do everything in a single pass. But some - // databases may require the second pass. - // - if (pass_ > 1) - return; - - pre_statement (); - create_pre (t.name ()); - - instance<create_column> c (format_, *this); - instance<create_primary_key> pk (format_, *this); - instance<create_foreign_key> fk (format_, *this); - trav_rel::unames n; - - n >> c; - n >> pk; - n >> fk; - - names (t, n); - - create_post (); - post_statement (); - } - - void - pass (unsigned short p) - { - pass_ = p; - } - - protected: - schema_format format_; - unsigned short pass_; - }; - struct create_index: trav_rel::index, common { typedef create_index base; @@ -527,12 +476,6 @@ namespace relational virtual void traverse (sema_rel::index& in) { - // By default we do everything in a single pass. But some - // databases may require the second pass. - // - if (pass_ > 1) - return; - pre_statement (); create (in); post_statement (); @@ -547,7 +490,7 @@ namespace relational virtual string table_name (sema_rel::index& in) { - return quote_id (in.table ().name ()); + return quote_id (static_cast<sema_rel::table&> (in.scope ()).name ()); } virtual void @@ -577,6 +520,66 @@ namespace relational os << ")" << endl; } + protected: + schema_format format_; + }; + + struct create_table: trav_rel::table, common + { + typedef create_table base; + + create_table (emitter_type& e, ostream& os, schema_format f) + : common (e, os), format_ (f) + { + } + + virtual void + create_pre (sema_rel::qname const& table) + { + os << "CREATE TABLE " << quote_id (table) << " (" << endl; + } + + virtual void + create_post () + { + os << ")" << endl; + } + + virtual void + traverse (sema_rel::table& t) + { + // By default we do everything in a single pass. But some + // databases may require the second pass. + // + if (pass_ > 1) + return; + + pre_statement (); + create_pre (t.name ()); + + instance<create_column> c (format_, *this); + instance<create_primary_key> pk (format_, *this); + instance<create_foreign_key> fk (format_, *this); + trav_rel::unames n; + + n >> c; + n >> pk; + n >> fk; + + names (t, n); + + create_post (); + post_statement (); + + // Create indexes. + // + { + instance<create_index> in (emitter (), stream (), format_); + trav_rel::unames n (*in); + names (t, n); + } + } + void pass (unsigned short p) { @@ -799,10 +802,8 @@ namespace relational : stream_ (*emitter_), drop_model_ (*emitter_, stream_, format_embedded), drop_table_ (*emitter_, stream_, format_embedded), - drop_index_ (*emitter_, stream_, format_embedded), create_model_ (*emitter_, stream_, format_embedded), - create_table_ (*emitter_, stream_, format_embedded), - create_index_ (*emitter_, stream_, format_embedded) + create_table_ (*emitter_, stream_, format_embedded) { init (); } @@ -813,10 +814,8 @@ namespace relational stream_ (*emitter_), drop_model_ (*emitter_, stream_, format_embedded), drop_table_ (*emitter_, stream_, format_embedded), - drop_index_ (*emitter_, stream_, format_embedded), create_model_ (*emitter_, stream_, format_embedded), - create_table_ (*emitter_, stream_, format_embedded), - create_index_ (*emitter_, stream_, format_embedded) + create_table_ (*emitter_, stream_, format_embedded) { init (); } @@ -826,11 +825,9 @@ namespace relational { drop_model_ >> drop_names_; drop_names_ >> drop_table_; - drop_names_ >> drop_index_; create_model_ >> create_names_; create_names_ >> create_table_; - create_names_ >> create_index_; } void @@ -872,7 +869,6 @@ namespace relational emitter_->pass (pass); drop_model_->pass (pass); drop_table_->pass (pass); - drop_index_->pass (pass); drop_model_->traverse (begin, end); @@ -900,7 +896,6 @@ namespace relational emitter_->pass (pass); create_model_->pass (pass); create_table_->pass (pass); - create_index_->pass (pass); create_model_->traverse (begin, end); @@ -932,12 +927,10 @@ namespace relational trav_rel::qnames drop_names_; instance<drop_model> drop_model_; instance<drop_table> drop_table_; - instance<drop_index> drop_index_; trav_rel::qnames create_names_; instance<create_model> create_model_; instance<create_table> create_table_; - instance<create_index> create_index_; }; } } |