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