ext/adapter.cc in swift-0.9.1 vs ext/adapter.cc in swift-0.10.0

- old
+ new

@@ -85,15 +85,20 @@ CATCH_DBI_EXCEPTIONS(); } // TODO: Change bind_values to an array in the interface? Avoid array -> splat -> array. static VALUE adapter_execute(int argc, VALUE *argv, VALUE self) { - VALUE statement, bind_values, block, rows; + VALUE statement, bind_values, block, rows, scheme = Qnil; dbi::Handle *handle = adapter_handle(self); rb_scan_args(argc, argv, "1*&", &statement, &bind_values, &block); + if (TYPE(statement) == T_CLASS) { + scheme = statement; + statement = rb_ary_shift(bind_values); + } + try { Query query; query.sql = CSTRING(statement); query.handle = handle; @@ -102,10 +107,12 @@ if ((rows = rb_thread_blocking_region(((VALUE (*)(void*))query_execute), &query, RUBY_UBF_IO, 0)) == Qfalse) rb_raise(eSwiftRuntimeError, "%s", query.error); VALUE result = result_wrap_handle(cSwiftResult, self, handle->conn()->result(), true); + if (!NIL_P(scheme)) + rb_iv_set(result, "@scheme", scheme); return rb_block_given_p() ? result_each(result) : result; } CATCH_DBI_EXCEPTIONS(); } @@ -175,32 +182,32 @@ return Qtrue; } static VALUE adapter_transaction(int argc, VALUE *argv, VALUE self) { int status; - VALUE sp, block; + VALUE sp, block, block_result = Qnil; dbi::Handle *handle = adapter_handle(self); rb_scan_args(argc, argv, "01&", &sp, &block); if (NIL_P(block)) rb_raise(eSwiftArgumentError, "Transaction called without a block."); std::string save_point = NIL_P(sp) ? "SP" + dbi::generateCompactUUID() : CSTRING(sp); try { handle->begin(save_point); - rb_protect(rb_yield, self, &status); + block_result = rb_protect(rb_yield, self, &status); if (!status && handle->transactions().size() > 0) { handle->commit(save_point); } else if (status && handle->transactions().size() > 0) { handle->rollback(save_point); rb_jump_tag(status); } } CATCH_DBI_EXCEPTIONS(); - return Qtrue; + return block_result; } static VALUE adapter_write(int argc, VALUE *argv, VALUE self) { uint64_t rows = 0; VALUE stream, table, fields;