do_mysql 0.9.10.1 → 0.9.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +6 -0
- data/LICENSE +1 -1
- data/Manifest.txt +0 -1
- data/Rakefile +37 -16
- data/buildfile +5 -4
- data/ext/do_mysql_ext/do_mysql_ext.c +23 -17
- data/ext/do_mysql_ext/extconf.rb +0 -2
- data/lib/do_mysql.rb +2 -2
- data/lib/do_mysql/version.rb +1 -1
- data/spec/integration/do_mysql_spec.rb +25 -1
- data/spec/spec_helper.rb +1 -1
- metadata +5 -6
- data/TODO +0 -4
data/History.txt
CHANGED
data/LICENSE
CHANGED
data/Manifest.txt
CHANGED
data/Rakefile
CHANGED
@@ -9,8 +9,8 @@ JRUBY = RUBY_PLATFORM =~ /java/
|
|
9
9
|
WINDOWS = Gem.win_platform?
|
10
10
|
SUDO = (WINDOWS || JRUBY) ? '' : ('sudo' unless ENV['SUDOLESS'])
|
11
11
|
|
12
|
-
AUTHOR = "
|
13
|
-
EMAIL = "
|
12
|
+
AUTHOR = "Dirkjan Bussink"
|
13
|
+
EMAIL = "d.bussink@gmail.com"
|
14
14
|
GEM_NAME = "do_mysql"
|
15
15
|
GEM_VERSION = DataObjects::Mysql::VERSION
|
16
16
|
GEM_DEPENDENCIES = if JRUBY
|
@@ -18,33 +18,54 @@ GEM_DEPENDENCIES = if JRUBY
|
|
18
18
|
else
|
19
19
|
[["data_objects", GEM_VERSION]]
|
20
20
|
end
|
21
|
-
GEM_CLEAN = ['**/*.{o,so,bundle,log,a,gem,dSYM,obj,pdb,lib,def,exp,DS_Store}',
|
22
|
-
|
21
|
+
GEM_CLEAN = ['**/*.{o,so,bundle,jar,log,a,gem,dSYM,obj,pdb,lib,def,exp,DS_Store}',
|
22
|
+
'ext/Makefile', 'ext-java/target']
|
23
|
+
GEM_EXTRAS = if JRUBY
|
24
|
+
{
|
25
|
+
:has_rdoc => false,
|
26
|
+
:platform => 'java'
|
27
|
+
}
|
28
|
+
else
|
29
|
+
{
|
30
|
+
:has_rdoc => false,
|
31
|
+
:extensions => 'ext/do_mysql_ext/extconf.rb'
|
32
|
+
}
|
33
|
+
end
|
23
34
|
|
24
35
|
PROJECT_NAME = "dorb"
|
25
36
|
PROJECT_URL = "http://rubyforge.org/projects/dorb"
|
26
37
|
PROJECT_DESCRIPTION = PROJECT_SUMMARY = "A DataObject.rb driver for MySQL"
|
27
38
|
|
28
|
-
JAVA_DRIVER = true
|
29
|
-
|
30
39
|
|
31
40
|
# RCov is run by default, except on the JRuby platform, or if NO_RCOV env is true
|
32
41
|
RUN_RCOV = JRUBY ? false : (ENV.has_key?('NO_RCOV') ? ENV['NO_RCOV'] != 'true' : true)
|
33
42
|
|
34
43
|
if (tasks_dir = ROOT.parent + 'tasks').directory?
|
35
44
|
require tasks_dir + 'hoe'
|
45
|
+
require tasks_dir + 'ext_helper_java'
|
46
|
+
|
47
|
+
setup_java_extension "#{GEM_NAME}_ext", HOE.spec
|
48
|
+
end
|
49
|
+
|
50
|
+
if JRUBY
|
51
|
+
HOE.spec.files += ['lib/do_mysql_ext.jar']
|
52
|
+
HOE.spec.require_paths = Dir['lib']
|
36
53
|
end
|
37
54
|
|
38
55
|
# compile the extension
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
56
|
+
if JRUBY
|
57
|
+
Rake::Task['compile:jruby'].invoke
|
58
|
+
else
|
59
|
+
begin
|
60
|
+
gem('rake-compiler')
|
61
|
+
require 'rake/extensiontask'
|
62
|
+
Rake::ExtensionTask.new('do_mysql_ext', HOE.spec)
|
63
|
+
rescue LoadError
|
64
|
+
warn "To cross-compile, install rake-compiler (gem install rake-compiler)"
|
65
|
+
if tasks_dir.directory?
|
66
|
+
require tasks_dir + 'ext_helper'
|
67
|
+
setup_c_extension('do_mysql_ext', HOE.spec)
|
68
|
+
end
|
48
69
|
end
|
49
70
|
end
|
50
71
|
|
@@ -70,7 +91,7 @@ desc 'Run specifications'
|
|
70
91
|
Spec::Rake::SpecTask.new(:spec) do |t|
|
71
92
|
t.spec_opts << '--format' << 'specdoc' << '--colour'
|
72
93
|
t.spec_opts << '--loadby' << 'random'
|
73
|
-
t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb')
|
94
|
+
t.spec_files = Pathname.glob(ENV['FILES'] || 'spec/**/*_spec.rb').map { |f| f.to_s }
|
74
95
|
|
75
96
|
begin
|
76
97
|
t.rcov = RUN_RCOV
|
data/buildfile
CHANGED
@@ -1,26 +1,27 @@
|
|
1
|
-
# Apache Buildr buildfile for
|
1
|
+
# Apache Buildr buildfile for do_mysql
|
2
2
|
# see http://incubator.apache.org/buildr/ for more information on Apache Buildr
|
3
3
|
require 'buildr'
|
4
4
|
require 'pathname'
|
5
5
|
|
6
6
|
VERSION_NUMBER = '1.0'
|
7
7
|
JDBC_SUPPORT = ['data_objects:jdbc:jar:1.0']
|
8
|
+
TARGET_DIR = 'pkg/classes'
|
8
9
|
repositories.remote << 'http://www.ibiblio.org/maven2/'
|
9
10
|
|
10
11
|
define 'do_mysql' do
|
11
12
|
project.version = VERSION_NUMBER
|
12
13
|
project.group = 'data_objects.rb'
|
13
14
|
|
14
|
-
manifest['Copyright'] = 'Alex Coles (C) 2008'
|
15
|
+
manifest['Copyright'] = 'Alex Coles (C) 2008-2009'
|
15
16
|
|
16
17
|
compile.using :target => '1.5', :lint => 'all', :deprecation => 'true'
|
17
18
|
|
18
19
|
define 'ext-java' do
|
19
|
-
package
|
20
|
+
package(:jar).clean.include(TARGET_DIR)
|
20
21
|
|
21
22
|
jdbc_support_jar = file('../../do_jdbc/lib/do_jdbc_internal.jar')
|
22
23
|
jdbc_support = artifact('data_objects:jdbc:jar:1.0').from(jdbc_support_jar)
|
23
24
|
|
24
|
-
compile.with
|
25
|
+
compile.into(TARGET_DIR).with(JDBC_SUPPORT)
|
25
26
|
end
|
26
27
|
end
|
@@ -43,6 +43,7 @@ static ID ID_NEW;
|
|
43
43
|
static ID ID_NEW_RATIONAL;
|
44
44
|
static ID ID_NEW_DATE;
|
45
45
|
static ID ID_CONST_GET;
|
46
|
+
static ID ID_RATIONAL;
|
46
47
|
static ID ID_UTC;
|
47
48
|
static ID ID_ESCAPE_SQL;
|
48
49
|
static ID ID_STRFTIME;
|
@@ -61,9 +62,6 @@ static VALUE cDO_Reader;
|
|
61
62
|
// References to Ruby classes that we'll need
|
62
63
|
static VALUE rb_cDate;
|
63
64
|
static VALUE rb_cDateTime;
|
64
|
-
#ifndef RUBY_19_COMPATIBILITY
|
65
|
-
static VALUE rb_cRational;
|
66
|
-
#endif
|
67
65
|
static VALUE rb_cBigDecimal;
|
68
66
|
|
69
67
|
// Classes that we'll build in Init
|
@@ -158,7 +156,7 @@ static int jd_from_date(int year, int month, int day) {
|
|
158
156
|
static VALUE seconds_to_offset(long seconds_offset) {
|
159
157
|
do_int64 num = seconds_offset, den = 86400;
|
160
158
|
reduce(&num, &den);
|
161
|
-
return rb_funcall(
|
159
|
+
return rb_funcall(rb_mKernel, ID_RATIONAL, 2, rb_ll2inum(num), rb_ll2inum(den));
|
162
160
|
}
|
163
161
|
|
164
162
|
static VALUE timezone_to_offset(int hour_offset, int minute_offset) {
|
@@ -181,7 +179,7 @@ static VALUE parse_date(const char *date) {
|
|
181
179
|
|
182
180
|
// Math from Date.jd_to_ajd
|
183
181
|
ajd = jd * 2 - 1;
|
184
|
-
rational = rb_funcall(
|
182
|
+
rational = rb_funcall(rb_mKernel, ID_RATIONAL, 2, INT2NUM(ajd), INT2NUM(2));
|
185
183
|
return rb_funcall(rb_cDate, ID_NEW_DATE, 3, rational, INT2NUM(0), INT2NUM(2299161));
|
186
184
|
}
|
187
185
|
|
@@ -293,19 +291,19 @@ static VALUE parse_date_time(const char *date) {
|
|
293
291
|
|
294
292
|
reduce(&num, &den);
|
295
293
|
|
296
|
-
ajd = rb_funcall(
|
294
|
+
ajd = rb_funcall(rb_mKernel, ID_RATIONAL, 2, rb_ull2inum(num), rb_ull2inum(den));
|
297
295
|
offset = timezone_to_offset(hour_offset, minute_offset);
|
298
296
|
|
299
297
|
return rb_funcall(rb_cDateTime, ID_NEW_DATE, 3, ajd, offset, INT2NUM(2299161));
|
300
298
|
}
|
301
299
|
|
302
300
|
// Convert C-string to a Ruby instance of Ruby type "type"
|
303
|
-
static VALUE typecast(const char* value, unsigned long length, char* type) {
|
301
|
+
static VALUE typecast(const char* value, unsigned long length, const char* type) {
|
304
302
|
if (NULL == value)
|
305
303
|
return Qnil;
|
306
304
|
|
307
305
|
if ( strcmp(type, "Class") == 0) {
|
308
|
-
return rb_funcall(
|
306
|
+
return rb_funcall(rb_cObject, rb_intern("full_const_get"), 1, TAINTED_STRING(value, length));
|
309
307
|
} else if ( strcmp(type, "Integer") == 0 || strcmp(type, "Fixnum") == 0 || strcmp(type, "Bignum") == 0 ) {
|
310
308
|
return rb_cstr2inum(value, 10);
|
311
309
|
} else if (0 == strcmp("String", type)) {
|
@@ -391,9 +389,8 @@ static MYSQL_RES* cCommand_execute_async(VALUE self, MYSQL* db, VALUE query) {
|
|
391
389
|
|
392
390
|
VALUE connection = rb_iv_get(self, "@connection");
|
393
391
|
|
394
|
-
|
395
|
-
|
396
|
-
CHECK_AND_RAISE(retval, "Mysql server has gone away. \
|
392
|
+
if(mysql_ping(db) && mysql_errno(db) == CR_SERVER_GONE_ERROR) {
|
393
|
+
CHECK_AND_RAISE(mysql_errno(db), "Mysql server has gone away. \
|
397
394
|
Please report this issue to the Datamapper project. \
|
398
395
|
Specify your at least your MySQL version when filing a ticket");
|
399
396
|
}
|
@@ -496,9 +493,6 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
496
493
|
// mysql_ssl_set(db, key, cert, ca, capath, cipher)
|
497
494
|
// }
|
498
495
|
|
499
|
-
my_bool reconnect = 1;
|
500
|
-
mysql_options(db, MYSQL_OPT_RECONNECT, &reconnect);
|
501
|
-
|
502
496
|
result = (MYSQL *)mysql_real_connect(
|
503
497
|
db,
|
504
498
|
host,
|
@@ -514,6 +508,9 @@ static VALUE cConnection_initialize(VALUE self, VALUE uri) {
|
|
514
508
|
raise_mysql_error(Qnil, db, -1, NULL);
|
515
509
|
}
|
516
510
|
|
511
|
+
my_bool reconnect = 1;
|
512
|
+
mysql_options(db, MYSQL_OPT_RECONNECT, &reconnect);
|
513
|
+
|
517
514
|
// Set the connections character set
|
518
515
|
encoding_error = mysql_set_character_set(db, encoding);
|
519
516
|
if (0 != encoding_error) {
|
@@ -763,7 +760,7 @@ static VALUE cReader_next(VALUE self) {
|
|
763
760
|
unsigned long *lengths;
|
764
761
|
|
765
762
|
int i;
|
766
|
-
char *field_type;
|
763
|
+
const char *field_type;
|
767
764
|
|
768
765
|
if (Qnil == reader_container)
|
769
766
|
return Qfalse;
|
@@ -806,6 +803,14 @@ static VALUE cReader_fields(VALUE self) {
|
|
806
803
|
return rb_iv_get(self, "@fields");
|
807
804
|
}
|
808
805
|
|
806
|
+
static VALUE cReader_field_count(VALUE self) {
|
807
|
+
return rb_iv_get(self, "@field_count");
|
808
|
+
}
|
809
|
+
|
810
|
+
static VALUE cReader_row_count(VALUE self) {
|
811
|
+
return rb_iv_get(self, "@row_count");
|
812
|
+
}
|
813
|
+
|
809
814
|
void Init_do_mysql_ext() {
|
810
815
|
rb_require("bigdecimal");
|
811
816
|
rb_require("date");
|
@@ -817,13 +822,13 @@ void Init_do_mysql_ext() {
|
|
817
822
|
ID_TO_S = rb_intern("to_s");
|
818
823
|
ID_TO_TIME = rb_intern("to_time");
|
819
824
|
ID_NEW = rb_intern("new");
|
820
|
-
ID_NEW_RATIONAL = rb_intern("new!");
|
821
825
|
#ifdef RUBY_LESS_THAN_186
|
822
826
|
ID_NEW_DATE = rb_intern("new0");
|
823
827
|
#else
|
824
828
|
ID_NEW_DATE = rb_intern("new!");
|
825
829
|
#endif
|
826
830
|
ID_CONST_GET = rb_intern("const_get");
|
831
|
+
ID_RATIONAL = rb_intern("Rational");
|
827
832
|
ID_UTC = rb_intern("utc");
|
828
833
|
ID_ESCAPE_SQL = rb_intern("escape_sql");
|
829
834
|
ID_STRFTIME = rb_intern("strftime");
|
@@ -834,7 +839,6 @@ void Init_do_mysql_ext() {
|
|
834
839
|
// Store references to a few helpful clases that aren't in Ruby Core
|
835
840
|
rb_cDate = RUBY_CLASS("Date");
|
836
841
|
rb_cDateTime = RUBY_CLASS("DateTime");
|
837
|
-
rb_cRational = RUBY_CLASS("Rational");
|
838
842
|
rb_cBigDecimal = RUBY_CLASS("BigDecimal");
|
839
843
|
|
840
844
|
// Get references to the DataObjects module and its classes
|
@@ -875,4 +879,6 @@ void Init_do_mysql_ext() {
|
|
875
879
|
rb_define_method(cReader, "next!", cReader_next, 0);
|
876
880
|
rb_define_method(cReader, "values", cReader_values, 0);
|
877
881
|
rb_define_method(cReader, "fields", cReader_fields, 0);
|
882
|
+
rb_define_method(cReader, "field_count", cReader_field_count, 0);
|
883
|
+
rb_define_method(cReader, "row_count", cReader_row_count, 0);
|
878
884
|
}
|
data/ext/do_mysql_ext/extconf.rb
CHANGED
data/lib/do_mysql.rb
CHANGED
@@ -7,7 +7,7 @@ if RUBY_PLATFORM =~ /java/
|
|
7
7
|
require 'jdbc/mysql' # the JDBC driver, packaged as a gem
|
8
8
|
end
|
9
9
|
|
10
|
-
require
|
10
|
+
require 'do_mysql_ext'
|
11
11
|
require File.expand_path(File.join(File.dirname(__FILE__), 'do_mysql', 'version'))
|
12
12
|
require File.expand_path(File.join(File.dirname(__FILE__), 'do_mysql', 'transaction'))
|
13
13
|
|
@@ -27,7 +27,7 @@ if RUBY_PLATFORM =~ /java/
|
|
27
27
|
def using_socket?
|
28
28
|
@using_socket
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def character_set
|
32
32
|
# JDBC API does not provide an easy way to get the current character set
|
33
33
|
# For now, we code the character_set used as utf8
|
data/lib/do_mysql/version.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
1
3
|
require 'pathname'
|
2
4
|
require Pathname(__FILE__).dirname.expand_path.parent + 'spec_helper'
|
3
5
|
|
@@ -157,11 +159,21 @@ describe DataObjects::Mysql::Reader do
|
|
157
159
|
|
158
160
|
it "should return the proper number of fields" do
|
159
161
|
id = insert("INSERT INTO users (name) VALUES ('Billy Bob')")
|
162
|
+
|
160
163
|
select("SELECT id, name, fired_at FROM users WHERE id = ?", nil, id) do |reader|
|
161
164
|
reader.fields.size.should == 3
|
162
165
|
end
|
163
166
|
end
|
164
167
|
|
168
|
+
it "should return proper number of rows and fields using row_count and field_count" do
|
169
|
+
pending "Neither do_jdbc nor C-extension return row_count correctly at the moment"
|
170
|
+
command = @connection.create_command("SELECT * FROM widgets WHERE id = (SELECT max(id) FROM widgets)")
|
171
|
+
reader = command.execute_reader
|
172
|
+
reader.field_count.should == 21
|
173
|
+
reader.row_count.should == 1
|
174
|
+
reader.close
|
175
|
+
end
|
176
|
+
|
165
177
|
it "should raise an exception if .values is called after reading all available rows" do
|
166
178
|
|
167
179
|
select("SELECT * FROM widgets LIMIT 2") do |reader|
|
@@ -180,6 +192,7 @@ describe DataObjects::Mysql::Reader do
|
|
180
192
|
]
|
181
193
|
# do_jdbc rewrites "?" as "(?,?)"
|
182
194
|
# to correspond to the JDBC API
|
195
|
+
|
183
196
|
select("SELECT * FROM users WHERE id IN ?", nil, ids) do |reader|
|
184
197
|
# select already calls next once for us
|
185
198
|
reader.next!.should == true
|
@@ -210,10 +223,19 @@ describe DataObjects::Mysql::Reader do
|
|
210
223
|
end
|
211
224
|
end
|
212
225
|
|
226
|
+
it "should correctly work with default utf8 character set" do
|
227
|
+
name = "Билли Боб"
|
228
|
+
id = insert("INSERT INTO users (name) VALUES ('#{name}')")
|
229
|
+
|
230
|
+
select("SELECT name from users WHERE id = ?", [String], id) do |reader|
|
231
|
+
reader.values[0].should == name
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
213
235
|
describe "Date, Time, and DateTime" do
|
214
236
|
|
215
237
|
it "should return nil when the time is 0" do
|
216
|
-
|
238
|
+
pending "We need to introduce something like Proxy for typeasting where each SQL type will have _rules_ of casting" if JRUBY
|
217
239
|
# skip the test if the strict dates/times setting is turned on
|
218
240
|
strict_time = select("SHOW VARIABLES LIKE 'sql_mode'") do |reader|
|
219
241
|
reader.values.last.split(',').any? do |mode|
|
@@ -233,9 +255,11 @@ describe DataObjects::Mysql::Reader do
|
|
233
255
|
it "should return DateTimes using the current locale's Time Zone" do
|
234
256
|
date = DateTime.now
|
235
257
|
id = insert("INSERT INTO users (name, fired_at) VALUES (?, ?)", 'Sam', date)
|
258
|
+
|
236
259
|
select("SELECT fired_at FROM users WHERE id = ?", [DateTime], id) do |reader|
|
237
260
|
reader.values.last.to_s.should == date.to_s
|
238
261
|
end
|
262
|
+
|
239
263
|
exec("DELETE FROM users WHERE id = ?", id)
|
240
264
|
end
|
241
265
|
|
data/spec/spec_helper.rb
CHANGED
@@ -28,7 +28,7 @@ require 'do_mysql'
|
|
28
28
|
log_path = File.expand_path(File.join(File.dirname(__FILE__), '..', 'log', 'do.log'))
|
29
29
|
FileUtils.mkdir_p(File.dirname(log_path))
|
30
30
|
|
31
|
-
DataObjects::Mysql.logger = DataObjects::Logger.new(log_path,
|
31
|
+
DataObjects::Mysql.logger = DataObjects::Logger.new(log_path, :debug)
|
32
32
|
|
33
33
|
at_exit { DataObjects.logger.flush }
|
34
34
|
|
metadata
CHANGED
@@ -1,15 +1,15 @@
|
|
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.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
|
-
-
|
7
|
+
- Dirkjan Bussink
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-01-
|
12
|
+
date: 2009-01-19 00:00:00 +01: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.11
|
24
24
|
version:
|
25
25
|
- !ruby/object:Gem::Dependency
|
26
26
|
name: hoe
|
@@ -34,7 +34,7 @@ dependencies:
|
|
34
34
|
version:
|
35
35
|
description: A DataObject.rb driver for MySQL
|
36
36
|
email:
|
37
|
-
-
|
37
|
+
- d.bussink@gmail.com
|
38
38
|
executables: []
|
39
39
|
|
40
40
|
extensions:
|
@@ -50,7 +50,6 @@ files:
|
|
50
50
|
- Manifest.txt
|
51
51
|
- README.txt
|
52
52
|
- Rakefile
|
53
|
-
- TODO
|
54
53
|
- buildfile
|
55
54
|
- ext-java/src/main/java/DoMysqlExtService.java
|
56
55
|
- ext-java/src/main/java/do_mysql/MySqlDriverDefinition.java
|