aboutsummaryrefslogtreecommitdiff
path: root/odb/relational/oracle
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/oracle
parent6d4b471afd63780b8a8a6c2d3fb8cc529ab5b15d (diff)
Generate add/drop column migration statements
Diffstat (limited to 'odb/relational/oracle')
-rw-r--r--odb/relational/oracle/schema.cxx92
1 files changed, 92 insertions, 0 deletions
diff --git a/odb/relational/oracle/schema.cxx b/odb/relational/oracle/schema.cxx
index a76e25a..34ede1c 100644
--- a/odb/relational/oracle/schema.cxx
+++ b/odb/relational/oracle/schema.cxx
@@ -88,6 +88,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) {}
@@ -167,6 +185,24 @@ namespace relational
// Create.
//
+ struct create_column: relational::create_column, context
+ {
+ create_column (base const& x): base (x) {}
+
+ virtual void
+ traverse (sema_rel::add_column& ac)
+ {
+ if (first_)
+ first_ = false;
+ else
+ os << "," << endl
+ << " ";
+
+ create (ac);
+ }
+ };
+ entry<create_column> create_column_;
+
struct create_foreign_key;
struct create_table: relational::create_table, context
@@ -307,6 +343,62 @@ 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)
+ {
+ // Oracle can only alter certain kinds of things together but
+ // grouped one 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)
+ {
+ // Oracle can only alter certain kinds of things together but
+ // grouped one at a time.
+ //
+ if (check<sema_rel::drop_column> (at))
+ {
+ pre_statement ();
+ alter_header (at.name ());
+ os << " DROP (";
+
+ 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_;
}
}
}