From 4385ff5483496976eb4407df8a3bb4b2614afa1e Mon Sep 17 00:00:00 2001 From: Cees de Groot Date: Tue, 24 May 2016 11:56:36 -0400 Subject: [PATCH] Move server flags to result object --- ext/mysql2/client.c | 26 +++++++++++++++++++------- ext/mysql2/client.h | 2 ++ ext/mysql2/statement.c | 4 ++-- lib/mysql2/client.rb | 2 +- lib/mysql2/result.rb | 2 ++ 5 files changed, 26 insertions(+), 10 deletions(-) diff --git a/ext/mysql2/client.c b/ext/mysql2/client.c index 28fb7fe60..cab668c35 100644 --- a/ext/mysql2/client.c +++ b/ext/mysql2/client.c @@ -525,7 +525,7 @@ 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_iv_set(self, "@server_status", INT2NUM(wrapper->client->server_status)); + set_server_query_flags(wrapper->client, resultObj); return resultObj; } @@ -1466,19 +1466,31 @@ void init_mysql2_client() { rb_const_set(cMysql2Client, rb_intern("BASIC_FLAGS"), LONG2NUM(CLIENT_BASIC_FLAGS)); #endif +} + +#define flag_to_bool(f) ((client->server_status & f) ? Qtrue : Qfalse) + +void set_server_query_flags(MYSQL *client, VALUE result) { + VALUE server_flags = rb_hash_new(); #ifdef SERVER_QUERY_NO_GOOD_INDEX_USED - rb_const_set(cMysql2Client, rb_intern("NO_GOOD_INDEX_USED"), - LONG2NUM(SERVER_QUERY_NO_GOOD_INDEX_USED)); + rb_hash_aset(server_flags, ID2SYM(rb_intern("no_good_index_used")), flag_to_bool(SERVER_QUERY_NO_GOOD_INDEX_USED)); +#else + rb_hash_aset(server_flags, ID2SYM(rb_intern("no_good_index_used")), Qnil); #endif #ifdef SERVER_QUERY_NO_INDEX_USED - rb_const_set(cMysql2Client, rb_intern("NO_INDEX_USED"), - LONG2NUM(SERVER_QUERY_NO_INDEX_USED)); + rb_hash_aset(server_flags, ID2SYM(rb_intern("no_index_used")), flag_to_bool(SERVER_QUERY_NO_INDEX_USED)); +#else + rb_hash_aset(server_flags, ID2SYM(rb_intern("no_index_used")), Qnil); #endif #ifdef SERVER_QUERY_WAS_SLOW - rb_const_set(cMysql2Client, rb_intern("QUERY_WAS_SLOW"), - LONG2NUM(SERVER_QUERY_WAS_SLOW)); + rb_hash_aset(server_flags, ID2SYM(rb_intern("query_was_slow")), flag_to_bool(SERVER_QUERY_WAS_SLOW)); +#else + rb_hash_aset(server_flags, ID2SYM(rb_intern("query_was_slow")), Qnil;) #endif + + rb_iv_set(result, "@server_flags", server_flags); } + diff --git a/ext/mysql2/client.h b/ext/mysql2/client.h index d10274f84..78e41b0e0 100644 --- a/ext/mysql2/client.h +++ b/ext/mysql2/client.h @@ -65,9 +65,11 @@ void rb_mysql_client_set_active_thread(VALUE self); void init_mysql2_client(void); void decr_mysql2_client(mysql_client_wrapper *wrapper); +void set_server_query_flags(MYSQL *client, VALUE result); #endif #ifndef HAVE_RB_HASH_DUP VALUE rb_hash_dup(VALUE other); #endif + diff --git a/ext/mysql2/statement.c b/ext/mysql2/statement.c index 1cce3b4ef..5f235d38e 100644 --- a/ext/mysql2/statement.c +++ b/ext/mysql2/statement.c @@ -352,8 +352,6 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) { FREE_BINDS; - rb_iv_set(self, "@server_status", INT2NUM(wrapper->client->server_status)); - metadata = mysql_stmt_result_metadata(stmt); if (metadata == NULL) { if (mysql_stmt_errno(stmt) != 0) { @@ -381,6 +379,8 @@ static VALUE execute(int argc, VALUE *argv, VALUE self) { resultObj = rb_mysql_result_to_obj(stmt_wrapper->client, wrapper->encoding, current, metadata, self); + set_server_query_flags(wrapper->client, resultObj); + if (!is_streaming) { // cache all result rb_funcall(resultObj, intern_each, 0); diff --git a/lib/mysql2/client.rb b/lib/mysql2/client.rb index 87bf29b32..81a2c77ad 100644 --- a/lib/mysql2/client.rb +++ b/lib/mysql2/client.rb @@ -1,6 +1,6 @@ module Mysql2 class Client - attr_reader :query_options, :read_timeout, :server_status + attr_reader :query_options, :read_timeout def self.default_query_options @default_query_options ||= { diff --git a/lib/mysql2/result.rb b/lib/mysql2/result.rb index e005e817c..585104e0b 100644 --- a/lib/mysql2/result.rb +++ b/lib/mysql2/result.rb @@ -1,5 +1,7 @@ module Mysql2 class Result + attr_reader :server_flags + include Enumerable end end