aboutsummaryrefslogtreecommitdiff
path: root/odb/relational/oracle
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/oracle
parentc9dbc099d74d92b17724a24823aafe1fcc8ca7e7 (diff)
Generate alter column migration statements
Diffstat (limited to 'odb/relational/oracle')
-rw-r--r--odb/relational/oracle/schema.cxx65
1 files changed, 59 insertions, 6 deletions
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> 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> 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<create_column> c (emitter (), stream (), format_);
- trav_rel::unames n;
- n >> c;
+ instance<create_column> 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<alter_column> 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<drop_column> c (emitter (), stream (), format_);
- trav_rel::unames n;
- n >> c;
+ instance<drop_column> 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<alter_column> ac (emitter (), stream (), format_, fl);
+ trav_rel::unames n (*ac);
names (at, n);
os << ")" << endl;