From 7470a1aeb62f13a9834c566c1bdafa53f80c78ac Mon Sep 17 00:00:00 2001 From: Constantin Michael Date: Fri, 14 Oct 2011 15:05:49 +0200 Subject: Specialize schema_emitter for Oracle SQLPlus scripts are required to indicate PL/SQL block terminations with a trail '/'. --- odb/relational/oracle/schema.cxx | 47 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) (limited to 'odb/relational') diff --git a/odb/relational/oracle/schema.cxx b/odb/relational/oracle/schema.cxx index 7b8a622..acc512f 100644 --- a/odb/relational/oracle/schema.cxx +++ b/odb/relational/oracle/schema.cxx @@ -3,11 +3,15 @@ // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : GNU GPL v3; see accompanying LICENSE file +#include + #include #include #include +using namespace std; + namespace relational { namespace oracle @@ -16,6 +20,48 @@ namespace relational { namespace relational = relational::schema; + struct schema_emitter: relational::schema_emitter + { + schema_emitter (const base& x): base (x) {} + + virtual void + pre () + { + first_ = true; + } + + virtual void + line (const std::string& l) + { + if (first_) + first_ = false; + else + os << endl; + + last_ = l; + os << l; + } + + virtual void + post () + { + if (!first_) // Ignore empty statements. + { + if (last_ == "END;") + os << endl + << '/' << endl; + else + os << ';' << endl + << endl; + } + } + + private: + bool first_; + string last_; + }; + entry schema_emitter_; + // // Drop. // @@ -44,6 +90,7 @@ namespace relational << " WHEN OTHERS THEN" << endl << " IF SQLCODE != -2289 THEN RAISE; END IF;" << endl << " END;" << endl + << " BEGIN" << endl << " EXECUTE IMMEDIATE 'DROP TRIGGER " << quote_id (table + "_trig") << "';" << endl << " EXCEPTION" << endl -- cgit v1.1