Skip to content

Commit 811a57a

Browse files
Cees de Grootsodabrew
authored andcommitted
Make server_status available on Mysql2::Result objects (brianmario#755)
1 parent 0e4fcc3 commit 811a57a

File tree

5 files changed

+54
-0
lines changed

5 files changed

+54
-0
lines changed

ext/mysql2/client.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
VALUE cMysql2Client;
1818
extern VALUE mMysql2, cMysql2Error;
1919
static VALUE sym_id, sym_version, sym_header_version, sym_async, sym_symbolize_keys, sym_as, sym_array, sym_stream;
20+
static VALUE sym_no_good_index_used, sym_no_index_used, sym_query_was_slow;
2021
static ID intern_brackets, intern_merge, intern_merge_bang, intern_new_with_args;
2122

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

585+
rb_mysql_set_server_query_flags(wrapper->client, resultObj);
586+
584587
return resultObj;
585588
}
586589

@@ -1412,6 +1415,10 @@ void init_mysql2_client() {
14121415
sym_array = ID2SYM(rb_intern("array"));
14131416
sym_stream = ID2SYM(rb_intern("stream"));
14141417

1418+
sym_no_good_index_used = ID2SYM(rb_intern("no_good_index_used"));
1419+
sym_no_index_used = ID2SYM(rb_intern("no_index_used"));
1420+
sym_query_was_slow = ID2SYM(rb_intern("query_was_slow"));
1421+
14151422
intern_brackets = rb_intern("[]");
14161423
intern_merge = rb_intern("merge");
14171424
intern_merge_bang = rb_intern("merge!");
@@ -1558,3 +1565,29 @@ void init_mysql2_client() {
15581565
rb_const_set(cMysql2Client, rb_intern("SSL_MODE_VERIFY_IDENTITY"), INT2NUM(0));
15591566
#endif
15601567
}
1568+
1569+
#define flag_to_bool(f) ((client->server_status & f) ? Qtrue : Qfalse)
1570+
1571+
void rb_mysql_set_server_query_flags(MYSQL *client, VALUE result) {
1572+
VALUE server_flags = rb_hash_new();
1573+
1574+
#ifdef SERVER_QUERY_NO_GOOD_INDEX_USED
1575+
rb_hash_aset(server_flags, sym_no_good_index_used, flag_to_bool(SERVER_QUERY_NO_GOOD_INDEX_USED));
1576+
#else
1577+
rb_hash_aset(server_flags, sym_no_good_index_used, Qnil);
1578+
#endif
1579+
1580+
#ifdef SERVER_QUERY_NO_INDEX_USED
1581+
rb_hash_aset(server_flags, sym_no_index_used, flag_to_bool(SERVER_QUERY_NO_INDEX_USED));
1582+
#else
1583+
rb_hash_aset(server_flags, sym_no_index_used, Qnil);
1584+
#endif
1585+
1586+
#ifdef SERVER_QUERY_WAS_SLOW
1587+
rb_hash_aset(server_flags, sym_query_was_slow, flag_to_bool(SERVER_QUERY_WAS_SLOW));
1588+
#else
1589+
rb_hash_aset(server_flags, sym_query_was_slow, Qnil);
1590+
#endif
1591+
1592+
rb_iv_set(result, "@server_flags", server_flags);
1593+
}

ext/mysql2/client.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ typedef struct {
2222
} mysql_client_wrapper;
2323

2424
void rb_mysql_client_set_active_thread(VALUE self);
25+
void rb_mysql_set_server_query_flags(MYSQL *client, VALUE result);
2526

2627
#define GET_CLIENT(self) \
2728
mysql_client_wrapper *wrapper; \

ext/mysql2/statement.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,8 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) {
434434

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

437+
rb_mysql_set_server_query_flags(wrapper->client, resultObj);
438+
437439
if (!is_streaming) {
438440
// cache all result
439441
rb_funcall(resultObj, intern_each, 0);

lib/mysql2/result.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module Mysql2
22
class Result
3+
attr_reader :server_flags
4+
35
include Enumerable
46
end
57
end

spec/mysql2/result_spec.rb

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,4 +473,20 @@
473473
end
474474
end
475475
end
476+
477+
context "server flags" do
478+
before(:each) do
479+
@test_result = @client.query("SELECT * FROM mysql2_test ORDER BY null_test DESC LIMIT 1")
480+
end
481+
482+
it "should set a definitive value for query_was_slow" do
483+
expect(@test_result.server_flags[:query_was_slow]).to eql(false)
484+
end
485+
it "should set a definitive value for no_index_used" do
486+
expect(@test_result.server_flags[:no_index_used]).to eql(true)
487+
end
488+
it "should set a definitive value for no_good_index_used" do
489+
expect(@test_result.server_flags[:no_good_index_used]).to eql(false)
490+
end
491+
end
476492
end

0 commit comments

Comments
 (0)