summaryrefslogtreecommitdiff
path: root/odb/relational/mssql/schema.cxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-04-05 10:16:48 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-04-10 18:46:44 +0200
commit853d76b58e96aab4e6182cc1234652dfcdd74c14 (patch)
tree612e54f542dd3d6a11d8a8299f2c82f35e9e714e /odb/relational/mssql/schema.cxx
parentc9dbc099d74d92b17724a24823aafe1fcc8ca7e7 (diff)
Generate alter column migration statements
Diffstat (limited to 'odb/relational/mssql/schema.cxx')
-rw-r--r--odb/relational/mssql/schema.cxx53
1 files changed, 49 insertions, 4 deletions
diff --git a/odb/relational/mssql/schema.cxx b/odb/relational/mssql/schema.cxx
index 03406ce..2db0c12 100644
--- a/odb/relational/mssql/schema.cxx
+++ b/odb/relational/mssql/schema.cxx
@@ -336,6 +336,35 @@ namespace relational
};
entry<drop_index> drop_index_;
+ struct alter_column: relational::alter_column, context
+ {
+ alter_column (base const& x): base (x) {}
+
+ virtual void
+ traverse (sema_rel::alter_column& ac)
+ {
+ assert (ac.null_altered ());
+
+ // Relax (NULL) in pre and tighten (NOT NULL) in post.
+ //
+ if (pre_ != ac.null ())
+ return;
+
+ using sema_rel::alter_table;
+ alter_table& at (static_cast<alter_table&> (ac.scope ()));
+
+ pre_statement ();
+
+ os << "ALTER TABLE " << quote_id (at.name ()) << endl
+ << " ALTER COLUMN ";
+ alter (ac);
+ os << endl;
+
+ post_statement ();
+ }
+ };
+ entry<alter_column> alter_column_;
+
struct alter_table_pre: relational::alter_table_pre, context
{
alter_table_pre (base const& x): base (x) {}
@@ -352,13 +381,21 @@ namespace relational
os << " ADD ";
instance<create_column> c (emitter (), stream (), format_);
- trav_rel::unames n;
- n >> c;
+ trav_rel::unames n (*c);
names (at, n);
os << endl;
post_statement ();
}
+
+ // For ALTER COLUMN, SQL Server can only have one per ALTER TABLE.
+ //
+ {
+ bool tl (true); // (Im)perfect forwarding.
+ instance<alter_column> ac (emitter (), stream (), format_, tl);
+ trav_rel::unames n (*ac);
+ names (at, n);
+ }
}
};
entry<alter_table_pre> alter_table_pre_;
@@ -379,13 +416,21 @@ namespace relational
os << " DROP COLUMN ";
instance<drop_column> c (emitter (), stream (), format_);
- trav_rel::unames n;
- n >> c;
+ trav_rel::unames n (*c);
names (at, n);
os << endl;
post_statement ();
}
+
+ // For ALTER COLUMN, SQL Server can only have one per ALTER TABLE.
+ //
+ {
+ bool fl (false); // (Im)perfect forwarding.
+ instance<alter_column> ac (emitter (), stream (), format_, fl);
+ trav_rel::unames n (*ac);
+ names (at, n);
+ }
}
};
entry<alter_table_post> alter_table_post_;