Skip to content

Commit

Permalink
Make server_status available on Mysql2::Result objects (brianmario#755)
Browse files Browse the repository at this point in the history
  • Loading branch information
Cees de Groot authored and sodabrew committed Nov 25, 2017
1 parent 8d6f29f commit 48df710
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 0 deletions.
33 changes: 33 additions & 0 deletions ext/mysql2/client.c
Expand Up @@ -17,6 +17,7 @@
VALUE cMysql2Client;
extern VALUE mMysql2, cMysql2Error;
static VALUE sym_id, sym_version, sym_header_version, sym_async, sym_symbolize_keys, sym_as, sym_array, sym_stream;
static VALUE sym_no_good_index_used, sym_no_index_used, sym_query_was_slow;
static ID intern_brackets, intern_merge, intern_merge_bang, intern_new_with_args;

#define REQUIRE_INITIALIZED(wrapper) \
Expand Down Expand Up @@ -581,6 +582,8 @@ static VALUE rb_mysql_client_async_result(VALUE self) {
Check_Type(current, T_HASH);
resultObj = rb_mysql_result_to_obj(self, wrapper->encoding, current, result, Qnil);

rb_mysql_set_server_query_flags(wrapper->client, resultObj);

return resultObj;
}

Expand Down Expand Up @@ -1412,6 +1415,10 @@ void init_mysql2_client() {
sym_array = ID2SYM(rb_intern("array"));
sym_stream = ID2SYM(rb_intern("stream"));

sym_no_good_index_used = ID2SYM(rb_intern("no_good_index_used"));
sym_no_index_used = ID2SYM(rb_intern("no_index_used"));
sym_query_was_slow = ID2SYM(rb_intern("query_was_slow"));

intern_brackets = rb_intern("[]");
intern_merge = rb_intern("merge");
intern_merge_bang = rb_intern("merge!");
Expand Down Expand Up @@ -1558,3 +1565,29 @@ void init_mysql2_client() {
rb_const_set(cMysql2Client, rb_intern("SSL_MODE_VERIFY_IDENTITY"), INT2NUM(0));
#endif
}

#define flag_to_bool(f) ((client->server_status & f) ? Qtrue : Qfalse)

void rb_mysql_set_server_query_flags(MYSQL *client, VALUE result) {
VALUE server_flags = rb_hash_new();

#ifdef SERVER_QUERY_NO_GOOD_INDEX_USED
rb_hash_aset(server_flags, sym_no_good_index_used, flag_to_bool(SERVER_QUERY_NO_GOOD_INDEX_USED));
#else
rb_hash_aset(server_flags, sym_no_good_index_used, Qnil);
#endif

#ifdef SERVER_QUERY_NO_INDEX_USED
rb_hash_aset(server_flags, sym_no_index_used, flag_to_bool(SERVER_QUERY_NO_INDEX_USED));
#else
rb_hash_aset(server_flags, sym_no_index_used, Qnil);
#endif

#ifdef SERVER_QUERY_WAS_SLOW
rb_hash_aset(server_flags, sym_query_was_slow, flag_to_bool(SERVER_QUERY_WAS_SLOW));
#else
rb_hash_aset(server_flags, sym_query_was_slow, Qnil);
#endif

rb_iv_set(result, "@server_flags", server_flags);
}
1 change: 1 addition & 0 deletions ext/mysql2/client.h
Expand Up @@ -22,6 +22,7 @@ typedef struct {
} mysql_client_wrapper;

void rb_mysql_client_set_active_thread(VALUE self);
void rb_mysql_set_server_query_flags(MYSQL *client, VALUE result);

#define GET_CLIENT(self) \
mysql_client_wrapper *wrapper; \
Expand Down
2 changes: 2 additions & 0 deletions ext/mysql2/statement.c
Expand Up @@ -434,6 +434,8 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {

resultObj = rb_mysql_result_to_obj(stmt_wrapper->client, wrapper->encoding, current, metadata, self);

rb_mysql_set_server_query_flags(wrapper->client, resultObj);

if (!is_streaming) {
// cache all result
rb_funcall(resultObj, intern_each, 0);
Expand Down
2 changes: 2 additions & 0 deletions lib/mysql2/result.rb
@@ -1,5 +1,7 @@
module Mysql2
class Result
attr_reader :server_flags

include Enumerable
end
end
16 changes: 16 additions & 0 deletions spec/mysql2/result_spec.rb
Expand Up @@ -473,4 +473,20 @@
end
end
end

context "server flags" do
before(:each) do
@test_result = @client.query("SELECT * FROM mysql2_test ORDER BY null_test DESC LIMIT 1")
end

it "should set a definitive value for query_was_slow" do
expect(@test_result.server_flags[:query_was_slow]).to eql(false)
end
it "should set a definitive value for no_index_used" do
expect(@test_result.server_flags[:no_index_used]).to eql(true)
end
it "should set a definitive value for no_good_index_used" do
expect(@test_result.server_flags[:no_good_index_used]).to eql(false)
end
end
end

0 comments on commit 48df710

Please sign in to comment.