threaded access suppor (working this time)
This commit is contained in:
parent
fa9c977d54
commit
da40f34362
24
ext/mysql.c
24
ext/mysql.c
@ -5,6 +5,7 @@
|
||||
*/
|
||||
|
||||
#include <ruby.h>
|
||||
#include <errno.h>
|
||||
#ifndef RSTRING_PTR
|
||||
#define RSTRING_PTR(str) RSTRING(str)->ptr
|
||||
#endif
|
||||
@ -755,24 +756,6 @@ static VALUE socket(VALUE obj)
|
||||
return INT2NUM(vio_fd(m->net.vio));
|
||||
}
|
||||
|
||||
/* setnonblocking */
|
||||
/*
|
||||
static VALUE setnonblocking(VALUE obj, VALUE new_state)
|
||||
{
|
||||
MYSQL* m = GetHandler(obj);
|
||||
my_bool current;
|
||||
return m->net.vio->vioblocking(m->net.vio, new_state, *current);
|
||||
}
|
||||
*/
|
||||
/* isblocking */
|
||||
/*
|
||||
static VALUE isblocking(VALUE obj)
|
||||
{
|
||||
MYSQL* m = GetHandler(obj);
|
||||
return m->net.vio->is_blocking(m->net.vio);
|
||||
}
|
||||
*/
|
||||
|
||||
/* send_query */
|
||||
static VALUE send_query(VALUE obj, VALUE sql)
|
||||
{
|
||||
@ -803,12 +786,15 @@ static VALUE get_result(VALUE obj)
|
||||
}
|
||||
|
||||
/* async_query */
|
||||
/*
|
||||
comment it out until I figure out how it works
|
||||
static VALUE async_query(VALUE obj, VALUE sql)
|
||||
{
|
||||
send_query(obj,sql);
|
||||
rb_io_wait_readable(socket(obj));
|
||||
return get_result(obj);
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
#if MYSQL_VERSION_ID >= 40100
|
||||
@ -2014,7 +2000,7 @@ void Init_mysql(void)
|
||||
#endif
|
||||
rb_define_method(cMysql, "query", query, 1);
|
||||
rb_define_method(cMysql, "real_query", query, 1);
|
||||
rb_define_method(cMysql, "async_query", async_query, 1);
|
||||
/*rb_define_method(cMysql, "async_query", async_query, 1);*/
|
||||
rb_define_method(cMysql, "send_query", send_query, 1);
|
||||
rb_define_method(cMysql, "get_result", get_result, 0);
|
||||
rb_define_method(cMysql, "socket", socket, 0);
|
||||
|
9
lib/mysqlplus.rb
Normal file
9
lib/mysqlplus.rb
Normal file
@ -0,0 +1,9 @@
|
||||
require 'mysql'
|
||||
|
||||
class Mysql
|
||||
def async_query(sql)
|
||||
send_query(sql)
|
||||
select([IO.new(socket)],nil,nil,nil)
|
||||
get_result
|
||||
end
|
||||
end
|
@ -12,6 +12,7 @@ Gem::Specification.new do |s|
|
||||
s.files = [
|
||||
"mysqlplus.gemspec",
|
||||
"README",
|
||||
"lib/mysqlplus.rb",
|
||||
"test/test_threaded.rb",
|
||||
"test/test_evented.rb",
|
||||
"ext/extconf.rb",
|
||||
|
@ -1,22 +1,4 @@
|
||||
require 'mysql'
|
||||
|
||||
class Mysql
|
||||
attr_accessor :fiber
|
||||
alias :old_query :query
|
||||
def query(sql)
|
||||
if Fiber.current[:neverblock]
|
||||
send_query(sql)
|
||||
@fiber = Fiber.current
|
||||
Fiber.yield
|
||||
else
|
||||
old_query(sql)
|
||||
end
|
||||
end
|
||||
|
||||
def process_command
|
||||
@fiber.resume get_result
|
||||
end
|
||||
end
|
||||
require 'mysqlplus'
|
||||
|
||||
@count = 10
|
||||
@connections = {}
|
||||
|
@ -1,4 +1,4 @@
|
||||
require 'mysql'
|
||||
require 'mysqlplus'
|
||||
|
||||
$t = Time.now
|
||||
$connections = []
|
||||
@ -11,7 +11,7 @@ $done = 0
|
||||
$t = Time.now
|
||||
$count.times do |i|
|
||||
Thread.new do
|
||||
$connections[i].async_query('select sleep(0.1)').each{|r|puts "#{i}:#{r}"}
|
||||
$connections[i].async_query('select sleep(1)').each{|r|puts "#{i}:#{r}"}
|
||||
$done = $done + 1
|
||||
puts Time.now - $t if $done == $count
|
||||
end
|
||||
|
Loading…
Reference in New Issue
Block a user