From c998d05c355518ba3b7e27f6833e00684d9c5764 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 19 Nov 2014 11:51:17 +0200 Subject: Implement bulk API code generation --- odb/oracle/statement.cxx | 37 +++++++++++++++++-------------------- odb/oracle/statement.hxx | 26 +++++++++++++++++++++++--- 2 files changed, 40 insertions(+), 23 deletions(-) diff --git a/odb/oracle/statement.cxx b/odb/oracle/statement.cxx index c0c0741..023e41f 100644 --- a/odb/oracle/statement.cxx +++ b/odb/oracle/statement.cxx @@ -71,6 +71,14 @@ namespace odb SQLT_CLOB // bind::nclob }; + template + inline T* + offset (T* base, size_t count, size_t size) + { + return reinterpret_cast ( + reinterpret_cast (base) + count * size); + } + extern "C" sb4 odb_oracle_param_callback_proxy (void* context, OCIBind*, @@ -86,19 +94,15 @@ namespace odb // Offset the data based on the current iteration and skip size (stored // in capacity). // - sb2* ind (reinterpret_cast ( - reinterpret_cast (b.indicator) + it * b.capacity)); + sb2* ind (offset (b.indicator, it, b.capacity)); // Only call the callback if the parameter is not NULL. // if (*ind != -1) { - lob* l (reinterpret_cast ( - static_cast (b.buffer) + it * b.capacity)); - + lob* l (static_cast (offset (b.buffer, it, b.capacity))); lob_callback* cb ( - reinterpret_cast ( - reinterpret_cast (b.callback) + it * b.capacity)); + static_cast (offset (b.callback, it, b.capacity))); chunk_position pos; if (!(*cb->callback.param) ( @@ -605,8 +609,7 @@ namespace odb for (size_t i (0); i != batch;) { l->buffer = &lob_buffer; - l = reinterpret_cast ( - static_cast (b->buffer) + ++i * skip); + l = static_cast (offset (b->buffer, ++i, skip)); } } @@ -1816,13 +1819,11 @@ namespace odb // Offset the data based on the current iteration and skip size. // The id is always first. // - sb2* ind (reinterpret_cast ( - reinterpret_cast ( - ret.bind[0].indicator) + it * ret.skip)); - *buffer = 0; *size = 0; *piece = OCI_ONE_PIECE; + + sb2* ind (offset (ret.bind[0].indicator, it, ret.skip)); *ind = -1; *indicator = ind; @@ -1846,7 +1847,7 @@ namespace odb // Offset the data based on the current iteration and skip size. // - *buffer = static_cast (b.buffer) + it * skip; + *buffer = offset (b.buffer, it, skip); if (b.type == bind::number) { @@ -1870,9 +1871,7 @@ namespace odb if (st.ret_prev_ != 0) *st.ret_prev_ = static_cast (st.ret_size_); - st.ret_prev_ = reinterpret_cast ( - reinterpret_cast (b.size) + it * skip); - + st.ret_prev_ = offset (b.size, it, skip); *size = &st.ret_size_; } @@ -1881,9 +1880,7 @@ namespace odb // **size = b.capacity; - *indicator = reinterpret_cast ( - reinterpret_cast (b.indicator) + it * skip); - + *indicator = offset (b.indicator, it, skip); *rcode = 0; *piece = OCI_ONE_PIECE; diff --git a/odb/oracle/statement.hxx b/odb/oracle/statement.hxx index 83ce5f7..6a5d604 100644 --- a/odb/oracle/statement.hxx +++ b/odb/oracle/statement.hxx @@ -318,7 +318,10 @@ namespace odb // Return the number of parameter sets (out of n) that were attempted. // std::size_t - execute (std::size_t n, multiple_exceptions*); + execute (std::size_t n, multiple_exceptions& mex) + { + return execute (n, &mex); + } // Return true if successful and false if this row is a duplicate. // All other errors are reported via exceptions. @@ -341,6 +344,9 @@ namespace odb void init (binding& param); + std::size_t + execute (std::size_t, multiple_exceptions*); + void fetch (sword r, sb4 code); @@ -399,7 +405,10 @@ namespace odb // Return the number of parameter sets (out of n) that were attempted. // std::size_t - execute (std::size_t n, multiple_exceptions*); + execute (std::size_t n, multiple_exceptions& mex) + { + return execute (n, &mex); + } // Return the number of rows affected (deleted) by the parameter // set. If this is a batch (n > 1 in execute() call above) and it @@ -424,6 +433,10 @@ namespace odb update_statement& operator= (const update_statement&); private: + std::size_t + execute (std::size_t, multiple_exceptions*); + + private: bool unique_; unsigned long long result_; }; @@ -470,7 +483,10 @@ namespace odb // Return the number of parameter sets (out of n) that were attempted. // std::size_t - execute (std::size_t n, multiple_exceptions*); + execute (std::size_t n, multiple_exceptions& mex) + { + return execute (n, &mex); + } // Return the number of rows affected (deleted) by the parameter // set. If this is a batch (n > 1 in execute() call above) and it @@ -495,6 +511,10 @@ namespace odb delete_statement& operator= (const delete_statement&); private: + std::size_t + execute (std::size_t, multiple_exceptions*); + + private: bool unique_; unsigned long long result_; }; -- cgit v1.1