let's try that again - libmysql only allows one query be sent at a time per connection, bail early if that's attempted
This commit is contained in:
parent
1a70e83a74
commit
c0cf2f13a0
@ -12,6 +12,9 @@ extern ID intern_merge;
|
|||||||
return Qnil; \
|
return Qnil; \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define MARK_CONN_INACTIVE(conn) \
|
||||||
|
rb_iv_set(conn, "@active", Qfalse);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* used to pass all arguments to mysql_real_connect while inside
|
* used to pass all arguments to mysql_real_connect while inside
|
||||||
* rb_thread_blocking_region
|
* rb_thread_blocking_region
|
||||||
@ -147,8 +150,7 @@ static VALUE rb_connect(VALUE self, VALUE user, VALUE pass, VALUE host, VALUE po
|
|||||||
args.mysql = client;
|
args.mysql = client;
|
||||||
args.client_flag = 0;
|
args.client_flag = 0;
|
||||||
|
|
||||||
if (rb_thread_blocking_region(nogvl_connect, &args, RUBY_UBF_IO, 0) == Qfalse)
|
if (rb_thread_blocking_region(nogvl_connect, &args, RUBY_UBF_IO, 0) == Qfalse) {
|
||||||
{
|
|
||||||
// unable to connect
|
// unable to connect
|
||||||
return rb_raise_mysql2_error(client);
|
return rb_raise_mysql2_error(client);
|
||||||
}
|
}
|
||||||
@ -214,10 +216,16 @@ static VALUE rb_mysql_client_async_result(VALUE self) {
|
|||||||
|
|
||||||
REQUIRE_OPEN_DB(client);
|
REQUIRE_OPEN_DB(client);
|
||||||
if (rb_thread_blocking_region(nogvl_read_query_result, client, RUBY_UBF_IO, 0) == Qfalse) {
|
if (rb_thread_blocking_region(nogvl_read_query_result, client, RUBY_UBF_IO, 0) == Qfalse) {
|
||||||
|
// an error occurred, mark this connection inactive
|
||||||
|
MARK_CONN_INACTIVE(self);
|
||||||
return rb_raise_mysql2_error(client);
|
return rb_raise_mysql2_error(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
result = (MYSQL_RES *)rb_thread_blocking_region(nogvl_store_result, client, RUBY_UBF_IO, 0);
|
result = (MYSQL_RES *)rb_thread_blocking_region(nogvl_store_result, client, RUBY_UBF_IO, 0);
|
||||||
|
|
||||||
|
// we have our result, mark this connection inactive
|
||||||
|
MARK_CONN_INACTIVE(self);
|
||||||
|
|
||||||
if (result == NULL) {
|
if (result == NULL) {
|
||||||
if (mysql_field_count(client) != 0) {
|
if (mysql_field_count(client) != 0) {
|
||||||
rb_raise_mysql2_error(client);
|
rb_raise_mysql2_error(client);
|
||||||
@ -240,13 +248,22 @@ static VALUE rb_mysql_client_query(int argc, VALUE * argv, VALUE self) {
|
|||||||
fd_set fdset;
|
fd_set fdset;
|
||||||
int fd, retval;
|
int fd, retval;
|
||||||
int async = 0;
|
int async = 0;
|
||||||
VALUE opts, defaults;
|
VALUE opts, defaults, active;
|
||||||
MYSQL *client;
|
MYSQL *client;
|
||||||
|
|
||||||
Data_Get_Struct(self, MYSQL, client);
|
Data_Get_Struct(self, MYSQL, client);
|
||||||
REQUIRE_OPEN_DB(client);
|
REQUIRE_OPEN_DB(client);
|
||||||
args.mysql = client;
|
args.mysql = client;
|
||||||
|
|
||||||
|
active = rb_iv_get(self, "@active");
|
||||||
|
// see if this connection is still waiting on a result from a previous query
|
||||||
|
if (NIL_P(active) || active == Qfalse) {
|
||||||
|
// mark this connection active
|
||||||
|
rb_iv_set(self, "@active", Qtrue);
|
||||||
|
} else {
|
||||||
|
rb_raise(cMysql2Error, "This connection is still waiting for a result, try again once you have the result");
|
||||||
|
}
|
||||||
|
|
||||||
defaults = rb_iv_get(self, "@query_options");
|
defaults = rb_iv_get(self, "@query_options");
|
||||||
if (rb_scan_args(argc, argv, "11", &args.sql, &opts) == 2) {
|
if (rb_scan_args(argc, argv, "11", &args.sql, &opts) == 2) {
|
||||||
opts = rb_funcall(defaults, intern_merge, 1, opts);
|
opts = rb_funcall(defaults, intern_merge, 1, opts);
|
||||||
@ -266,6 +283,8 @@ static VALUE rb_mysql_client_query(int argc, VALUE * argv, VALUE self) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (rb_thread_blocking_region(nogvl_send_query, &args, RUBY_UBF_IO, 0) == Qfalse) {
|
if (rb_thread_blocking_region(nogvl_send_query, &args, RUBY_UBF_IO, 0) == Qfalse) {
|
||||||
|
// an error occurred, we're not active anymore
|
||||||
|
MARK_CONN_INACTIVE(self);
|
||||||
return rb_raise_mysql2_error(client);
|
return rb_raise_mysql2_error(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,6 +71,13 @@ describe Mysql2::Client do
|
|||||||
it "should be able to return results with symbolized keys" do
|
it "should be able to return results with symbolized keys" do
|
||||||
@client.query("SELECT 1", :symbolize_keys => true).first.keys[0].class.should eql(Symbol)
|
@client.query("SELECT 1", :symbolize_keys => true).first.keys[0].class.should eql(Symbol)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it "should not allow another query to be sent without fetching a result first" do
|
||||||
|
@client.query("SELECT 1", :async => true)
|
||||||
|
lambda {
|
||||||
|
@client.query("SELECT 1")
|
||||||
|
}.should raise_error(Mysql2::Error)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
it "should respond to #escape" do
|
it "should respond to #escape" do
|
||||||
|
Loading…
Reference in New Issue
Block a user