From c9dbc099d74d92b17724a24823aafe1fcc8ca7e7 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 5 Apr 2013 07:30:19 +0200 Subject: Generate add/drop column migration statements --- odb/relational/oracle/schema.cxx | 92 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) (limited to 'odb/relational/oracle') diff --git a/odb/relational/oracle/schema.cxx b/odb/relational/oracle/schema.cxx index a76e25a..34ede1c 100644 --- a/odb/relational/oracle/schema.cxx +++ b/odb/relational/oracle/schema.cxx @@ -88,6 +88,24 @@ namespace relational // Drop. // + struct drop_column: relational::drop_column, context + { + drop_column (base const& x): base (x) {} + + virtual void + traverse (sema_rel::drop_column& dc) + { + if (first_) + first_ = false; + else + os << "," << endl + << " "; + + os << quote_id (dc.name ()); + } + }; + entry drop_column_; + struct drop_table: relational::drop_table, context { drop_table (base const& x): base (x) {} @@ -167,6 +185,24 @@ namespace relational // Create. // + struct create_column: relational::create_column, context + { + create_column (base const& x): base (x) {} + + virtual void + traverse (sema_rel::add_column& ac) + { + if (first_) + first_ = false; + else + os << "," << endl + << " "; + + create (ac); + } + }; + entry create_column_; + struct create_foreign_key; struct create_table: relational::create_table, context @@ -307,6 +343,62 @@ namespace relational } }; entry drop_index_; + + struct alter_table_pre: relational::alter_table_pre, context + { + alter_table_pre (base const& x): base (x) {} + + virtual void + alter (sema_rel::alter_table& at) + { + // Oracle can only alter certain kinds of things together but + // grouped one at a time. + // + if (check (at)) + { + pre_statement (); + alter_header (at.name ()); + os << " ADD ("; + + instance c (emitter (), stream (), format_); + trav_rel::unames n; + n >> c; + names (at, n); + os << ")" << endl; + + post_statement (); + } + } + }; + entry alter_table_pre_; + + struct alter_table_post: relational::alter_table_post, context + { + alter_table_post (base const& x): base (x) {} + + virtual void + alter (sema_rel::alter_table& at) + { + // Oracle can only alter certain kinds of things together but + // grouped one at a time. + // + if (check (at)) + { + pre_statement (); + alter_header (at.name ()); + os << " DROP ("; + + instance c (emitter (), stream (), format_); + trav_rel::unames n; + n >> c; + names (at, n); + os << ")" << endl; + + post_statement (); + } + } + }; + entry alter_table_post_; } } } -- cgit v1.1