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;