From 853d76b58e96aab4e6182cc1234652dfcdd74c14 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 5 Apr 2013 10:16:48 +0200 Subject: Generate alter column migration statements --- odb/relational/oracle/schema.cxx | 65 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 6 deletions(-) (limited to 'odb/relational/oracle') diff --git a/odb/relational/oracle/schema.cxx b/odb/relational/oracle/schema.cxx index 34ede1c..024701c 100644 --- a/odb/relational/oracle/schema.cxx +++ b/odb/relational/oracle/schema.cxx @@ -344,6 +344,31 @@ namespace relational }; entry 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; + + if (first_) + first_ = false; + else + os << "," << endl + << " "; + + os << quote_id (ac.name ()) << (ac.null () ? " NULL" : " NOT NULL"); + } + }; + entry alter_column_; + struct alter_table_pre: relational::alter_table_pre, context { alter_table_pre (base const& x): base (x) {} @@ -360,9 +385,23 @@ namespace relational alter_header (at.name ()); os << " ADD ("; - instance c (emitter (), stream (), format_); - trav_rel::unames n; - n >> c; + instance cc (emitter (), stream (), format_); + trav_rel::unames n (*cc); + names (at, n); + os << ")" << endl; + + post_statement (); + } + + if (check_alter_null (at, true)) + { + pre_statement (); + alter_header (at.name ()); + os << " MODIFY ("; + + bool tl (true); // (Im)perfect forwarding. + instance ac (emitter (), stream (), format_, tl); + trav_rel::unames n (*ac); names (at, n); os << ")" << endl; @@ -388,9 +427,23 @@ namespace relational alter_header (at.name ()); os << " DROP ("; - instance c (emitter (), stream (), format_); - trav_rel::unames n; - n >> c; + instance dc (emitter (), stream (), format_); + trav_rel::unames n (*dc); + names (at, n); + os << ")" << endl; + + post_statement (); + } + + if (check_alter_null (at, false)) + { + pre_statement (); + alter_header (at.name ()); + os << " MODIFY ("; + + bool fl (false); // (Im)perfect forwarding. + instance ac (emitter (), stream (), format_, fl); + trav_rel::unames n (*ac); names (at, n); os << ")" << endl; -- cgit v1.1