diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-07-20 14:26:23 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-07-27 10:30:15 +0200 |
commit | adfa9bbd04cd3571932ee7675344ca723bfa1eab (patch) | |
tree | c47487e8253d71ce0f2dd2e360f872e1e59a6cef /odb/relational/schema.hxx | |
parent | 526f66e63f23afb40cc01550ca1a3a3592a84254 (diff) |
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).
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_; }; } } |