From 20f2d671951ce2bf3e4b86d26e326e770733e421 Mon Sep 17 00:00:00 2001 From: Constantin Michael Date: Thu, 20 Oct 2011 10:45:31 +0200 Subject: Add persist_stmt hook to handle generation of persist statement SQL ODB requires that Oracle persist statements include a RETURNING clause so that a generated auto_id column value may be returned. --- odb/relational/oracle/source.cxx | 29 +++++++++++++++++++++++++++++ odb/relational/source.hxx | 37 ++++++++++++++++++++++++++++--------- 2 files changed, 57 insertions(+), 9 deletions(-) (limited to 'odb/relational') diff --git a/odb/relational/oracle/source.cxx b/odb/relational/oracle/source.cxx index d50808a..992a8e4 100644 --- a/odb/relational/oracle/source.cxx +++ b/odb/relational/oracle/source.cxx @@ -763,6 +763,35 @@ namespace relational { os << "sts.find_statement ().stream_result ();"; } + + virtual void + persist_stmt (type& c) + { + os << strlit ("INSERT INTO " + table_qname (c) + " (") << endl; + + instance ct (false); + ct->traverse (c); + + string values; + instance pt (values); + pt->traverse (c); + + os << strlit (") VALUES (" + values + ")"); + + semantics::data_member* id (id_member (c)); + + if (id->count ("auto")) + { + ostringstream n; + n << pt->count () + 1; + + os << endl + << strlit (" RETURNING " + + column_qname (*id) + + " INTO :" + + n.str ()); + } + } }; entry class_entry_; } diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx index 52303ee..f18c51d 100644 --- a/odb/relational/source.hxx +++ b/odb/relational/source.hxx @@ -1974,6 +1974,12 @@ namespace relational } } + size_t + count () const + { + return count_; + } + private: string& params_; size_t count_; @@ -2058,6 +2064,25 @@ namespace relational } // + // statements + // + + virtual void + persist_stmt (type& c) + { + os << strlit ("INSERT INTO " + table_qname(c) + " (") << endl; + + instance ct (false); + ct->traverse (c); + + string values; + instance pt (values); + pt->traverse (c); + + os << strlit (") VALUES (" + values + ")"); + } + + // // common // @@ -2308,17 +2333,11 @@ namespace relational // { os << "const char " << traits << "::persist_statement[] " << - "=" << endl - << strlit ("INSERT INTO " + table + " (") << endl; + "=" << endl; - instance ct (false); - ct->traverse (c); + persist_stmt (c); - string values; - instance pt (values); - pt->traverse (c); - - os << strlit (") VALUES (" + values + ")") << ";" + os << ";" << endl; } -- cgit v1.1