do_mysql 0.9.5 → 0.9.6
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +40 -3
- data/buildfile +1 -1
- data/ext/do_mysql_ext.c +54 -12
- data/lib/do_mysql.rb +0 -1
- data/lib/do_mysql/version.rb +1 -1
- data/spec/integration/do_mysql_spec.rb +19 -2
- data/spec/spec_helper.rb +2 -2
- metadata +3 -3
data/Rakefile
CHANGED
@@ -42,7 +42,44 @@ end
|
|
42
42
|
# Specs
|
43
43
|
|
44
44
|
desc 'Run specifications'
|
45
|
-
Spec::Rake::SpecTask.new(:spec
|
46
|
-
t.spec_opts << '--
|
47
|
-
t.
|
45
|
+
Spec::Rake::SpecTask.new(:spec) do |t|
|
46
|
+
t.spec_opts << '--format' << 'specdoc' << '--colour'
|
47
|
+
t.spec_opts << '--loadby' << 'random'
|
48
|
+
t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb')
|
49
|
+
|
50
|
+
begin
|
51
|
+
t.rcov = ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true
|
52
|
+
t.rcov_opts << '--exclude' << 'spec'
|
53
|
+
t.rcov_opts << '--text-summary'
|
54
|
+
t.rcov_opts << '--sort' << 'coverage' << '--sort-reverse'
|
55
|
+
rescue Exception
|
56
|
+
# rcov not installed
|
57
|
+
end
|
48
58
|
end
|
59
|
+
|
60
|
+
namespace :ci do
|
61
|
+
|
62
|
+
task :prepare do
|
63
|
+
rm_rf ROOT + "ci"
|
64
|
+
mkdir_p ROOT + "ci"
|
65
|
+
mkdir_p ROOT + "ci/doc"
|
66
|
+
mkdir_p ROOT + "ci/cyclomatic"
|
67
|
+
mkdir_p ROOT + "ci/token"
|
68
|
+
end
|
69
|
+
|
70
|
+
task :publish do
|
71
|
+
out = ENV['CC_BUILD_ARTIFACTS'] || "out"
|
72
|
+
mkdir_p out unless File.directory? out
|
73
|
+
|
74
|
+
mv "ci/rspec_report.html", "#{out}/rspec_report.html"
|
75
|
+
mv "ci/coverage", "#{out}/coverage"
|
76
|
+
end
|
77
|
+
|
78
|
+
task :spec => :prepare do
|
79
|
+
Rake::Task[:spec].invoke
|
80
|
+
mv ROOT + "coverage", ROOT + "ci/coverage"
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
task :ci => ["ci:spec"]
|
data/buildfile
CHANGED
@@ -18,7 +18,7 @@ define 'do_mysql' do
|
|
18
18
|
define 'ext-java' do
|
19
19
|
package :jar
|
20
20
|
|
21
|
-
jdbc_support_jar = file('../../do_jdbc
|
21
|
+
jdbc_support_jar = file('../../do_jdbc/lib/do_jdbc_internal.jar')
|
22
22
|
jdbc_support = artifact('data_objects:jdbc:jar:1.0').from(jdbc_support_jar)
|
23
23
|
|
24
24
|
compile.with JDBC_SUPPORT
|
data/ext/do_mysql_ext.c
CHANGED
@@ -4,6 +4,7 @@
|
|
4
4
|
#include <math.h>
|
5
5
|
#include <ctype.h>
|
6
6
|
#include <time.h>
|
7
|
+
#include <my_global.h>
|
7
8
|
#include <mysql.h>
|
8
9
|
#include <errmsg.h>
|
9
10
|
#include <mysqld_error.h>
|
@@ -16,6 +17,14 @@
|
|
16
17
|
#define CHECK_AND_RAISE(mysql_result_value) if (0 != mysql_result_value) { raise_mysql_error(connection, db, mysql_result_value); }
|
17
18
|
#define PUTS(string) rb_funcall(rb_mKernel, rb_intern("puts"), 1, RUBY_STRING(string))
|
18
19
|
|
20
|
+
#ifndef RSTRING_PTR
|
21
|
+
#define RSTRING_PTR(s) (RSTRING(s)->ptr)
|
22
|
+
#endif
|
23
|
+
|
24
|
+
#ifndef RSTRING_LEN
|
25
|
+
#define RSTRING_LEN(s) (RSTRING(s)->len)
|
26
|
+
#endif
|
27
|
+
|
19
28
|
#ifdef _WIN32
|
20
29
|
#define do_int64 signed __int64
|
21
30
|
#else
|
@@ -451,6 +460,9 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
451
460
|
// mysql_ssl_set(db, key, cert, ca, capath, cipher)
|
452
461
|
// }
|
453
462
|
|
463
|
+
my_bool reconnect = 1;
|
464
|
+
mysql_options(db, MYSQL_OPT_RECONNECT, &reconnect);
|
465
|
+
|
454
466
|
result = (MYSQL *)mysql_real_connect(
|
455
467
|
db,
|
456
468
|
host,
|
@@ -590,11 +602,50 @@ static VALUE build_query_from_args(VALUE klass, int count, VALUE *args) {
|
|
590
602
|
return query;
|
591
603
|
}
|
592
604
|
|
605
|
+
static MYSQL_RES* cCommand_execute_async(VALUE self, MYSQL* db, VALUE query) {
|
606
|
+
int socket_fd;
|
607
|
+
int retval;
|
608
|
+
fd_set rset;
|
609
|
+
char* str = RSTRING_PTR(query);
|
610
|
+
int len = RSTRING_LEN(query);
|
611
|
+
|
612
|
+
VALUE connection = rb_iv_get(self, "@connection");
|
613
|
+
|
614
|
+
retval = mysql_send_query(db, str, len);
|
615
|
+
data_objects_debug(query);
|
616
|
+
CHECK_AND_RAISE(retval);
|
617
|
+
|
618
|
+
socket_fd = db->net.fd;
|
619
|
+
|
620
|
+
for(;;) {
|
621
|
+
FD_ZERO(&rset);
|
622
|
+
FD_SET(socket_fd, &rset);
|
623
|
+
|
624
|
+
retval = rb_thread_select(socket_fd + 1, &rset, NULL, NULL, NULL);
|
625
|
+
|
626
|
+
if (retval < 0) {
|
627
|
+
rb_sys_fail(0);
|
628
|
+
}
|
629
|
+
|
630
|
+
if (retval == 0) {
|
631
|
+
continue;
|
632
|
+
}
|
633
|
+
|
634
|
+
if (db->status == MYSQL_STATUS_READY) {
|
635
|
+
break;
|
636
|
+
}
|
637
|
+
}
|
638
|
+
|
639
|
+
retval = mysql_read_query_result(db);
|
640
|
+
CHECK_AND_RAISE(retval);
|
641
|
+
|
642
|
+
return mysql_store_result(db);
|
643
|
+
}
|
644
|
+
|
593
645
|
static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
|
594
646
|
VALUE query;
|
595
647
|
|
596
648
|
MYSQL_RES *response = 0;
|
597
|
-
int query_result = 0;
|
598
649
|
|
599
650
|
my_ulonglong affected_rows;
|
600
651
|
VALUE connection = rb_iv_get(self, "@connection");
|
@@ -605,12 +656,8 @@ static VALUE cCommand_execute_non_query(int argc, VALUE *argv, VALUE self) {
|
|
605
656
|
MYSQL *db = DATA_PTR(mysql_connection);
|
606
657
|
query = build_query_from_args(self, argc, argv);
|
607
658
|
|
608
|
-
|
659
|
+
response = cCommand_execute_async(self, db, query);
|
609
660
|
|
610
|
-
query_result = mysql_query(db, StringValuePtr(query));
|
611
|
-
CHECK_AND_RAISE(query_result);
|
612
|
-
|
613
|
-
response = (MYSQL_RES *)mysql_store_result(db);
|
614
661
|
affected_rows = mysql_affected_rows(db);
|
615
662
|
mysql_free_result(response);
|
616
663
|
|
@@ -624,7 +671,6 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
624
671
|
VALUE query, reader;
|
625
672
|
VALUE field_names, field_types;
|
626
673
|
|
627
|
-
int query_result = 0;
|
628
674
|
int field_count;
|
629
675
|
int i;
|
630
676
|
|
@@ -640,12 +686,8 @@ static VALUE cCommand_execute_reader(int argc, VALUE *argv, VALUE self) {
|
|
640
686
|
MYSQL_FIELD *field;
|
641
687
|
|
642
688
|
query = build_query_from_args(self, argc, argv);
|
643
|
-
data_objects_debug(query);
|
644
|
-
|
645
|
-
query_result = mysql_query(db, StringValuePtr(query));
|
646
|
-
CHECK_AND_RAISE(query_result);
|
647
689
|
|
648
|
-
response = (
|
690
|
+
response = cCommand_execute_async(self, db, query);
|
649
691
|
|
650
692
|
if (!response) {
|
651
693
|
return Qnil;
|
data/lib/do_mysql.rb
CHANGED
data/lib/do_mysql/version.rb
CHANGED
@@ -26,6 +26,23 @@ describe DataObjects::Mysql do
|
|
26
26
|
connection.close
|
27
27
|
end
|
28
28
|
|
29
|
+
it "should be able to send querues asynchronuously in parallel" do
|
30
|
+
threads = []
|
31
|
+
|
32
|
+
start = Time.now
|
33
|
+
4.times do |i|
|
34
|
+
threads << Thread.new do
|
35
|
+
connection = DataObjects::Connection.new("mysql://root@127.0.0.1:3306/do_mysql_test")
|
36
|
+
command = connection.create_command("SELECT sleep(1)")
|
37
|
+
result = command.execute_non_query
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
threads.each{|t| t.join }
|
42
|
+
finish = Time.now
|
43
|
+
(finish - start).should < 2
|
44
|
+
end
|
45
|
+
|
29
46
|
#
|
30
47
|
# I comment this out partly to raise the issue for discussion. Socket files are afaik not supported under windows. Does this
|
31
48
|
# mean that we should test for it on unix boxes but not on windows boxes? Or does it mean that it should not be speced at all?
|
@@ -115,9 +132,9 @@ describe DataObjects::Mysql::Connection do
|
|
115
132
|
|
116
133
|
it "should delete itself from the pool" do
|
117
134
|
pool = @connection.instance_variable_get(:@__pool)
|
118
|
-
count = pool.
|
135
|
+
count = pool.size
|
119
136
|
lambda { @connection.create_command("INSERT INTO non_exista (tester) VALUES (1)").execute_non_query }.should raise_error(MysqlError)
|
120
|
-
Extlib::Pooling.pools.detect { |p| p == pool }.
|
137
|
+
Extlib::Pooling.pools.detect { |p| p == pool }.size.should == count-1
|
121
138
|
end
|
122
139
|
|
123
140
|
it "should not raise an error error executing a non query on a closed connection" do
|
data/spec/spec_helper.rb
CHANGED
@@ -16,8 +16,8 @@ $:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'data_
|
|
16
16
|
require 'data_objects'
|
17
17
|
|
18
18
|
if JRUBY
|
19
|
-
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'do_jdbc
|
20
|
-
require 'do_jdbc
|
19
|
+
$:.unshift File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'do_jdbc', 'lib'))
|
20
|
+
require 'do_jdbc'
|
21
21
|
end
|
22
22
|
|
23
23
|
# put the pre-compiled extension in the path to be found
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: do_mysql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.9.
|
4
|
+
version: 0.9.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Scott Bauer
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-10-12 00:00:00 -06:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -20,7 +20,7 @@ dependencies:
|
|
20
20
|
requirements:
|
21
21
|
- - "="
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: 0.9.
|
23
|
+
version: 0.9.6
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: hoe
|