summaryrefslogtreecommitdiff
path: root/odb/relational/schema.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-07-20 14:26:23 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-07-27 10:30:15 +0200
commitadfa9bbd04cd3571932ee7675344ca723bfa1eab (patch)
treec47487e8253d71ce0f2dd2e360f872e1e59a6cef /odb/relational/schema.hxx
parent526f66e63f23afb40cc01550ca1a3a3592a84254 (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.hxx205
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_;
};
}
}