From adfa9bbd04cd3571932ee7675344ca723bfa1eab Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 20 Jul 2012 14:26:23 +0200 Subject: Move indexes from model scope to table scope Conceptually, indexes belong to tables and some databases (MySQL, MSSQL) indeed treat them as such (i.e., you can have indexes with the same name in different tables). --- odb/relational/schema.hxx | 205 ++++++++++++++++++++++------------------------ 1 file changed, 99 insertions(+), 106 deletions(-) (limited to 'odb/relational/schema.hxx') 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 (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 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 c (format_, *this); - instance pk (format_, *this); - instance 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 (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 c (format_, *this); + instance pk (format_, *this); + instance fk (format_, *this); + trav_rel::unames n; + + n >> c; + n >> pk; + n >> fk; + + names (t, n); + + create_post (); + post_statement (); + + // Create indexes. + // + { + instance 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_; instance drop_table_; - instance drop_index_; trav_rel::qnames create_names_; instance create_model_; instance create_table_; - instance create_index_; }; } } -- cgit v1.1