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); }