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