rdo-mysql 0.0.4 → 0.0.5
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/ext/rdo_mysql/driver.c +16 -2
- data/ext/rdo_mysql/tuples.c +15 -1
- data/lib/rdo/mysql/version.rb +1 -1
- data/spec/mysql/bind_params_spec.rb +25 -0
- data/spec/mysql/type_cast_spec.rb +14 -0
- metadata +2 -2
data/ext/rdo_mysql/driver.c
CHANGED
@@ -134,10 +134,22 @@ static VALUE rdo_mysql_driver_quote(VALUE self, VALUE obj) {
|
|
134
134
|
return rb_str_new2(quoted);
|
135
135
|
}
|
136
136
|
|
137
|
+
/** Find any Set arguments and ensure they are formatted as Strings */
|
138
|
+
static void rdo_mysql_driver_normalize_sets_bang(VALUE * args, int argc) {
|
139
|
+
int i = 0;
|
140
|
+
for (; i < argc; ++i) {
|
141
|
+
if (rb_funcall(args[i], rb_intern("kind_of?"), 1, rb_path2class("Set")))
|
142
|
+
args[i] = rb_funcall(args[i], rb_intern("to_a"), 0);
|
143
|
+
|
144
|
+
if (rb_funcall(args[i], rb_intern("kind_of?"), 1, rb_cArray))
|
145
|
+
args[i] = rb_funcall(args[i], rb_intern("join"), 1, rb_str_new2(","));
|
146
|
+
}
|
147
|
+
}
|
148
|
+
|
137
149
|
/** Find any Time/DateTime arguments and ensure they use the system time zone */
|
138
150
|
static void rdo_mysql_driver_normalize_date_times_bang(VALUE * args, int argc) {
|
139
|
-
int i;
|
140
|
-
for (
|
151
|
+
int i = 0;
|
152
|
+
for (; i < argc; ++i) {
|
141
153
|
if (rb_funcall(args[i], rb_intern("kind_of?"), 1, rb_path2class("DateTime"))) {
|
142
154
|
VALUE offset = rb_funcall(
|
143
155
|
rb_funcall(rb_path2class("DateTime"), rb_intern("now"), 0),
|
@@ -167,6 +179,7 @@ static VALUE rdo_mysql_driver_execute(int argc, VALUE * args, VALUE self) {
|
|
167
179
|
}
|
168
180
|
|
169
181
|
rdo_mysql_driver_normalize_date_times_bang(&args[1], argc - 1);
|
182
|
+
rdo_mysql_driver_normalize_sets_bang(&args[1], argc - 1);
|
170
183
|
|
171
184
|
VALUE stmt = RDO_INTERPOLATE(self, args, argc);
|
172
185
|
|
@@ -186,6 +199,7 @@ static VALUE rdo_mysql_driver_execute(int argc, VALUE * args, VALUE self) {
|
|
186
199
|
void Init_rdo_mysql_driver(void) {
|
187
200
|
rb_require("rdo/mysql/driver");
|
188
201
|
rb_require("date");
|
202
|
+
rb_require("set");
|
189
203
|
|
190
204
|
VALUE cMySQL = rb_path2class("RDO::MySQL::Driver");
|
191
205
|
|
data/ext/rdo_mysql/tuples.c
CHANGED
@@ -27,6 +27,13 @@ static void rdo_mysql_tuple_list_free(RDOMySQLTupleList * list) {
|
|
27
27
|
free(list);
|
28
28
|
}
|
29
29
|
|
30
|
+
/** Parse the string as a Set */
|
31
|
+
static VALUE rdo_mysql_parse_set(char * v, unsigned long len, int enc) {
|
32
|
+
return rb_funcall(rb_path2class("Set"),
|
33
|
+
rb_intern("new"), 1, rb_funcall(RDO_STRING(v, len, enc),
|
34
|
+
rb_intern("split"), 1, rb_str_new2(",")));
|
35
|
+
}
|
36
|
+
|
30
37
|
/** Constructor to create a new TupleList for the given result */
|
31
38
|
VALUE rdo_mysql_tuple_list_new(MYSQL_RES * res, int encoding) {
|
32
39
|
RDOMySQLTupleList * list = malloc(sizeof(RDOMySQLTupleList));
|
@@ -59,8 +66,13 @@ static VALUE rdo_mysql_cast_value(char * v, unsigned long len, MYSQL_FIELD f, in
|
|
59
66
|
|
60
67
|
case MYSQL_TYPE_STRING:
|
61
68
|
case MYSQL_TYPE_VAR_STRING:
|
69
|
+
case MYSQL_TYPE_MEDIUM_BLOB:
|
70
|
+
case MYSQL_TYPE_TINY_BLOB:
|
71
|
+
case MYSQL_TYPE_LONG_BLOB:
|
62
72
|
case MYSQL_TYPE_BLOB:
|
63
|
-
if (f.
|
73
|
+
if (f.flags & SET_FLAG)
|
74
|
+
return rdo_mysql_parse_set(v, len, enc);
|
75
|
+
else if (f.charsetnr == RDO_MYSQL_BINARY_ENC)
|
64
76
|
return RDO_BINARY_STRING(v, len);
|
65
77
|
else
|
66
78
|
return RDO_STRING(v, len, enc);
|
@@ -74,6 +86,7 @@ static VALUE rdo_mysql_cast_value(char * v, unsigned long len, MYSQL_FIELD f, in
|
|
74
86
|
return RDO_FLOAT(v);
|
75
87
|
|
76
88
|
case MYSQL_TYPE_DATE:
|
89
|
+
case MYSQL_TYPE_NEWDATE:
|
77
90
|
return RDO_DATE(v);
|
78
91
|
|
79
92
|
case MYSQL_TYPE_TIMESTAMP:
|
@@ -120,6 +133,7 @@ static VALUE rdo_mysql_tuple_list_each(VALUE self) {
|
|
120
133
|
/** Initializer for the TupleList class */
|
121
134
|
void Init_rdo_mysql_tuples(void) {
|
122
135
|
rb_require("rdo/mysql");
|
136
|
+
rb_require("set");
|
123
137
|
|
124
138
|
VALUE mMySQL = rb_path2class("RDO::MySQL");
|
125
139
|
|
data/lib/rdo/mysql/version.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
require "spec_helper"
|
2
2
|
require "date"
|
3
3
|
require "bigdecimal"
|
4
|
+
require "set"
|
4
5
|
|
5
6
|
describe RDO::MySQL::Driver, "bind params" do
|
6
7
|
let(:options) { connection_uri }
|
@@ -678,4 +679,28 @@ describe RDO::MySQL::Driver, "bind params" do
|
|
678
679
|
end
|
679
680
|
end
|
680
681
|
end
|
682
|
+
|
683
|
+
describe "Set param" do
|
684
|
+
context "against a set field" do
|
685
|
+
let(:table) do
|
686
|
+
<<-SQL
|
687
|
+
CREATE TABLE test (
|
688
|
+
id INT PRIMARY KEY AUTO_INCREMENT,
|
689
|
+
pets SET('cat', 'dog', 'mouse')
|
690
|
+
)
|
691
|
+
SQL
|
692
|
+
end
|
693
|
+
|
694
|
+
let(:insert) do
|
695
|
+
[
|
696
|
+
"INSERT INTO test (pets) VALUES (?)",
|
697
|
+
Set["cat", "mouse"]
|
698
|
+
]
|
699
|
+
end
|
700
|
+
|
701
|
+
it "is inferred correctly" do
|
702
|
+
tuple.should == {id: 1, pets: Set["cat", "mouse"]}
|
703
|
+
end
|
704
|
+
end
|
705
|
+
end
|
681
706
|
end
|
@@ -2,6 +2,7 @@ require "spec_helper"
|
|
2
2
|
require "bigdecimal"
|
3
3
|
require "date"
|
4
4
|
require "uri"
|
5
|
+
require "set"
|
5
6
|
|
6
7
|
describe RDO::MySQL::Driver, "type casting" do
|
7
8
|
let(:options) { connection_uri }
|
@@ -267,4 +268,17 @@ describe RDO::MySQL::Driver, "type casting" do
|
|
267
268
|
value.should == DateTime.new(2012, 9, 30, 19, 4, 36, DateTime.now.zone)
|
268
269
|
end
|
269
270
|
end
|
271
|
+
|
272
|
+
describe "set cast" do
|
273
|
+
before(:each) do
|
274
|
+
connection.execute("CREATE TEMPORARY TABLE test (s SET('cat', 'dog', 'mouse'))")
|
275
|
+
connection.execute("INSERT INTO test (s) VALUES ('cat,mouse')")
|
276
|
+
end
|
277
|
+
|
278
|
+
let(:sql) { "SELECT s FROM test" }
|
279
|
+
|
280
|
+
it "returns a Set" do
|
281
|
+
value.should == Set["cat", "mouse"]
|
282
|
+
end
|
283
|
+
end
|
270
284
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rdo-mysql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-15 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rdo
|