mysql2 0.3.18 → 0.4.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +1 -0
- data/LICENSE +21 -0
- data/README.md +68 -16
- data/examples/eventmachine.rb +1 -1
- data/examples/threaded.rb +4 -6
- data/ext/mysql2/client.c +230 -179
- data/ext/mysql2/client.h +18 -1
- data/ext/mysql2/extconf.rb +95 -35
- data/ext/mysql2/infile.c +2 -2
- data/ext/mysql2/mysql2_ext.c +1 -0
- data/ext/mysql2/mysql2_ext.h +5 -6
- data/ext/mysql2/mysql_enc_name_to_ruby.h +2 -2
- data/ext/mysql2/mysql_enc_to_ruby.h +25 -22
- data/ext/mysql2/result.c +501 -132
- data/ext/mysql2/result.h +12 -6
- data/ext/mysql2/statement.c +504 -0
- data/ext/mysql2/statement.h +19 -0
- data/lib/mysql2/client.rb +71 -25
- data/lib/mysql2/console.rb +1 -1
- data/lib/mysql2/em.rb +5 -6
- data/lib/mysql2/error.rb +18 -27
- data/lib/mysql2/field.rb +3 -0
- data/lib/mysql2/statement.rb +17 -0
- data/lib/mysql2/version.rb +1 -1
- data/lib/mysql2.rb +38 -18
- data/spec/em/em_spec.rb +21 -21
- data/spec/mysql2/client_spec.rb +453 -359
- data/spec/mysql2/error_spec.rb +37 -36
- data/spec/mysql2/result_spec.rb +217 -208
- data/spec/mysql2/statement_spec.rb +695 -0
- data/spec/spec_helper.rb +7 -0
- data/spec/ssl/ca-cert.pem +17 -0
- data/spec/ssl/ca-key.pem +27 -0
- data/spec/ssl/ca.cnf +22 -0
- data/spec/ssl/cert.cnf +22 -0
- data/spec/ssl/client-cert.pem +17 -0
- data/spec/ssl/client-key.pem +27 -0
- data/spec/ssl/client-req.pem +15 -0
- data/spec/ssl/gen_certs.sh +48 -0
- data/spec/ssl/pkcs8-client-key.pem +28 -0
- data/spec/ssl/pkcs8-server-key.pem +28 -0
- data/spec/ssl/server-cert.pem +17 -0
- data/spec/ssl/server-key.pem +27 -0
- data/spec/ssl/server-req.pem +15 -0
- data/support/mysql_enc_to_ruby.rb +7 -8
- data/support/ruby_enc_to_mysql.rb +1 -1
- metadata +41 -46
data/spec/mysql2/result_spec.rb
CHANGED
@@ -1,39 +1,51 @@
|
|
1
1
|
# encoding: UTF-8
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
-
describe Mysql2::Result do
|
4
|
+
RSpec.describe Mysql2::Result do
|
5
5
|
before(:each) do
|
6
6
|
@result = @client.query "SELECT 1"
|
7
7
|
end
|
8
8
|
|
9
|
+
it "should raise a TypeError exception when it doesn't wrap a result set" do
|
10
|
+
r = Mysql2::Result.new
|
11
|
+
expect { r.count }.to raise_error(TypeError)
|
12
|
+
expect { r.fields }.to raise_error(TypeError)
|
13
|
+
expect { r.size }.to raise_error(TypeError)
|
14
|
+
expect { r.each }.to raise_error(TypeError)
|
15
|
+
end
|
16
|
+
|
9
17
|
it "should have included Enumerable" do
|
10
|
-
Mysql2::Result.ancestors.include?(Enumerable).
|
18
|
+
expect(Mysql2::Result.ancestors.include?(Enumerable)).to be true
|
11
19
|
end
|
12
20
|
|
13
21
|
it "should respond to #each" do
|
14
|
-
@result.
|
22
|
+
expect(@result).to respond_to(:each)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should respond to #free" do
|
26
|
+
expect(@result).to respond_to(:free)
|
15
27
|
end
|
16
28
|
|
17
29
|
it "should raise a Mysql2::Error exception upon a bad query" do
|
18
|
-
|
30
|
+
expect {
|
19
31
|
@client.query "bad sql"
|
20
|
-
}.
|
32
|
+
}.to raise_error(Mysql2::Error)
|
21
33
|
|
22
|
-
|
34
|
+
expect {
|
23
35
|
@client.query "SELECT 1"
|
24
|
-
}.
|
36
|
+
}.not_to raise_error
|
25
37
|
end
|
26
38
|
|
27
39
|
it "should respond to #count, which is aliased as #size" do
|
28
40
|
r = @client.query "SELECT 1"
|
29
|
-
r.
|
30
|
-
r.
|
41
|
+
expect(r).to respond_to :count
|
42
|
+
expect(r).to respond_to :size
|
31
43
|
end
|
32
44
|
|
33
45
|
it "should be able to return the number of rows in the result set" do
|
34
46
|
r = @client.query "SELECT 1"
|
35
|
-
r.count.
|
36
|
-
r.size.
|
47
|
+
expect(r.count).to eql(1)
|
48
|
+
expect(r.size).to eql(1)
|
37
49
|
end
|
38
50
|
|
39
51
|
context "metadata queries" do
|
@@ -45,39 +57,39 @@ describe Mysql2::Result do
|
|
45
57
|
context "#each" do
|
46
58
|
it "should yield rows as hash's" do
|
47
59
|
@result.each do |row|
|
48
|
-
row.
|
60
|
+
expect(row).to be_an_instance_of(Hash)
|
49
61
|
end
|
50
62
|
end
|
51
63
|
|
52
64
|
it "should yield rows as hash's with symbol keys if :symbolize_keys was set to true" do
|
53
65
|
@result.each(:symbolize_keys => true) do |row|
|
54
|
-
row.keys.first.
|
66
|
+
expect(row.keys.first).to be_an_instance_of(Symbol)
|
55
67
|
end
|
56
68
|
end
|
57
69
|
|
58
70
|
it "should be able to return results as an array" do
|
59
71
|
@result.each(:as => :array) do |row|
|
60
|
-
row.
|
72
|
+
expect(row).to be_an_instance_of(Array)
|
61
73
|
end
|
62
74
|
end
|
63
75
|
|
64
76
|
it "should cache previously yielded results by default" do
|
65
|
-
@result.first.object_id.
|
77
|
+
expect(@result.first.object_id).to eql(@result.first.object_id)
|
66
78
|
end
|
67
79
|
|
68
80
|
it "should not cache previously yielded results if cache_rows is disabled" do
|
69
81
|
result = @client.query "SELECT 1", :cache_rows => false
|
70
|
-
result.first.object_id.
|
82
|
+
expect(result.first.object_id).not_to eql(result.first.object_id)
|
71
83
|
end
|
72
84
|
|
73
85
|
it "should yield different value for #first if streaming" do
|
74
86
|
result = @client.query "SELECT 1 UNION SELECT 2", :stream => true, :cache_rows => false
|
75
|
-
result.first.
|
87
|
+
expect(result.first).not_to eql(result.first)
|
76
88
|
end
|
77
89
|
|
78
90
|
it "should yield the same value for #first if streaming is disabled" do
|
79
91
|
result = @client.query "SELECT 1 UNION SELECT 2", :stream => false
|
80
|
-
result.first.
|
92
|
+
expect(result.first).to eql(result.first)
|
81
93
|
end
|
82
94
|
|
83
95
|
it "should throw an exception if we try to iterate twice when streaming is enabled" do
|
@@ -96,41 +108,43 @@ describe Mysql2::Result do
|
|
96
108
|
end
|
97
109
|
|
98
110
|
it "method should exist" do
|
99
|
-
@test_result.
|
111
|
+
expect(@test_result).to respond_to(:fields)
|
100
112
|
end
|
101
113
|
|
102
114
|
it "should return an array of field names in proper order" do
|
103
115
|
result = @client.query "SELECT 'a', 'b', 'c'"
|
104
|
-
result.fields.
|
116
|
+
expect(result.fields).to eql(%w(a b c))
|
105
117
|
end
|
106
118
|
end
|
107
119
|
|
108
120
|
context "streaming" do
|
109
121
|
it "should maintain a count while streaming" do
|
110
|
-
result = @client.query('SELECT 1')
|
111
|
-
|
112
|
-
result.count.should eql(1)
|
122
|
+
result = @client.query('SELECT 1', :stream => true, :cache_rows => false)
|
123
|
+
expect(result.count).to eql(0)
|
113
124
|
result.each.to_a
|
114
|
-
result.count.
|
125
|
+
expect(result.count).to eql(1)
|
115
126
|
end
|
116
127
|
|
117
|
-
it "should
|
118
|
-
result = @client.query("SELECT
|
119
|
-
result.count.
|
120
|
-
result.
|
121
|
-
result.count.
|
128
|
+
it "should retain the count when mixing first and each" do
|
129
|
+
result = @client.query("SELECT 1 UNION SELECT 2", :stream => true, :cache_rows => false)
|
130
|
+
expect(result.count).to eql(0)
|
131
|
+
result.first
|
132
|
+
expect(result.count).to eql(1)
|
133
|
+
result.each.to_a
|
134
|
+
expect(result.count).to eql(2)
|
122
135
|
end
|
123
136
|
|
124
137
|
it "should not yield nil at the end of streaming" do
|
125
138
|
result = @client.query('SELECT * FROM mysql2_test', :stream => true, :cache_rows => false)
|
126
|
-
result.each { |r| r.
|
139
|
+
result.each { |r| expect(r).not_to be_nil }
|
127
140
|
end
|
128
141
|
|
129
142
|
it "#count should be zero for rows after streaming when there were no results" do
|
143
|
+
@client.query "USE test"
|
130
144
|
result = @client.query("SELECT * FROM mysql2_test WHERE null_test IS NOT NULL", :stream => true, :cache_rows => false)
|
131
|
-
result.count.
|
145
|
+
expect(result.count).to eql(0)
|
132
146
|
result.each.to_a
|
133
|
-
result.count.
|
147
|
+
expect(result.count).to eql(0)
|
134
148
|
end
|
135
149
|
|
136
150
|
it "should raise an exception if streaming ended due to a timeout" do
|
@@ -147,12 +161,12 @@ describe Mysql2::Result do
|
|
147
161
|
client.query "SET net_write_timeout = 1"
|
148
162
|
res = client.query "SELECT * FROM streamingTest", :stream => true, :cache_rows => false
|
149
163
|
|
150
|
-
|
151
|
-
res.each_with_index do |
|
164
|
+
expect {
|
165
|
+
res.each_with_index do |_, i|
|
152
166
|
# Exhaust the first result packet then trigger a timeout
|
153
167
|
sleep 2 if i > 0 && i % 1000 == 0
|
154
168
|
end
|
155
|
-
}.
|
169
|
+
}.to raise_error(Mysql2::Error, /Lost connection/)
|
156
170
|
end
|
157
171
|
end
|
158
172
|
|
@@ -163,32 +177,32 @@ describe Mysql2::Result do
|
|
163
177
|
|
164
178
|
it "should return nil values for NULL and strings for everything else when :cast is false" do
|
165
179
|
result = @client.query('SELECT null_test, tiny_int_test, bool_cast_test, int_test, date_test, enum_test FROM mysql2_test WHERE bool_cast_test = 1 LIMIT 1', :cast => false).first
|
166
|
-
result["null_test"].
|
167
|
-
result["tiny_int_test"].
|
168
|
-
result["bool_cast_test"].
|
169
|
-
result["int_test"].
|
170
|
-
result["date_test"].
|
171
|
-
result["enum_test"].
|
180
|
+
expect(result["null_test"]).to be_nil
|
181
|
+
expect(result["tiny_int_test"]).to eql("1")
|
182
|
+
expect(result["bool_cast_test"]).to eql("1")
|
183
|
+
expect(result["int_test"]).to eql("10")
|
184
|
+
expect(result["date_test"]).to eql("2010-04-04")
|
185
|
+
expect(result["enum_test"]).to eql("val1")
|
172
186
|
end
|
173
187
|
|
174
188
|
it "should return nil for a NULL value" do
|
175
|
-
@test_result['null_test'].
|
176
|
-
@test_result['null_test'].
|
189
|
+
expect(@test_result['null_test']).to be_an_instance_of(NilClass)
|
190
|
+
expect(@test_result['null_test']).to eql(nil)
|
177
191
|
end
|
178
192
|
|
179
193
|
it "should return String for a BIT(64) value" do
|
180
|
-
@test_result['bit_test'].
|
181
|
-
@test_result['bit_test'].
|
194
|
+
expect(@test_result['bit_test']).to be_an_instance_of(String)
|
195
|
+
expect(@test_result['bit_test']).to eql("\000\000\000\000\000\000\000\005")
|
182
196
|
end
|
183
197
|
|
184
198
|
it "should return String for a BIT(1) value" do
|
185
|
-
@test_result['single_bit_test'].
|
186
|
-
@test_result['single_bit_test'].
|
199
|
+
expect(@test_result['single_bit_test']).to be_an_instance_of(String)
|
200
|
+
expect(@test_result['single_bit_test']).to eql("\001")
|
187
201
|
end
|
188
202
|
|
189
203
|
it "should return Fixnum for a TINYINT value" do
|
190
|
-
[Fixnum, Bignum].
|
191
|
-
@test_result['tiny_int_test'].
|
204
|
+
expect([Fixnum, Bignum]).to include(@test_result['tiny_int_test'].class)
|
205
|
+
expect(@test_result['tiny_int_test']).to eql(1)
|
192
206
|
end
|
193
207
|
|
194
208
|
it "should return TrueClass or FalseClass for a TINYINT value if :cast_booleans is enabled" do
|
@@ -202,9 +216,9 @@ describe Mysql2::Result do
|
|
202
216
|
result1 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = 1 LIMIT 1', :cast_booleans => true
|
203
217
|
result2 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = 0 LIMIT 1', :cast_booleans => true
|
204
218
|
result3 = @client.query 'SELECT bool_cast_test FROM mysql2_test WHERE bool_cast_test = -1 LIMIT 1', :cast_booleans => true
|
205
|
-
result1.first['bool_cast_test'].
|
206
|
-
result2.first['bool_cast_test'].
|
207
|
-
result3.first['bool_cast_test'].
|
219
|
+
expect(result1.first['bool_cast_test']).to be true
|
220
|
+
expect(result2.first['bool_cast_test']).to be false
|
221
|
+
expect(result3.first['bool_cast_test']).to be true
|
208
222
|
|
209
223
|
@client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2},#{id3})"
|
210
224
|
end
|
@@ -217,219 +231,214 @@ describe Mysql2::Result do
|
|
217
231
|
|
218
232
|
result1 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id1}", :cast_booleans => true
|
219
233
|
result2 = @client.query "SELECT single_bit_test FROM mysql2_test WHERE id = #{id2}", :cast_booleans => true
|
220
|
-
result1.first['single_bit_test'].
|
221
|
-
result2.first['single_bit_test'].
|
234
|
+
expect(result1.first['single_bit_test']).to be true
|
235
|
+
expect(result2.first['single_bit_test']).to be false
|
222
236
|
|
223
237
|
@client.query "DELETE from mysql2_test WHERE id IN(#{id1},#{id2})"
|
224
238
|
end
|
225
239
|
|
226
240
|
it "should return Fixnum for a SMALLINT value" do
|
227
|
-
[Fixnum, Bignum].
|
228
|
-
@test_result['small_int_test'].
|
241
|
+
expect([Fixnum, Bignum]).to include(@test_result['small_int_test'].class)
|
242
|
+
expect(@test_result['small_int_test']).to eql(10)
|
229
243
|
end
|
230
244
|
|
231
245
|
it "should return Fixnum for a MEDIUMINT value" do
|
232
|
-
[Fixnum, Bignum].
|
233
|
-
@test_result['medium_int_test'].
|
246
|
+
expect([Fixnum, Bignum]).to include(@test_result['medium_int_test'].class)
|
247
|
+
expect(@test_result['medium_int_test']).to eql(10)
|
234
248
|
end
|
235
249
|
|
236
250
|
it "should return Fixnum for an INT value" do
|
237
|
-
[Fixnum, Bignum].
|
238
|
-
@test_result['int_test'].
|
251
|
+
expect([Fixnum, Bignum]).to include(@test_result['int_test'].class)
|
252
|
+
expect(@test_result['int_test']).to eql(10)
|
239
253
|
end
|
240
254
|
|
241
255
|
it "should return Fixnum for a BIGINT value" do
|
242
|
-
[Fixnum, Bignum].
|
243
|
-
@test_result['big_int_test'].
|
256
|
+
expect([Fixnum, Bignum]).to include(@test_result['big_int_test'].class)
|
257
|
+
expect(@test_result['big_int_test']).to eql(10)
|
244
258
|
end
|
245
259
|
|
246
260
|
it "should return Fixnum for a YEAR value" do
|
247
|
-
[Fixnum, Bignum].
|
248
|
-
@test_result['year_test'].
|
261
|
+
expect([Fixnum, Bignum]).to include(@test_result['year_test'].class)
|
262
|
+
expect(@test_result['year_test']).to eql(2009)
|
249
263
|
end
|
250
264
|
|
251
265
|
it "should return BigDecimal for a DECIMAL value" do
|
252
|
-
@test_result['decimal_test'].
|
253
|
-
@test_result['decimal_test'].
|
266
|
+
expect(@test_result['decimal_test']).to be_an_instance_of(BigDecimal)
|
267
|
+
expect(@test_result['decimal_test']).to eql(10.3)
|
254
268
|
end
|
255
269
|
|
256
270
|
it "should return Float for a FLOAT value" do
|
257
|
-
@test_result['float_test'].
|
258
|
-
@test_result['float_test'].
|
271
|
+
expect(@test_result['float_test']).to be_an_instance_of(Float)
|
272
|
+
expect(@test_result['float_test']).to eql(10.3)
|
259
273
|
end
|
260
274
|
|
261
275
|
it "should return Float for a DOUBLE value" do
|
262
|
-
@test_result['double_test'].
|
263
|
-
@test_result['double_test'].
|
276
|
+
expect(@test_result['double_test']).to be_an_instance_of(Float)
|
277
|
+
expect(@test_result['double_test']).to eql(10.3)
|
264
278
|
end
|
265
279
|
|
266
280
|
it "should return Time for a DATETIME value when within the supported range" do
|
267
|
-
@test_result['date_time_test'].
|
268
|
-
@test_result['date_time_test'].strftime("%Y-%m-%d %H:%M:%S").
|
281
|
+
expect(@test_result['date_time_test']).to be_an_instance_of(Time)
|
282
|
+
expect(@test_result['date_time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
|
269
283
|
end
|
270
284
|
|
271
285
|
if 1.size == 4 # 32bit
|
272
|
-
|
273
|
-
|
286
|
+
klass = if RUBY_VERSION =~ /1.8/
|
287
|
+
DateTime
|
274
288
|
else
|
275
|
-
|
289
|
+
Time
|
276
290
|
end
|
277
291
|
|
278
292
|
it "should return DateTime when timestamp is < 1901-12-13 20:45:52" do
|
279
|
-
|
293
|
+
# 1901-12-13T20:45:52 is the min for 32bit Ruby 1.8
|
280
294
|
r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
|
281
|
-
r.first['test'].
|
295
|
+
expect(r.first['test']).to be_an_instance_of(klass)
|
282
296
|
end
|
283
297
|
|
284
298
|
it "should return DateTime when timestamp is > 2038-01-19T03:14:07" do
|
285
|
-
|
299
|
+
# 2038-01-19T03:14:07 is the max for 32bit Ruby 1.8
|
286
300
|
r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
|
287
|
-
r.first['test'].
|
301
|
+
expect(r.first['test']).to be_an_instance_of(klass)
|
288
302
|
end
|
289
303
|
elsif 1.size == 8 # 64bit
|
290
|
-
|
291
|
-
it "should return Time when timestamp is < 1901-12-13 20:45:52" do
|
292
|
-
r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
|
293
|
-
r.first['test'].class.should eql(Time)
|
294
|
-
end
|
295
|
-
|
296
|
-
it "should return Time when timestamp is > 2038-01-19T03:14:07" do
|
297
|
-
r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
|
298
|
-
r.first['test'].class.should eql(Time)
|
299
|
-
end
|
300
|
-
else
|
304
|
+
if RUBY_VERSION =~ /1.8/
|
301
305
|
it "should return Time when timestamp is > 0138-12-31 11:59:59" do
|
302
306
|
r = @client.query("SELECT CAST('0139-1-1 00:00:00' AS DATETIME) as test")
|
303
|
-
r.first['test'].
|
307
|
+
expect(r.first['test']).to be_an_instance_of(Time)
|
304
308
|
end
|
305
309
|
|
306
310
|
it "should return DateTime when timestamp is < 0139-1-1T00:00:00" do
|
307
311
|
r = @client.query("SELECT CAST('0138-12-31 11:59:59' AS DATETIME) as test")
|
308
|
-
r.first['test'].
|
312
|
+
expect(r.first['test']).to be_an_instance_of(DateTime)
|
313
|
+
end
|
314
|
+
|
315
|
+
it "should return Time when timestamp is > 2038-01-19T03:14:07" do
|
316
|
+
r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
|
317
|
+
expect(r.first['test']).to be_an_instance_of(Time)
|
318
|
+
end
|
319
|
+
else
|
320
|
+
it "should return Time when timestamp is < 1901-12-13 20:45:52" do
|
321
|
+
r = @client.query("SELECT CAST('1901-12-13 20:45:51' AS DATETIME) as test")
|
322
|
+
expect(r.first['test']).to be_an_instance_of(Time)
|
309
323
|
end
|
310
324
|
|
311
325
|
it "should return Time when timestamp is > 2038-01-19T03:14:07" do
|
312
326
|
r = @client.query("SELECT CAST('2038-01-19 03:14:08' AS DATETIME) as test")
|
313
|
-
r.first['test'].
|
327
|
+
expect(r.first['test']).to be_an_instance_of(Time)
|
314
328
|
end
|
315
329
|
end
|
316
330
|
end
|
317
331
|
|
318
332
|
it "should return Time for a TIMESTAMP value when within the supported range" do
|
319
|
-
@test_result['timestamp_test'].
|
320
|
-
@test_result['timestamp_test'].strftime("%Y-%m-%d %H:%M:%S").
|
333
|
+
expect(@test_result['timestamp_test']).to be_an_instance_of(Time)
|
334
|
+
expect(@test_result['timestamp_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2010-04-04 11:44:00')
|
321
335
|
end
|
322
336
|
|
323
337
|
it "should return Time for a TIME value" do
|
324
|
-
@test_result['time_test'].
|
325
|
-
@test_result['time_test'].strftime("%Y-%m-%d %H:%M:%S").
|
338
|
+
expect(@test_result['time_test']).to be_an_instance_of(Time)
|
339
|
+
expect(@test_result['time_test'].strftime("%Y-%m-%d %H:%M:%S")).to eql('2000-01-01 11:44:00')
|
326
340
|
end
|
327
341
|
|
328
342
|
it "should return Date for a DATE value" do
|
329
|
-
@test_result['date_test'].
|
330
|
-
@test_result['date_test'].strftime("%Y-%m-%d").
|
343
|
+
expect(@test_result['date_test']).to be_an_instance_of(Date)
|
344
|
+
expect(@test_result['date_test'].strftime("%Y-%m-%d")).to eql('2010-04-04')
|
331
345
|
end
|
332
346
|
|
333
347
|
it "should return String for an ENUM value" do
|
334
|
-
@test_result['enum_test'].
|
335
|
-
@test_result['enum_test'].
|
348
|
+
expect(@test_result['enum_test']).to be_an_instance_of(String)
|
349
|
+
expect(@test_result['enum_test']).to eql('val1')
|
336
350
|
end
|
337
351
|
|
338
352
|
it "should raise an error given an invalid DATETIME" do
|
339
|
-
|
340
|
-
|
341
|
-
rescue Mysql2::Error => e
|
342
|
-
error = e
|
343
|
-
end
|
344
|
-
|
345
|
-
error.message.should eql("Invalid date in field 'bad_datetime': 1972-00-27 00:00:00")
|
353
|
+
expect { @client.query("SELECT CAST('1972-00-27 00:00:00' AS DATETIME) as bad_datetime").each }.to \
|
354
|
+
raise_error(Mysql2::Error, "Invalid date in field 'bad_datetime': 1972-00-27 00:00:00")
|
346
355
|
end
|
347
356
|
|
348
|
-
|
349
|
-
|
350
|
-
it "should default to the connection's encoding if Encoding.default_internal is nil" do
|
351
|
-
with_internal_encoding nil do
|
352
|
-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
353
|
-
result['enum_test'].encoding.should eql(Encoding.find('utf-8'))
|
357
|
+
context "string encoding for ENUM values" do
|
358
|
+
before { pending('Encoding is undefined') unless defined?(Encoding) }
|
354
359
|
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
360
|
+
it "should default to the connection's encoding if Encoding.default_internal is nil" do
|
361
|
+
with_internal_encoding nil do
|
362
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
363
|
+
expect(result['enum_test'].encoding).to eql(Encoding::UTF_8)
|
364
|
+
|
365
|
+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
|
366
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
367
|
+
expect(result['enum_test'].encoding).to eql(Encoding::ASCII)
|
368
|
+
client2.close
|
360
369
|
end
|
370
|
+
end
|
361
371
|
|
362
|
-
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
|
372
|
+
it "should use Encoding.default_internal" do
|
373
|
+
with_internal_encoding Encoding::UTF_8 do
|
374
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
375
|
+
expect(result['enum_test'].encoding).to eql(Encoding.default_internal)
|
376
|
+
end
|
367
377
|
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
end
|
378
|
+
with_internal_encoding Encoding::ASCII do
|
379
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
380
|
+
expect(result['enum_test'].encoding).to eql(Encoding.default_internal)
|
372
381
|
end
|
373
382
|
end
|
374
383
|
end
|
375
384
|
|
376
385
|
it "should return String for a SET value" do
|
377
|
-
@test_result['set_test'].
|
378
|
-
@test_result['set_test'].
|
386
|
+
expect(@test_result['set_test']).to be_an_instance_of(String)
|
387
|
+
expect(@test_result['set_test']).to eql('val1,val2')
|
379
388
|
end
|
380
389
|
|
381
|
-
|
382
|
-
|
383
|
-
it "should default to the connection's encoding if Encoding.default_internal is nil" do
|
384
|
-
with_internal_encoding nil do
|
385
|
-
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
386
|
-
result['set_test'].encoding.should eql(Encoding.find('utf-8'))
|
390
|
+
context "string encoding for SET values" do
|
391
|
+
before { pending('Encoding is undefined') unless defined?(Encoding) }
|
387
392
|
|
388
|
-
|
389
|
-
|
390
|
-
|
391
|
-
|
392
|
-
|
393
|
+
it "should default to the connection's encoding if Encoding.default_internal is nil" do
|
394
|
+
with_internal_encoding nil do
|
395
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
396
|
+
expect(result['set_test'].encoding).to eql(Encoding::UTF_8)
|
397
|
+
|
398
|
+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
|
399
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
400
|
+
expect(result['set_test'].encoding).to eql(Encoding::ASCII)
|
401
|
+
client2.close
|
393
402
|
end
|
403
|
+
end
|
394
404
|
|
395
|
-
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
|
405
|
+
it "should use Encoding.default_internal" do
|
406
|
+
with_internal_encoding Encoding::UTF_8 do
|
407
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
408
|
+
expect(result['set_test'].encoding).to eql(Encoding.default_internal)
|
409
|
+
end
|
400
410
|
|
401
|
-
|
402
|
-
|
403
|
-
|
404
|
-
end
|
411
|
+
with_internal_encoding Encoding::ASCII do
|
412
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
413
|
+
expect(result['set_test'].encoding).to eql(Encoding.default_internal)
|
405
414
|
end
|
406
415
|
end
|
407
416
|
end
|
408
417
|
|
409
418
|
it "should return String for a BINARY value" do
|
410
|
-
@test_result['binary_test'].
|
411
|
-
@test_result['binary_test'].
|
419
|
+
expect(@test_result['binary_test']).to be_an_instance_of(String)
|
420
|
+
expect(@test_result['binary_test']).to eql("test#{"\000" * 6}")
|
412
421
|
end
|
413
422
|
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
|
420
|
-
|
423
|
+
context "string encoding for BINARY values" do
|
424
|
+
before { pending('Encoding is undefined') unless defined?(Encoding) }
|
425
|
+
|
426
|
+
it "should default to binary if Encoding.default_internal is nil" do
|
427
|
+
with_internal_encoding nil do
|
428
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
429
|
+
expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
|
421
430
|
end
|
431
|
+
end
|
422
432
|
|
423
|
-
|
424
|
-
|
425
|
-
|
426
|
-
|
427
|
-
|
433
|
+
it "should not use Encoding.default_internal" do
|
434
|
+
with_internal_encoding Encoding::UTF_8 do
|
435
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
436
|
+
expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
|
437
|
+
end
|
428
438
|
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
end
|
439
|
+
with_internal_encoding Encoding::ASCII do
|
440
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
441
|
+
expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
|
433
442
|
end
|
434
443
|
end
|
435
444
|
end
|
@@ -445,57 +454,57 @@ describe Mysql2::Result do
|
|
445
454
|
'medium_blob_test' => 'MEDIUMBLOB',
|
446
455
|
'medium_text_test' => 'MEDIUMTEXT',
|
447
456
|
'long_blob_test' => 'LONGBLOB',
|
448
|
-
'long_text_test' => 'LONGTEXT'
|
457
|
+
'long_text_test' => 'LONGTEXT',
|
449
458
|
}.each do |field, type|
|
450
459
|
it "should return a String for #{type}" do
|
451
|
-
@test_result[field].
|
452
|
-
@test_result[field].
|
460
|
+
expect(@test_result[field]).to be_an_instance_of(String)
|
461
|
+
expect(@test_result[field]).to eql("test")
|
453
462
|
end
|
454
463
|
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
|
462
|
-
|
464
|
+
context "string encoding for #{type} values" do
|
465
|
+
before { pending('Encoding is undefined') unless defined?(Encoding) }
|
466
|
+
|
467
|
+
if %w(VARBINARY TINYBLOB BLOB MEDIUMBLOB LONGBLOB).include?(type)
|
468
|
+
it "should default to binary if Encoding.default_internal is nil" do
|
469
|
+
with_internal_encoding nil do
|
470
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
471
|
+
expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
|
463
472
|
end
|
473
|
+
end
|
464
474
|
|
465
|
-
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
475
|
+
it "should not use Encoding.default_internal" do
|
476
|
+
with_internal_encoding Encoding::UTF_8 do
|
477
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
478
|
+
expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
|
479
|
+
end
|
470
480
|
|
471
|
-
|
472
|
-
|
473
|
-
|
474
|
-
end
|
481
|
+
with_internal_encoding Encoding::ASCII do
|
482
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
483
|
+
expect(result['binary_test'].encoding).to eql(Encoding::BINARY)
|
475
484
|
end
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
485
|
+
end
|
486
|
+
else
|
487
|
+
it "should default to utf-8 if Encoding.default_internal is nil" do
|
488
|
+
with_internal_encoding nil do
|
489
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
490
|
+
expect(result[field].encoding).to eql(Encoding::UTF_8)
|
491
|
+
|
492
|
+
client2 = Mysql2::Client.new(DatabaseCredentials['root'].merge(:encoding => 'ascii'))
|
493
|
+
result = client2.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
494
|
+
expect(result[field].encoding).to eql(Encoding::ASCII)
|
495
|
+
client2.close
|
487
496
|
end
|
497
|
+
end
|
488
498
|
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
499
|
+
it "should use Encoding.default_internal" do
|
500
|
+
with_internal_encoding Encoding::UTF_8 do
|
501
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
502
|
+
expect(result[field].encoding).to eql(Encoding.default_internal)
|
503
|
+
end
|
494
504
|
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
end
|
505
|
+
with_internal_encoding Encoding::ASCII do
|
506
|
+
result = @client.query("SELECT * FROM mysql2_test ORDER BY id DESC LIMIT 1").first
|
507
|
+
expect(result[field].encoding).to eql(Encoding.default_internal)
|
499
508
|
end
|
500
509
|
end
|
501
510
|
end
|