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/mssql/schema.cxx | 84 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) (limited to 'odb/relational/mssql') diff --git a/odb/relational/mssql/schema.cxx b/odb/relational/mssql/schema.cxx index 58c0206..03406ce 100644 --- a/odb/relational/mssql/schema.cxx +++ b/odb/relational/mssql/schema.cxx @@ -40,6 +40,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) {} @@ -148,6 +166,18 @@ namespace relational create_column (base const& x): base (x) {} virtual void + traverse (sema_rel::add_column& ac) + { + if (first_) + first_ = false; + else + os << "," << endl + << " "; + + create (ac); + } + + virtual void auto_ (sema_rel::column&) { os << " IDENTITY"; @@ -305,6 +335,60 @@ 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) + { + // SQL Server can only alter one kind of thing 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) + { + // SQL Server can only alter one kind of thing at a time. + // + if (check (at)) + { + pre_statement (); + alter_header (at.name ()); + os << " DROP COLUMN "; + + 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