summaryrefslogtreecommitdiff
path: root/odb/relational/mssql/schema.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-04-05 07:30:19 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-04-10 18:46:44 +0200
commitc9dbc099d74d92b17724a24823aafe1fcc8ca7e7 (patch)
tree1c536796f06386209cb2331df1d245ed93497ca9 /odb/relational/mssql/schema.cxx
parent6d4b471afd63780b8a8a6c2d3fb8cc529ab5b15d (diff)
Generate add/drop column migration statements
Diffstat (limited to 'odb/relational/mssql/schema.cxx')
-rw-r--r--odb/relational/mssql/schema.cxx84
1 files changed, 84 insertions, 0 deletions
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> 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> 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<sema_rel::add_column> (at))
+ {
+ pre_statement ();
+ alter_header (at.name ());
+ os << " ADD ";
+
+ instance<create_column> c (emitter (), stream (), format_);
+ trav_rel::unames n;
+ n >> c;
+ names (at, n);
+ os << endl;
+
+ post_statement ();
+ }
+ }
+ };
+ entry<alter_table_pre> 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<sema_rel::drop_column> (at))
+ {
+ pre_statement ();
+ alter_header (at.name ());
+ os << " DROP COLUMN ";
+
+ instance<drop_column> c (emitter (), stream (), format_);
+ trav_rel::unames n;
+ n >> c;
+ names (at, n);
+ os << endl;
+
+ post_statement ();
+ }
+ }
+ };
+ entry<alter_table_post> alter_table_post_;
}
}
}