// Convert C-string to a Ruby instance of Ruby type "type" VALUE do_mysql_typecast(const char *value, long length, const VALUE type, int encoding) { if (!value) { return Qnil; } if (type == rb_cTrueClass) { return (value == 0 || strcmp("0", value) == 0) ? Qfalse : Qtrue; } else if (type == rb_cByteArray) { return rb_funcall(rb_cByteArray, ID_NEW, 1, rb_str_new(value, length)); } else { return data_objects_typecast(value, length, type, encoding); } }
VALUE do_postgres_typecast(const char *value, long length, const VALUE type, int encoding) { if (type == rb_cTrueClass) { return *value == 't' ? Qtrue : Qfalse; } else if (type == rb_cByteArray) { size_t new_length = 0; char *unescaped = (char *)PQunescapeBytea((unsigned char*)value, &new_length); VALUE byte_array = rb_funcall(rb_cByteArray, DO_ID_NEW, 1, rb_str_new(unescaped, new_length)); PQfreemem(unescaped); return byte_array; } else { return data_objects_typecast(value, length, type, encoding); } }