Introduce Mysql#blocking?; Set the file drescriptor for all new connections to non blocking; Add tests to the existing evented and threaded runs. ( verified 1.8 && 1.9 )

This commit is contained in:
Lourens Naude 2008-09-08 01:48:47 +01:00
parent 26202b3ddb
commit 55411cd9d4
5 changed files with 31 additions and 3 deletions

View File

@ -60,6 +60,7 @@ struct mysql {
MYSQL handler; MYSQL handler;
char connection; char connection;
char query_with_result; char query_with_result;
char blocking;
}; };
struct mysql_res { struct mysql_res {
@ -268,6 +269,11 @@ static VALUE real_connect(int argc, VALUE* argv, VALUE klass)
myp->handler.reconnect = 0; myp->handler.reconnect = 0;
myp->connection = Qtrue; myp->connection = Qtrue;
my_bool was_blocking;
vio_blocking(myp->handler.net.vio, 0, &was_blocking);
myp->blocking = vio_is_blocking( myp->handler.net.vio );
myp->query_with_result = Qtrue; myp->query_with_result = Qtrue;
rb_obj_call_init(obj, argc, argv); rb_obj_call_init(obj, argc, argv);
@ -756,6 +762,11 @@ static VALUE socket(VALUE obj)
return INT2NUM(m->net.fd); return INT2NUM(m->net.fd);
} }
/* blocking */
static VALUE blocking(VALUE obj){
return ( GetMysqlStruct(obj)->blocking ? Qtrue : Qfalse );
}
/* readable(timeout=nil) */ /* readable(timeout=nil) */
static VALUE readable( int argc, VALUE* argv, VALUE obj ) static VALUE readable( int argc, VALUE* argv, VALUE obj )
{ {
@ -2113,6 +2124,7 @@ void Init_mysql(void)
rb_define_method(cMysql, "send_query", send_query, 1); rb_define_method(cMysql, "send_query", send_query, 1);
rb_define_method(cMysql, "get_result", get_result, 0); rb_define_method(cMysql, "get_result", get_result, 0);
rb_define_method(cMysql, "readable?", readable, -1); rb_define_method(cMysql, "readable?", readable, -1);
rb_define_method(cMysql, "blocking?", blocking, 0);
rb_define_method(cMysql, "socket", socket, 0); rb_define_method(cMysql, "socket", socket, 0);
rb_define_method(cMysql, "refresh", refresh, 1); rb_define_method(cMysql, "refresh", refresh, 1);
rb_define_method(cMysql, "reload", reload, 0); rb_define_method(cMysql, "reload", reload, 0);

View File

@ -1,10 +1,12 @@
require 'mysql' require 'mysql'
class Mysql class Mysql
alias_method :c_async_query, :async_query alias_method :c_async_query, :async_query
def async_query(sql, timeout = nil) def async_query(sql, timeout = nil)
c_async_query(sql, timeout) if ENV['MYSQL_C_ASYNC_QUERY'] == '1' c_async_query(sql, timeout) if ENV['MYSQL_C_ASYNC_QUERY'] == '1'
puts "** Blocking ? #{blocking?().inspect}" if ENV['MYSQL_BLOCKING_STATUS'] == '1'
send_query(sql) send_query(sql)
select [ (@sockets ||= {})[socket] ||= IO.new(socket) ], nil, nil, nil select [ (@sockets ||= {})[socket] ||= IO.new(socket) ], nil, nil, nil
get_result get_result

View File

@ -2,6 +2,7 @@ require File.dirname(__FILE__) + '/test_helper'
EventedMysqlTest.new( 10 ) do |test| EventedMysqlTest.new( 10 ) do |test|
test.setup{ Mysql.real_connect('localhost','root') } test.setup{ Mysql.real_connect('localhost','root') }
test.log_blocking_status = true
test.run! test.run!
end end

View File

@ -11,7 +11,8 @@ class MysqlTest
:connection_signature, :connection_signature,
:start, :start,
:done, :done,
:c_async_query :c_async_query,
:log_blocking_status
def initialize( queries ) def initialize( queries )
@queries = queries @queries = queries
@ -27,10 +28,12 @@ class MysqlTest
def run! def run!
c_or_native_ruby_async_query do c_or_native_ruby_async_query do
with_blocking_status do
prepare prepare
yield yield
end end
end end
end
def prepare def prepare
raise NotImplemented raise NotImplemented
@ -67,6 +70,15 @@ class MysqlTest
yield yield
end end
def with_blocking_status
if @log_blocking_status
ENV['MYSQL_BLOCKING_STATUS'] = '1'
else
ENV['MYSQL_BLOCKING_STATUS'] = '0'
end
yield
end
end end
class EventedMysqlTest < MysqlTest class EventedMysqlTest < MysqlTest

View File

@ -2,6 +2,7 @@ require File.dirname(__FILE__) + '/test_helper'
ThreadedMysqlTest.new( 10 ) do |test| ThreadedMysqlTest.new( 10 ) do |test|
test.setup{ Mysql.real_connect('localhost','root') } test.setup{ Mysql.real_connect('localhost','root') }
test.log_blocking_status = true
test.run! test.run!
end end