ext/adapter.cc in swift-0.8.0 vs ext/adapter.cc in swift-0.8.1
- old
+ new
@@ -1,7 +1,18 @@
#include "adapter.h"
+// extend the default dbi::FieldSet class with some ruby love.
+class Fields : public dbi::FieldSet {
+ public:
+ Fields() : dbi::FieldSet(0) {}
+
+ void operator<<(VALUE v) {
+ VALUE name = TO_S(v);
+ fields.push_back(std::string(RSTRING_PTR(name), RSTRING_LEN(name)));
+ }
+};
+
static VALUE cSwiftAdapter;
static void adapter_free(dbi::Handle *handle) {
if (handle) {
handle->conn()->cleanup();
@@ -96,10 +107,16 @@
return rb_block_given_p() ? result_each(result) : result;
}
CATCH_DBI_EXCEPTIONS();
}
+static VALUE adapter_reconnect(VALUE self) {
+ dbi::Handle *handle = adapter_handle(self);
+ try { handle->reconnect(); } CATCH_DBI_EXCEPTIONS();
+ return Qtrue;
+}
+
static VALUE adapter_initialize(VALUE self, VALUE options) {
VALUE db = rb_hash_aref(options, ID2SYM(rb_intern("db")));
VALUE driver = rb_hash_aref(options, ID2SYM(rb_intern("driver")));
VALUE user = rb_hash_aref(options, ID2SYM(rb_intern("user")));
@@ -195,15 +212,13 @@
rb_raise(eSwiftArgumentError, "Stream must be a String or IO object.");
if (TYPE(fields) != T_ARRAY)
rb_raise(eSwiftArgumentError, "Fields must be an Array.");
try {
- dbi::FieldSet write_fields;
- for (int i = 0; i < RARRAY_LEN(fields); i++) {
- VALUE field = TO_S(rb_ary_entry(fields, i));
- write_fields << std::string(RSTRING_PTR(field), RSTRING_LEN(field));
- }
+ Fields write_fields;
+ for (int i = 0; i < RARRAY_LEN(fields); i++)
+ write_fields << rb_ary_entry(fields, i);
/*
TODO: Adapter specific code is balls.
This is just for the friggin mysql support - mysql does not like a statement close command being send on a
handle when the writing has started.
@@ -226,20 +241,21 @@
void init_swift_adapter() {
VALUE mSwift = rb_define_module("Swift");
cSwiftAdapter = rb_define_class_under(mSwift, "Adapter", rb_cObject);
rb_define_method(cSwiftAdapter, "begin", RUBY_METHOD_FUNC(adapter_begin), -1);
- rb_define_method(cSwiftAdapter, "clone", RUBY_METHOD_FUNC(adapter_clone), 0);
- rb_define_method(cSwiftAdapter, "close", RUBY_METHOD_FUNC(adapter_close), 0);
+ rb_define_method(cSwiftAdapter, "clone", RUBY_METHOD_FUNC(adapter_clone), 0);
+ rb_define_method(cSwiftAdapter, "close", RUBY_METHOD_FUNC(adapter_close), 0);
rb_define_method(cSwiftAdapter, "commit", RUBY_METHOD_FUNC(adapter_commit), -1);
- rb_define_method(cSwiftAdapter, "dup", RUBY_METHOD_FUNC(adapter_dup), 0);
- rb_define_method(cSwiftAdapter, "escape", RUBY_METHOD_FUNC(adapter_escape), 1);
+ rb_define_method(cSwiftAdapter, "dup", RUBY_METHOD_FUNC(adapter_dup), 0);
+ rb_define_method(cSwiftAdapter, "escape", RUBY_METHOD_FUNC(adapter_escape), 1);
rb_define_method(cSwiftAdapter, "execute", RUBY_METHOD_FUNC(adapter_execute), -1);
- rb_define_method(cSwiftAdapter, "initialize", RUBY_METHOD_FUNC(adapter_initialize), 1);
+ rb_define_method(cSwiftAdapter, "initialize", RUBY_METHOD_FUNC(adapter_initialize), 1);
rb_define_method(cSwiftAdapter, "prepare", RUBY_METHOD_FUNC(adapter_prepare), -1);
rb_define_method(cSwiftAdapter, "rollback", RUBY_METHOD_FUNC(adapter_rollback), -1);
rb_define_method(cSwiftAdapter, "transaction", RUBY_METHOD_FUNC(adapter_transaction), -1);
rb_define_method(cSwiftAdapter, "write", RUBY_METHOD_FUNC(adapter_write), -1);
+ rb_define_method(cSwiftAdapter, "reconnect", RUBY_METHOD_FUNC(adapter_reconnect), 0);
rb_define_alloc_func(cSwiftAdapter, adapter_alloc);
}