Skip to content

Commit 02984ca

Browse files
committed
Allow per-query read_timeout
1 parent bf227ac commit 02984ca

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

ext/mysql2/client.c

+6-2
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
VALUE cMysql2Client;
1818
extern VALUE mMysql2, cMysql2Error, cMysql2TimeoutError;
19-
static VALUE sym_id, sym_version, sym_header_version, sym_async, sym_symbolize_keys, sym_as, sym_array, sym_stream;
19+
static VALUE sym_id, sym_version, sym_header_version, sym_async, sym_symbolize_keys, sym_as, sym_array, sym_stream, sym_read_timeout;
2020
static VALUE sym_no_good_index_used, sym_no_index_used, sym_query_was_slow;
2121
static ID intern_brackets, intern_merge, intern_merge_bang, intern_new_with_args;
2222

@@ -639,7 +639,10 @@ static VALUE do_query(void *args) {
639639
int retval;
640640
VALUE read_timeout;
641641

642-
read_timeout = rb_iv_get(async_args->self, "@read_timeout");
642+
read_timeout = rb_hash_aref(rb_iv_get(async_args->self, "@current_query_options"), sym_read_timeout);
643+
if (NIL_P(read_timeout)) {
644+
read_timeout = rb_iv_get(async_args->self, "@read_timeout");
645+
}
643646

644647
tvp = NULL;
645648
if (!NIL_P(read_timeout)) {
@@ -1452,6 +1455,7 @@ void init_mysql2_client() {
14521455
sym_as = ID2SYM(rb_intern("as"));
14531456
sym_array = ID2SYM(rb_intern("array"));
14541457
sym_stream = ID2SYM(rb_intern("stream"));
1458+
sym_read_timeout = ID2SYM(rb_intern("read_timeout"));
14551459

14561460
sym_no_good_index_used = ID2SYM(rb_intern("no_good_index_used"));
14571461
sym_no_index_used = ID2SYM(rb_intern("no_index_used"));

spec/mysql2/client_spec.rb

+12
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,18 @@ def run_gc
963963
end.not_to raise_error
964964
end
965965

966+
it "allows per-query read_timeout" do
967+
client = new_client(reconnect: true)
968+
969+
expect do
970+
client.query("select sleep(2)", read_timeout: 1)
971+
end.to raise_error(Mysql2::Error::TimeoutError)
972+
973+
expect do
974+
client.query("select sleep(1)", read_timeout: 2)
975+
end.not_to raise_error
976+
end
977+
966978
context 'write operations api' do
967979
before(:each) do
968980
@client.query "USE test"

0 commit comments

Comments
 (0)