ruby-mysql 2.9.14 → 3.0.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 +5 -5
- data/CHANGELOG.md +50 -0
- data/README.md +28 -0
- data/lib/mysql/authenticator/caching_sha2_password.rb +62 -0
- data/lib/mysql/authenticator/mysql_native_password.rb +37 -0
- data/lib/mysql/authenticator/sha256_password.rb +40 -0
- data/lib/mysql/authenticator.rb +84 -0
- data/lib/mysql/charset.rb +379 -328
- data/lib/mysql/constants.rb +91 -44
- data/lib/mysql/error.rb +13 -7
- data/lib/mysql/protocol.rb +243 -210
- data/lib/mysql.rb +183 -338
- data/test/test_mysql.rb +264 -550
- metadata +18 -12
- data/README.rdoc +0 -68
data/test/test_mysql.rb
CHANGED
@@ -20,28 +20,71 @@ MYSQL_SOCKET = ENV['MYSQL_SOCKET']
|
|
20
20
|
class TestMysql < Test::Unit::TestCase
|
21
21
|
sub_test_case 'Mysql::VERSION' do
|
22
22
|
test 'returns client version' do
|
23
|
-
assert{ Mysql::VERSION ==
|
23
|
+
assert{ Mysql::VERSION == '3.0.0' }
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
-
sub_test_case 'Mysql.
|
27
|
+
sub_test_case 'Mysql.new' do
|
28
28
|
test 'returns Mysql object' do
|
29
|
-
assert{ Mysql.
|
29
|
+
assert{ Mysql.new.kind_of? Mysql }
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
sub_test_case '
|
34
|
-
test '
|
35
|
-
@m = Mysql.
|
36
|
-
assert{ @m.
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
@m
|
41
|
-
@m.
|
42
|
-
@m.
|
43
|
-
|
44
|
-
|
33
|
+
sub_test_case 'arguments' do
|
34
|
+
test 'with fixed arguments' do
|
35
|
+
@m = Mysql.new('127.0.0.1', 'hoge', 'abc&def', 'test', 3306, '/tmp/socket', 12345)
|
36
|
+
assert{ @m.host == '127.0.0.1' }
|
37
|
+
assert{ @m.username == 'hoge' }
|
38
|
+
assert{ @m.password == 'abc&def' }
|
39
|
+
assert{ @m.database == 'test' }
|
40
|
+
assert{ @m.port == 3306 }
|
41
|
+
assert{ @m.socket == '/tmp/socket' }
|
42
|
+
assert{ @m.flags == 12345 }
|
43
|
+
end
|
44
|
+
|
45
|
+
test 'with keyword arguments' do
|
46
|
+
@m = Mysql.new(host: '127.0.0.1', username: 'hoge', password: 'abc&def', database: 'test', port: 3306, socket: '/tmp/socket', flags: 12345)
|
47
|
+
assert{ @m.host == '127.0.0.1' }
|
48
|
+
assert{ @m.username == 'hoge' }
|
49
|
+
assert{ @m.password == 'abc&def' }
|
50
|
+
assert{ @m.database == 'test' }
|
51
|
+
assert{ @m.port == 3306 }
|
52
|
+
assert{ @m.socket == '/tmp/socket' }
|
53
|
+
assert{ @m.flags == 12345 }
|
54
|
+
end
|
55
|
+
|
56
|
+
test 'with URI' do
|
57
|
+
uri = URI.parse("mysql://hoge:abc%26def@127.0.0.1:3306/test?socket=/tmp/socket&flags=12345")
|
58
|
+
@m = Mysql.new(uri)
|
59
|
+
assert{ @m.host == '127.0.0.1' }
|
60
|
+
assert{ @m.username == 'hoge' }
|
61
|
+
assert{ @m.password == 'abc&def' }
|
62
|
+
assert{ @m.database == 'test' }
|
63
|
+
assert{ @m.port == 3306 }
|
64
|
+
assert{ @m.socket == '/tmp/socket' }
|
65
|
+
assert{ @m.flags == 12345 }
|
66
|
+
end
|
67
|
+
|
68
|
+
test 'with URI string' do
|
69
|
+
@m = Mysql.new("mysql://hoge:abc%26def@127.0.0.1:3306/test?socket=/tmp/socket&flags=12345")
|
70
|
+
assert{ @m.host == '127.0.0.1' }
|
71
|
+
assert{ @m.username == 'hoge' }
|
72
|
+
assert{ @m.password == 'abc&def' }
|
73
|
+
assert{ @m.database == 'test' }
|
74
|
+
assert{ @m.port == 3306 }
|
75
|
+
assert{ @m.socket == '/tmp/socket' }
|
76
|
+
assert{ @m.flags == 12345 }
|
77
|
+
end
|
78
|
+
|
79
|
+
test 'with URI string: host is filename' do
|
80
|
+
@m = Mysql.new("mysql://hoge:abc%26def@%2Ftmp%2Fsocket:3306/test?flags=12345")
|
81
|
+
assert{ @m.host == '' }
|
82
|
+
assert{ @m.username == 'hoge' }
|
83
|
+
assert{ @m.password == 'abc&def' }
|
84
|
+
assert{ @m.database == 'test' }
|
85
|
+
assert{ @m.port == 3306 }
|
86
|
+
assert{ @m.socket == '/tmp/socket' }
|
87
|
+
assert{ @m.flags == 12345 }
|
45
88
|
end
|
46
89
|
|
47
90
|
teardown do
|
@@ -55,16 +98,14 @@ class TestMysql < Test::Unit::TestCase
|
|
55
98
|
assert{ @m.kind_of? Mysql }
|
56
99
|
end
|
57
100
|
|
58
|
-
|
59
|
-
@m.
|
101
|
+
test 'flag argument affects' do
|
102
|
+
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET, Mysql::CLIENT_FOUND_ROWS)
|
103
|
+
@m.query 'create temporary table t (c int)'
|
104
|
+
@m.query 'insert into t values (123)'
|
105
|
+
@m.query 'update t set c=123'
|
106
|
+
assert{ @m.affected_rows == 1 }
|
60
107
|
end
|
61
|
-
end
|
62
108
|
|
63
|
-
sub_test_case 'Mysql.new' do
|
64
|
-
test 'connect to mysqld' do
|
65
|
-
@m = Mysql.new(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
66
|
-
assert{ @m.kind_of? Mysql }
|
67
|
-
end
|
68
109
|
teardown do
|
69
110
|
@m.close if @m
|
70
111
|
end
|
@@ -82,66 +123,43 @@ class TestMysql < Test::Unit::TestCase
|
|
82
123
|
end
|
83
124
|
end
|
84
125
|
|
85
|
-
sub_test_case 'Mysql
|
86
|
-
test '
|
87
|
-
|
88
|
-
|
89
|
-
end
|
90
|
-
|
91
|
-
sub_test_case 'Mysql.get_client_info' do
|
92
|
-
test 'returns client version as string' do
|
93
|
-
assert{ Mysql.get_client_info == '5.0.0' }
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
sub_test_case 'Mysql.client_version' do
|
98
|
-
test 'returns client version as Integer' do
|
99
|
-
assert{ Mysql.client_version == 50000 }
|
126
|
+
sub_test_case 'Mysql#connect' do
|
127
|
+
test 'connect to mysqld' do
|
128
|
+
@m = Mysql.new(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
129
|
+
assert{ @m.connect == @m }
|
100
130
|
end
|
101
|
-
end
|
102
131
|
|
103
|
-
|
104
|
-
|
105
|
-
assert{
|
132
|
+
test 'connect to mysqld by URI' do
|
133
|
+
@m = Mysql.new("mysql://#{MYSQL_USER}:#{MYSQL_PASSWORD}@#{MYSQL_SERVER}:#{MYSQL_PORT}/#{MYSQL_DATABASE}?socket=#{MYSQL_SOCKET}")
|
134
|
+
assert{ @m.connect == @m }
|
106
135
|
end
|
107
|
-
end
|
108
136
|
|
109
|
-
|
110
|
-
|
111
|
-
@m
|
112
|
-
assert{ @m.real_connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET) == @m }
|
113
|
-
end
|
114
|
-
teardown do
|
115
|
-
@m.close if @m
|
137
|
+
test 'overrides arguments of new method' do
|
138
|
+
@m = Mysql.new('example.com', 12345)
|
139
|
+
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
116
140
|
end
|
117
|
-
end
|
118
141
|
|
119
|
-
sub_test_case 'Mysql#connect' do
|
120
|
-
test 'connect to mysqld' do
|
121
|
-
@m = Mysql.init
|
122
|
-
assert{ @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET) == @m }
|
123
|
-
end
|
124
142
|
teardown do
|
125
143
|
@m.close if @m
|
126
144
|
end
|
127
145
|
end
|
128
146
|
|
129
|
-
sub_test_case '
|
147
|
+
sub_test_case 'options' do
|
130
148
|
setup do
|
131
|
-
@m = Mysql.
|
149
|
+
@m = Mysql.new
|
132
150
|
end
|
133
151
|
teardown do
|
134
152
|
@m.close
|
135
153
|
end
|
136
|
-
test '
|
137
|
-
|
154
|
+
test 'init_command: execute query when connecting' do
|
155
|
+
@m.init_command = "SET AUTOCOMMIT=0"
|
138
156
|
assert{ @m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET) == @m }
|
139
157
|
assert{ @m.query('select @@AUTOCOMMIT').fetch_row == ["0"] }
|
140
158
|
end
|
141
|
-
test '
|
142
|
-
|
143
|
-
stub(
|
144
|
-
stub(
|
159
|
+
test 'connect_timeout: set timeout for connecting' do
|
160
|
+
@m.connect_timeout = 0.1
|
161
|
+
stub(Socket).tcp{ raise Errno::ETIMEDOUT }
|
162
|
+
stub(Socket).unix{ raise Errno::ETIMEDOUT }
|
145
163
|
assert_raise Mysql::ClientError, 'connection timeout' do
|
146
164
|
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
147
165
|
end
|
@@ -149,33 +167,80 @@ class TestMysql < Test::Unit::TestCase
|
|
149
167
|
@m.connect
|
150
168
|
end
|
151
169
|
end
|
152
|
-
test '
|
170
|
+
test 'local_infile: client can execute LOAD DATA LOCAL INFILE query' do
|
171
|
+
require 'tempfile'
|
172
|
+
tmpf = Tempfile.new 'mysql_spec'
|
173
|
+
tmpf.puts "123\tabc\n"
|
174
|
+
tmpf.close
|
175
|
+
@m.local_infile = true
|
176
|
+
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
177
|
+
@m.query('create temporary table t (i int, c char(10))')
|
178
|
+
@m.query("load data local infile '#{tmpf.path}' into table t")
|
179
|
+
assert{ @m.query('select * from t').fetch_row == ['123','abc'] }
|
180
|
+
end
|
181
|
+
test 'load_data_local_dir: client can execute LOAD DATA LOCAL INFILE query with specified directory' do
|
153
182
|
require 'tempfile'
|
154
183
|
tmpf = Tempfile.new 'mysql_spec'
|
155
184
|
tmpf.puts "123\tabc\n"
|
156
185
|
tmpf.close
|
157
|
-
|
186
|
+
@m.load_data_local_dir = File.dirname(tmpf.path)
|
158
187
|
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
159
188
|
@m.query('create temporary table t (i int, c char(10))')
|
160
189
|
@m.query("load data local infile '#{tmpf.path}' into table t")
|
161
190
|
assert{ @m.query('select * from t').fetch_row == ['123','abc'] }
|
162
191
|
end
|
163
|
-
test '
|
164
|
-
|
192
|
+
test 'load_data_local_dir: client cannot execute LOAD DATA LOCAL INFILE query without specified directory' do
|
193
|
+
require 'tempfile'
|
194
|
+
tmpf = Tempfile.new 'mysql_spec'
|
195
|
+
tmpf.puts "123\tabc\n"
|
196
|
+
tmpf.close
|
197
|
+
@m.load_data_local_dir = '/hoge'
|
198
|
+
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
199
|
+
@m.query('create temporary table t (i int, c char(10))')
|
200
|
+
assert_raise Mysql::ClientError::LoadDataLocalInfileRejected, 'LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.' do
|
201
|
+
@m.query("load data local infile '#{tmpf.path}' into table t")
|
202
|
+
end
|
203
|
+
end
|
204
|
+
test 'without local_infile and load_data_local_dir: client cannot execute LOAD DATA LOCAL INFILE query' do
|
205
|
+
require 'tempfile'
|
206
|
+
tmpf = Tempfile.new 'mysql_spec'
|
207
|
+
tmpf.puts "123\tabc\n"
|
208
|
+
tmpf.close
|
209
|
+
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
210
|
+
@m.query('create temporary table t (i int, c char(10))')
|
211
|
+
if @m.server_version >= 80000
|
212
|
+
assert_raise Mysql::ServerError, 'Loading local data is disabled; this must be enabled on both the client and server sides' do
|
213
|
+
@m.query("load data local infile '#{tmpf.path}' into table t")
|
214
|
+
end
|
215
|
+
else
|
216
|
+
assert_raise Mysql::ServerError::NotAllowedCommand, 'The used command is not allowed with this MySQL version' do
|
217
|
+
@m.query("load data local infile '#{tmpf.path}' into table t")
|
218
|
+
end
|
219
|
+
end
|
220
|
+
end
|
221
|
+
test 'read_timeout: set timeout for reading packet' do
|
222
|
+
@m.read_timeout = 1
|
223
|
+
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
224
|
+
@m.query("select 123").entries
|
165
225
|
end
|
166
|
-
test '
|
167
|
-
|
226
|
+
test 'write_timeout: set timeout for writing packet' do
|
227
|
+
@m.write_timeout = 1
|
228
|
+
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
229
|
+
@m.query("select 123").entries
|
168
230
|
end
|
169
|
-
test '
|
170
|
-
|
231
|
+
test 'charset: set charset for connection' do
|
232
|
+
@m.charset = 'utf8mb3'
|
171
233
|
@m.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
172
|
-
assert
|
234
|
+
assert do
|
235
|
+
@m.query('select @@character_set_connection').fetch_row == ['utf8mb3'] ||
|
236
|
+
@m.query('select @@character_set_connection').fetch_row == ['utf8']
|
237
|
+
end
|
173
238
|
end
|
174
239
|
end
|
175
240
|
|
176
241
|
sub_test_case 'Mysql' do
|
177
242
|
setup do
|
178
|
-
@m = Mysql.
|
243
|
+
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
179
244
|
end
|
180
245
|
|
181
246
|
teardown do
|
@@ -183,22 +248,9 @@ class TestMysql < Test::Unit::TestCase
|
|
183
248
|
end
|
184
249
|
|
185
250
|
sub_test_case '#escape_string' do
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
assert{ @m.escape_string("abc'def\"ghi\0jkl%mno_表".encode('cp932')) == "abc\\'def\\\"ghi\\0jkl%mno_表".encode('cp932') }
|
190
|
-
end
|
191
|
-
else
|
192
|
-
test 'raise error if charset is multibyte' do
|
193
|
-
@m.charset = 'cp932'
|
194
|
-
assert_raise Mysql::ClientError, 'Mysql#escape_string is called for unsafe multibyte charset' do
|
195
|
-
@m.escape_string("abc'def\"ghi\0jkl%mno_\x95\\")
|
196
|
-
end
|
197
|
-
end
|
198
|
-
test 'not warn if charset is singlebyte' do
|
199
|
-
@m.charset = 'latin1'
|
200
|
-
assert{ @m.escape_string("abc'def\"ghi\0jkl%mno_\x95\\") == "abc\\'def\\\"ghi\\0jkl%mno_\x95\\\\" }
|
201
|
-
end
|
251
|
+
test 'escape special character for charset' do
|
252
|
+
@m.charset = 'cp932'
|
253
|
+
assert{ @m.escape_string("abc'def\"ghi\0jkl%mno_表".encode('cp932')) == "abc\\'def\\\"ghi\\0jkl%mno_表".encode('cp932') }
|
202
254
|
end
|
203
255
|
end
|
204
256
|
|
@@ -208,18 +260,6 @@ class TestMysql < Test::Unit::TestCase
|
|
208
260
|
end
|
209
261
|
end
|
210
262
|
|
211
|
-
sub_test_case '#client_info' do
|
212
|
-
test 'returns client version as string' do
|
213
|
-
assert{ @m.client_info == '5.0.0' }
|
214
|
-
end
|
215
|
-
end
|
216
|
-
|
217
|
-
sub_test_case '#get_client_info' do
|
218
|
-
test 'returns client version as string' do
|
219
|
-
assert{ @m.get_client_info == '5.0.0' }
|
220
|
-
end
|
221
|
-
end
|
222
|
-
|
223
263
|
sub_test_case '#affected_rows' do
|
224
264
|
test 'returns number of affected rows' do
|
225
265
|
@m.query 'create temporary table t (id int)'
|
@@ -230,8 +270,8 @@ class TestMysql < Test::Unit::TestCase
|
|
230
270
|
|
231
271
|
sub_test_case '#character_set_name' do
|
232
272
|
test 'returns charset name' do
|
233
|
-
m = Mysql.
|
234
|
-
m.
|
273
|
+
m = Mysql.new
|
274
|
+
m.charset = 'cp932'
|
235
275
|
m.connect MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET
|
236
276
|
assert{ m.character_set_name == 'cp932' }
|
237
277
|
end
|
@@ -279,28 +319,6 @@ class TestMysql < Test::Unit::TestCase
|
|
279
319
|
end
|
280
320
|
end
|
281
321
|
|
282
|
-
sub_test_case '#client_version' do
|
283
|
-
test 'returns client version as Integer' do
|
284
|
-
assert{ @m.client_version.kind_of? Integer }
|
285
|
-
end
|
286
|
-
end
|
287
|
-
|
288
|
-
sub_test_case '#get_client_version' do
|
289
|
-
test 'returns client version as Integer' do
|
290
|
-
assert{ @m.get_client_version.kind_of? Integer }
|
291
|
-
end
|
292
|
-
end
|
293
|
-
|
294
|
-
sub_test_case '#get_host_info' do
|
295
|
-
test 'returns connection type as String' do
|
296
|
-
if MYSQL_SERVER == nil or MYSQL_SERVER == 'localhost'
|
297
|
-
assert{ @m.get_host_info == 'Localhost via UNIX socket' }
|
298
|
-
else
|
299
|
-
assert{ @m.get_host_info == "#{MYSQL_SERVER} via TCP/IP" }
|
300
|
-
end
|
301
|
-
end
|
302
|
-
end
|
303
|
-
|
304
322
|
sub_test_case '#host_info' do
|
305
323
|
test 'returns connection type as String' do
|
306
324
|
if MYSQL_SERVER == nil or MYSQL_SERVER == 'localhost'
|
@@ -311,24 +329,6 @@ class TestMysql < Test::Unit::TestCase
|
|
311
329
|
end
|
312
330
|
end
|
313
331
|
|
314
|
-
sub_test_case '#get_proto_info' do
|
315
|
-
test 'returns version of connection as Integer' do
|
316
|
-
assert{ @m.get_proto_info == 10 }
|
317
|
-
end
|
318
|
-
end
|
319
|
-
|
320
|
-
sub_test_case '#proto_info' do
|
321
|
-
test 'returns version of connection as Integer' do
|
322
|
-
assert{ @m.proto_info == 10 }
|
323
|
-
end
|
324
|
-
end
|
325
|
-
|
326
|
-
sub_test_case '#get_server_info' do
|
327
|
-
test 'returns server version as String' do
|
328
|
-
assert{ @m.get_server_info =~ /\A\d+\.\d+\.\d+/ }
|
329
|
-
end
|
330
|
-
end
|
331
|
-
|
332
332
|
sub_test_case '#server_info' do
|
333
333
|
test 'returns server version as String' do
|
334
334
|
assert{ @m.server_info =~ /\A\d+\.\d+\.\d+/ }
|
@@ -356,7 +356,7 @@ class TestMysql < Test::Unit::TestCase
|
|
356
356
|
|
357
357
|
sub_test_case '#kill' do
|
358
358
|
setup do
|
359
|
-
@m2 = Mysql.
|
359
|
+
@m2 = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
360
360
|
end
|
361
361
|
teardown do
|
362
362
|
@m2.close rescue nil
|
@@ -366,61 +366,6 @@ class TestMysql < Test::Unit::TestCase
|
|
366
366
|
end
|
367
367
|
end
|
368
368
|
|
369
|
-
sub_test_case '#list_dbs' do
|
370
|
-
test 'returns database list' do
|
371
|
-
ret = @m.list_dbs
|
372
|
-
assert{ ret.kind_of? Array }
|
373
|
-
assert{ ret.include? MYSQL_DATABASE }
|
374
|
-
end
|
375
|
-
test 'with pattern returns databases that matches pattern' do
|
376
|
-
assert{ @m.list_dbs('info%').include? 'information_schema' }
|
377
|
-
end
|
378
|
-
end
|
379
|
-
|
380
|
-
sub_test_case '#list_fields' do
|
381
|
-
setup do
|
382
|
-
@m.query 'create temporary table t (i int, c char(10), d date)'
|
383
|
-
end
|
384
|
-
test 'returns result set that contains information of fields' do
|
385
|
-
ret = @m.list_fields('t')
|
386
|
-
assert{ ret.kind_of? Mysql::Result }
|
387
|
-
assert{ ret.num_rows == 0 }
|
388
|
-
assert{ ret.fetch_fields.map{|f|f.name} == ['i','c','d'] }
|
389
|
-
end
|
390
|
-
test 'with pattern returns result set that contains information of fields that matches pattern' do
|
391
|
-
ret = @m.list_fields('t', 'i')
|
392
|
-
assert{ ret.kind_of? Mysql::Result }
|
393
|
-
assert{ ret.num_rows == 0 }
|
394
|
-
ret.fetch_fields.map{|f|f.name} == ['i']
|
395
|
-
end
|
396
|
-
end
|
397
|
-
|
398
|
-
sub_test_case '#list_processes' do
|
399
|
-
test 'returns result set that contains information of all connections' do
|
400
|
-
ret = @m.list_processes
|
401
|
-
assert{ ret.kind_of? Mysql::Result }
|
402
|
-
assert{ ret.find{|r|r[0].to_i == @m.thread_id}[4] == "Processlist" }
|
403
|
-
end
|
404
|
-
end
|
405
|
-
|
406
|
-
sub_test_case '#list_tables' do
|
407
|
-
setup do
|
408
|
-
@m.query 'create table test_mysql_list_tables (id int)'
|
409
|
-
end
|
410
|
-
teardown do
|
411
|
-
@m.query 'drop table if exists test_mysql_list_tables'
|
412
|
-
end
|
413
|
-
test 'returns table list' do
|
414
|
-
ret = @m.list_tables
|
415
|
-
assert{ ret.kind_of? Array }
|
416
|
-
assert{ ret.include? 'test_mysql_list_tables' }
|
417
|
-
end
|
418
|
-
test 'with pattern returns lists that matches pattern' do
|
419
|
-
ret = @m.list_tables '%mysql\_list\_t%'
|
420
|
-
assert{ ret.include? 'test_mysql_list_tables' }
|
421
|
-
end
|
422
|
-
end
|
423
|
-
|
424
369
|
sub_test_case '#ping' do
|
425
370
|
test 'returns self' do
|
426
371
|
assert{ @m.ping == @m }
|
@@ -434,17 +379,8 @@ class TestMysql < Test::Unit::TestCase
|
|
434
379
|
test 'returns nil if query returns no results' do
|
435
380
|
assert{ @m.query('set @hoge:=123') == nil }
|
436
381
|
end
|
437
|
-
test 'returns self if
|
438
|
-
@m.
|
439
|
-
assert{ @m.query('select 123') == @m }
|
440
|
-
@m.store_result
|
441
|
-
assert{ @m.query('set @hoge:=123') == @m }
|
442
|
-
end
|
443
|
-
end
|
444
|
-
|
445
|
-
sub_test_case '#real_query' do
|
446
|
-
test 'is same as #query' do
|
447
|
-
assert{ @m.real_query('select 123').kind_of? Mysql::Result }
|
382
|
+
test 'returns self if block is specified' do
|
383
|
+
assert{ @m.query('select 123'){} == @m }
|
448
384
|
end
|
449
385
|
end
|
450
386
|
|
@@ -476,60 +412,12 @@ class TestMysql < Test::Unit::TestCase
|
|
476
412
|
end
|
477
413
|
end
|
478
414
|
|
479
|
-
sub_test_case '#store_result' do
|
480
|
-
test 'returns Mysql::Result' do
|
481
|
-
@m.query_with_result = false
|
482
|
-
@m.query 'select 1,2,3'
|
483
|
-
ret = @m.store_result
|
484
|
-
assert{ ret.kind_of? Mysql::Result }
|
485
|
-
assert{ ret.fetch_row == ['1','2','3'] }
|
486
|
-
end
|
487
|
-
test 'raises error when no query' do
|
488
|
-
assert_raise Mysql::ClientError, 'invalid usage' do
|
489
|
-
@m.store_result
|
490
|
-
end
|
491
|
-
end
|
492
|
-
test 'raises error when query does not return results' do
|
493
|
-
@m.query 'set @hoge:=123'
|
494
|
-
assert_raise Mysql::ClientError, 'invalid usage' do
|
495
|
-
@m.store_result
|
496
|
-
end
|
497
|
-
end
|
498
|
-
end
|
499
|
-
|
500
415
|
sub_test_case '#thread_id' do
|
501
416
|
test 'returns thread id as Integer' do
|
502
417
|
assert{ @m.thread_id.kind_of? Integer }
|
503
418
|
end
|
504
419
|
end
|
505
420
|
|
506
|
-
sub_test_case '#use_result' do
|
507
|
-
test 'returns Mysql::Result' do
|
508
|
-
@m.query_with_result = false
|
509
|
-
@m.query 'select 1,2,3'
|
510
|
-
ret = @m.use_result
|
511
|
-
assert{ ret.kind_of? Mysql::Result }
|
512
|
-
assert{ ret.fetch_row == ['1','2','3'] }
|
513
|
-
end
|
514
|
-
test 'raises error when no query' do
|
515
|
-
assert_raise Mysql::ClientError, 'invalid usage' do
|
516
|
-
@m.use_result
|
517
|
-
end
|
518
|
-
end
|
519
|
-
test 'raises error when query does not return results' do
|
520
|
-
@m.query 'set @hoge:=123'
|
521
|
-
assert_raise Mysql::ClientError, 'invalid usage' do
|
522
|
-
@m.use_result
|
523
|
-
end
|
524
|
-
end
|
525
|
-
end
|
526
|
-
|
527
|
-
sub_test_case '#get_server_version' do
|
528
|
-
test 'returns server version as Integer' do
|
529
|
-
assert{ @m.get_server_version.kind_of? Integer }
|
530
|
-
end
|
531
|
-
end
|
532
|
-
|
533
421
|
sub_test_case '#server_version' do
|
534
422
|
test 'returns server version as Integer' do
|
535
423
|
assert{ @m.server_version.kind_of? Integer }
|
@@ -594,27 +482,6 @@ class TestMysql < Test::Unit::TestCase
|
|
594
482
|
end
|
595
483
|
end
|
596
484
|
|
597
|
-
sub_test_case '#query_with_result' do
|
598
|
-
test 'default value is true' do
|
599
|
-
assert{ @m.query_with_result == true }
|
600
|
-
end
|
601
|
-
test 'can set value' do
|
602
|
-
assert{ (@m.query_with_result=true) == true }
|
603
|
-
assert{ @m.query_with_result == true }
|
604
|
-
assert{ (@m.query_with_result=false) == false }
|
605
|
-
assert{ @m.query_with_result == false }
|
606
|
-
end
|
607
|
-
end
|
608
|
-
|
609
|
-
sub_test_case '#query_with_result is false' do
|
610
|
-
test 'Mysql#query returns self and Mysql#store_result returns result set' do
|
611
|
-
@m.query_with_result = false
|
612
|
-
assert{ @m.query('select 1,2,3') == @m }
|
613
|
-
res = @m.store_result
|
614
|
-
assert{ res.fetch_row == ['1','2','3'] }
|
615
|
-
end
|
616
|
-
end
|
617
|
-
|
618
485
|
sub_test_case '#query with block' do
|
619
486
|
test 'returns self' do
|
620
487
|
assert{ @m.query('select 1'){} == @m }
|
@@ -647,7 +514,7 @@ class TestMysql < Test::Unit::TestCase
|
|
647
514
|
|
648
515
|
sub_test_case 'multiple statement query:' do
|
649
516
|
setup do
|
650
|
-
@m = Mysql.
|
517
|
+
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
651
518
|
@m.set_server_option(Mysql::OPTION_MULTI_STATEMENTS_ON)
|
652
519
|
@res = @m.query 'select 1,2; select 3,4,5'
|
653
520
|
end
|
@@ -685,7 +552,7 @@ class TestMysql < Test::Unit::TestCase
|
|
685
552
|
|
686
553
|
sub_test_case 'Mysql::Result' do
|
687
554
|
setup do
|
688
|
-
@m = Mysql.
|
555
|
+
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
689
556
|
@m.charset = 'latin1'
|
690
557
|
@m.query 'create temporary table t (id int default 0, str char(10), primary key (id))'
|
691
558
|
@m.query "insert into t values (1,'abc'),(2,'defg'),(3,'hi'),(4,null)"
|
@@ -841,7 +708,7 @@ class TestMysql < Test::Unit::TestCase
|
|
841
708
|
|
842
709
|
sub_test_case 'Mysql::Field' do
|
843
710
|
setup do
|
844
|
-
@m = Mysql.
|
711
|
+
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
845
712
|
@m.charset = 'latin1'
|
846
713
|
@m.query 'create temporary table t (id int default 0, str char(10), primary key (id))'
|
847
714
|
@m.query "insert into t values (1,'abc'),(2,'defg'),(3,'hi'),(4,null)"
|
@@ -864,10 +731,6 @@ class TestMysql < Test::Unit::TestCase
|
|
864
731
|
assert{ @res.fetch_field.def == nil }
|
865
732
|
end
|
866
733
|
|
867
|
-
test '#def for field information is default value' do
|
868
|
-
assert{ @m.list_fields('t').fetch_field.def == '0' }
|
869
|
-
end
|
870
|
-
|
871
734
|
test '#type is type of field as Integer' do
|
872
735
|
assert{ @res.fetch_field.type == Mysql::Field::TYPE_LONG }
|
873
736
|
assert{ @res.fetch_field.type == Mysql::Field::TYPE_STRING }
|
@@ -892,8 +755,8 @@ class TestMysql < Test::Unit::TestCase
|
|
892
755
|
assert{ @m.query('select 1.23').fetch_field.decimals == 2 }
|
893
756
|
end
|
894
757
|
|
895
|
-
test '#
|
896
|
-
assert{ @res.fetch_field.
|
758
|
+
test '#to_hash return field as hash' do
|
759
|
+
assert{ @res.fetch_field.to_hash == {
|
897
760
|
'name' => 'id',
|
898
761
|
'table' => 't',
|
899
762
|
'def' => nil,
|
@@ -904,7 +767,7 @@ class TestMysql < Test::Unit::TestCase
|
|
904
767
|
'decimals' => 0,
|
905
768
|
}
|
906
769
|
}
|
907
|
-
assert{ @res.fetch_field.
|
770
|
+
assert{ @res.fetch_field.to_hash == {
|
908
771
|
'name' => 'str',
|
909
772
|
'table' => 't',
|
910
773
|
'def' => nil,
|
@@ -940,15 +803,15 @@ class TestMysql < Test::Unit::TestCase
|
|
940
803
|
|
941
804
|
sub_test_case 'create Mysql::Stmt object:' do
|
942
805
|
setup do
|
943
|
-
@m = Mysql.
|
806
|
+
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
944
807
|
end
|
945
808
|
|
946
809
|
teardown do
|
947
810
|
@m.close if @m
|
948
811
|
end
|
949
812
|
|
950
|
-
test 'Mysql#
|
951
|
-
assert{ @m.
|
813
|
+
test 'Mysql#stmt returns Mysql::Stmt object' do
|
814
|
+
assert{ @m.stmt.kind_of? Mysql::Stmt }
|
952
815
|
end
|
953
816
|
|
954
817
|
test 'Mysq;#prepare returns Mysql::Stmt object' do
|
@@ -958,9 +821,9 @@ class TestMysql < Test::Unit::TestCase
|
|
958
821
|
|
959
822
|
sub_test_case 'Mysql::Stmt' do
|
960
823
|
setup do
|
961
|
-
@m = Mysql.
|
824
|
+
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
962
825
|
@m.query("set sql_mode=''")
|
963
|
-
@s = @m.
|
826
|
+
@s = @m.stmt
|
964
827
|
end
|
965
828
|
|
966
829
|
teardown do
|
@@ -980,68 +843,6 @@ class TestMysql < Test::Unit::TestCase
|
|
980
843
|
assert{ @s.affected_rows == 3 }
|
981
844
|
end
|
982
845
|
|
983
|
-
sub_test_case '#bind_result' do
|
984
|
-
setup do
|
985
|
-
@m.query 'create temporary table t (i int, c char(10), d double, t datetime)'
|
986
|
-
@m.query 'insert into t values (123,"9abcdefg",1.2345,20091208100446)'
|
987
|
-
@s.prepare 'select * from t'
|
988
|
-
end
|
989
|
-
|
990
|
-
test '(nil) make result format to be standard value' do
|
991
|
-
@s.bind_result nil, nil, nil, nil
|
992
|
-
@s.execute
|
993
|
-
assert{ @s.fetch == [123, '9abcdefg', 1.2345, Mysql::Time.new(2009,12,8,10,4,46)] }
|
994
|
-
end
|
995
|
-
|
996
|
-
test '(Numeric) make result format to be Integer value' do
|
997
|
-
@s.bind_result Numeric, Numeric, Numeric, Numeric
|
998
|
-
@s.execute
|
999
|
-
assert{ @s.fetch == [123, 9, 1, 20091208100446] }
|
1000
|
-
end
|
1001
|
-
|
1002
|
-
test '(Integer) make result format to be Integer value' do
|
1003
|
-
@s.bind_result Integer, Integer, Integer, Integer
|
1004
|
-
@s.execute
|
1005
|
-
assert{ @s.fetch == [123, 9, 1, 20091208100446] }
|
1006
|
-
end
|
1007
|
-
|
1008
|
-
test '(Fixnum) make result format to be Integer value' do
|
1009
|
-
@s.bind_result Fixnum, Fixnum, Fixnum, Fixnum
|
1010
|
-
@s.execute
|
1011
|
-
assert{ @s.fetch == [123, 9, 1, 20091208100446] }
|
1012
|
-
end
|
1013
|
-
|
1014
|
-
test '(String) make result format to be String value' do
|
1015
|
-
@s.bind_result String, String, String, String
|
1016
|
-
@s.execute
|
1017
|
-
assert{ @s.fetch == ["123", "9abcdefg", "1.2345", "2009-12-08 10:04:46"] }
|
1018
|
-
end
|
1019
|
-
|
1020
|
-
test '(Float) make result format to be Float value' do
|
1021
|
-
@s.bind_result Float, Float, Float, Float
|
1022
|
-
@s.execute
|
1023
|
-
assert{ @s.fetch == [123.0, 9.0, 1.2345 , 20091208100446.0] }
|
1024
|
-
end
|
1025
|
-
|
1026
|
-
test '(Mysql::Time) make result format to be Mysql::Time value' do
|
1027
|
-
@s.bind_result Mysql::Time, Mysql::Time, Mysql::Time, Mysql::Time
|
1028
|
-
@s.execute
|
1029
|
-
assert{ @s.fetch == [Mysql::Time.new(2000,1,23), Mysql::Time.new, Mysql::Time.new, Mysql::Time.new(2009,12,8,10,4,46)] }
|
1030
|
-
end
|
1031
|
-
|
1032
|
-
test '(invalid) raises error' do
|
1033
|
-
assert_raise TypeError do
|
1034
|
-
@s.bind_result(Time, nil, nil, nil)
|
1035
|
-
end
|
1036
|
-
end
|
1037
|
-
|
1038
|
-
test 'with mismatch argument count raise error' do
|
1039
|
-
assert_raise Mysql::ClientError, 'bind_result: result value count(4) != number of argument(1)' do
|
1040
|
-
@s.bind_result(nil)
|
1041
|
-
end
|
1042
|
-
end
|
1043
|
-
end
|
1044
|
-
|
1045
846
|
test '#close returns nil' do
|
1046
847
|
assert{ @s.close == nil }
|
1047
848
|
end
|
@@ -1066,8 +867,8 @@ class TestMysql < Test::Unit::TestCase
|
|
1066
867
|
@s.prepare 'select * from t'
|
1067
868
|
@s.execute
|
1068
869
|
expect = [
|
1069
|
-
[1, 'abc',
|
1070
|
-
[2, 'def',
|
870
|
+
[1, 'abc', Time.new(1970,12,24,23,59,05)],
|
871
|
+
[2, 'def', Time.new(2112,9,3,12,34,56)],
|
1071
872
|
[3, '123', nil],
|
1072
873
|
]
|
1073
874
|
@s.each do |a|
|
@@ -1213,20 +1014,16 @@ class TestMysql < Test::Unit::TestCase
|
|
1213
1014
|
@m.query 'insert into t values (0),(-1),(127),(-128),(255),(-255),(256)'
|
1214
1015
|
@s.prepare 'select i from t'
|
1215
1016
|
@s.execute
|
1216
|
-
|
1217
|
-
|
1218
|
-
|
1219
|
-
|
1220
|
-
|
1221
|
-
|
1222
|
-
|
1223
|
-
|
1224
|
-
|
1225
|
-
|
1226
|
-
}
|
1227
|
-
else
|
1228
|
-
assert{ @s.entries == [["\x00"], ["\xff"], ["\x7f"], ["\xff"], ["\xff"], ["\xff"], ["\xff"]] }
|
1229
|
-
end
|
1017
|
+
assert{ @s.entries == [
|
1018
|
+
["\x00".force_encoding('ASCII-8BIT')],
|
1019
|
+
["\xff".force_encoding('ASCII-8BIT')],
|
1020
|
+
["\x7f".force_encoding('ASCII-8BIT')],
|
1021
|
+
["\xff".force_encoding('ASCII-8BIT')],
|
1022
|
+
["\xff".force_encoding('ASCII-8BIT')],
|
1023
|
+
["\xff".force_encoding('ASCII-8BIT')],
|
1024
|
+
["\xff".force_encoding('ASCII-8BIT')],
|
1025
|
+
]
|
1026
|
+
}
|
1230
1027
|
end
|
1231
1028
|
|
1232
1029
|
test '#fetch bit column (64bit)' do
|
@@ -1234,25 +1031,14 @@ class TestMysql < Test::Unit::TestCase
|
|
1234
1031
|
@m.query 'insert into t values (0),(-1),(4294967296),(18446744073709551615),(18446744073709551616)'
|
1235
1032
|
@s.prepare 'select i from t'
|
1236
1033
|
@s.execute
|
1237
|
-
|
1238
|
-
|
1239
|
-
|
1240
|
-
|
1241
|
-
|
1242
|
-
|
1243
|
-
|
1244
|
-
|
1245
|
-
}
|
1246
|
-
else
|
1247
|
-
assert{ @s.entries == [
|
1248
|
-
["\x00\x00\x00\x00\x00\x00\x00\x00"],
|
1249
|
-
["\xff\xff\xff\xff\xff\xff\xff\xff"],
|
1250
|
-
["\x00\x00\x00\x01\x00\x00\x00\x00"],
|
1251
|
-
["\xff\xff\xff\xff\xff\xff\xff\xff"],
|
1252
|
-
["\xff\xff\xff\xff\xff\xff\xff\xff"],
|
1253
|
-
]
|
1254
|
-
}
|
1255
|
-
end
|
1034
|
+
assert{ @s.entries == [
|
1035
|
+
["\x00\x00\x00\x00\x00\x00\x00\x00".force_encoding('ASCII-8BIT')],
|
1036
|
+
["\xff\xff\xff\xff\xff\xff\xff\xff".force_encoding('ASCII-8BIT')],
|
1037
|
+
["\x00\x00\x00\x01\x00\x00\x00\x00".force_encoding('ASCII-8BIT')],
|
1038
|
+
["\xff\xff\xff\xff\xff\xff\xff\xff".force_encoding('ASCII-8BIT')],
|
1039
|
+
["\xff\xff\xff\xff\xff\xff\xff\xff".force_encoding('ASCII-8BIT')],
|
1040
|
+
]
|
1041
|
+
}
|
1256
1042
|
end
|
1257
1043
|
|
1258
1044
|
test '#fetch tinyint column' do
|
@@ -1405,14 +1191,11 @@ class TestMysql < Test::Unit::TestCase
|
|
1405
1191
|
@s.prepare 'select i from t'
|
1406
1192
|
@s.execute
|
1407
1193
|
cols = @s.fetch
|
1408
|
-
assert{ cols == [
|
1409
|
-
assert{ cols.first.to_s == '0000-00-00' }
|
1194
|
+
assert{ cols == [nil] }
|
1410
1195
|
cols = @s.fetch
|
1411
|
-
assert{ cols == [
|
1412
|
-
assert{ cols.first.to_s == '1000-01-01' }
|
1196
|
+
assert{ cols == [Time.new(1000,1,1)] }
|
1413
1197
|
cols = @s.fetch
|
1414
|
-
assert{ cols == [
|
1415
|
-
assert{ cols.first.to_s == '9999-12-31' }
|
1198
|
+
assert{ cols == [Time.new(9999,12,31)] }
|
1416
1199
|
end
|
1417
1200
|
|
1418
1201
|
test '#fetch datetime column' do
|
@@ -1420,9 +1203,9 @@ class TestMysql < Test::Unit::TestCase
|
|
1420
1203
|
@m.query "insert into t values ('0000-00-00 00:00:00'),('1000-01-01 00:00:00'),('9999-12-31 23:59:59')"
|
1421
1204
|
@s.prepare 'select i from t'
|
1422
1205
|
@s.execute
|
1423
|
-
assert{ @s.fetch == [
|
1424
|
-
assert{ @s.fetch == [
|
1425
|
-
assert{ @s.fetch == [
|
1206
|
+
assert{ @s.fetch == [nil] }
|
1207
|
+
assert{ @s.fetch == [Time.new(1000,1,1)] }
|
1208
|
+
assert{ @s.fetch == [Time.new(9999,12,31,23,59,59)] }
|
1426
1209
|
end
|
1427
1210
|
|
1428
1211
|
test '#fetch timestamp column' do
|
@@ -1430,8 +1213,8 @@ class TestMysql < Test::Unit::TestCase
|
|
1430
1213
|
@m.query("insert into t values ('1970-01-02 00:00:00'),('2037-12-30 23:59:59')")
|
1431
1214
|
@s.prepare 'select i from t'
|
1432
1215
|
@s.execute
|
1433
|
-
assert{ @s.fetch == [
|
1434
|
-
assert{ @s.fetch == [
|
1216
|
+
assert{ @s.fetch == [Time.new(1970,1,2)] }
|
1217
|
+
assert{ @s.fetch == [Time.new(2037,12,30,23,59,59)] }
|
1435
1218
|
end
|
1436
1219
|
|
1437
1220
|
test '#fetch time column' do
|
@@ -1439,9 +1222,9 @@ class TestMysql < Test::Unit::TestCase
|
|
1439
1222
|
@m.query "insert into t values ('-838:59:59'),(0),('838:59:59')"
|
1440
1223
|
@s.prepare 'select i from t'
|
1441
1224
|
@s.execute
|
1442
|
-
assert{ @s.fetch == [
|
1443
|
-
assert{ @s.fetch == [
|
1444
|
-
assert{ @s.fetch == [
|
1225
|
+
assert{ @s.fetch == [-(838*3600+59*60+59)] }
|
1226
|
+
assert{ @s.fetch == [0] }
|
1227
|
+
assert{ @s.fetch == [838*3600+59*60+59] }
|
1445
1228
|
end
|
1446
1229
|
|
1447
1230
|
test '#fetch year column' do
|
@@ -1666,79 +1449,6 @@ class TestMysql < Test::Unit::TestCase
|
|
1666
1449
|
end
|
1667
1450
|
end
|
1668
1451
|
|
1669
|
-
sub_test_case 'Mysql::Time' do
|
1670
|
-
setup do
|
1671
|
-
@t = Mysql::Time.new
|
1672
|
-
end
|
1673
|
-
|
1674
|
-
test '.new with no arguments returns 0' do
|
1675
|
-
assert{ @t.year == 0 }
|
1676
|
-
assert{ @t.month == 0 }
|
1677
|
-
assert{ @t.day == 0 }
|
1678
|
-
assert{ @t.hour == 0 }
|
1679
|
-
assert{ @t.minute == 0 }
|
1680
|
-
assert{ @t.second == 0 }
|
1681
|
-
assert{ @t.neg == false }
|
1682
|
-
assert{ @t.second_part == 0 }
|
1683
|
-
end
|
1684
|
-
|
1685
|
-
test '#inspect' do
|
1686
|
-
assert{ Mysql::Time.new(2009,12,8,23,35,21).inspect == '#<Mysql::Time:2009-12-08 23:35:21>' }
|
1687
|
-
end
|
1688
|
-
|
1689
|
-
test '#to_s' do
|
1690
|
-
assert{ Mysql::Time.new(2009,12,8,23,35,21).to_s == '2009-12-08 23:35:21' }
|
1691
|
-
end
|
1692
|
-
|
1693
|
-
test '#to_i' do
|
1694
|
-
assert{ Mysql::Time.new(2009,12,8,23,35,21).to_i == 20091208233521 }
|
1695
|
-
end
|
1696
|
-
|
1697
|
-
test '#year' do
|
1698
|
-
assert{ (@t.year = 2009) == 2009 }
|
1699
|
-
assert{ @t.year == 2009 }
|
1700
|
-
end
|
1701
|
-
|
1702
|
-
test '#month' do
|
1703
|
-
assert{ (@t.month = 12) == 12 }
|
1704
|
-
assert{ @t.month == 12 }
|
1705
|
-
end
|
1706
|
-
|
1707
|
-
test '#day' do
|
1708
|
-
assert{ (@t.day = 8) == 8 }
|
1709
|
-
assert{ @t.day == 8 }
|
1710
|
-
end
|
1711
|
-
|
1712
|
-
test '#hour' do
|
1713
|
-
assert{ (@t.hour = 23) == 23 }
|
1714
|
-
assert{ @t.hour == 23 }
|
1715
|
-
end
|
1716
|
-
|
1717
|
-
test '#minute' do
|
1718
|
-
assert{ (@t.minute = 35) == 35 }
|
1719
|
-
assert{ @t.minute == 35 }
|
1720
|
-
end
|
1721
|
-
|
1722
|
-
test '#second' do
|
1723
|
-
assert{ (@t.second = 21) == 21 }
|
1724
|
-
assert{ @t.second == 21 }
|
1725
|
-
end
|
1726
|
-
|
1727
|
-
test '#neg' do
|
1728
|
-
assert{ @t.neg == false }
|
1729
|
-
end
|
1730
|
-
|
1731
|
-
test '#second_part' do
|
1732
|
-
assert{ @t.second_part == 0 }
|
1733
|
-
end
|
1734
|
-
|
1735
|
-
test '#==' do
|
1736
|
-
t1 = Mysql::Time.new 2009,12,8,23,35,21
|
1737
|
-
t2 = Mysql::Time.new 2009,12,8,23,35,21
|
1738
|
-
assert{ t1 == t2 }
|
1739
|
-
end
|
1740
|
-
end
|
1741
|
-
|
1742
1452
|
sub_test_case 'Mysql::Error' do
|
1743
1453
|
setup do
|
1744
1454
|
m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
@@ -1761,90 +1471,94 @@ class TestMysql < Test::Unit::TestCase
|
|
1761
1471
|
end
|
1762
1472
|
end
|
1763
1473
|
|
1764
|
-
|
1765
|
-
|
1474
|
+
sub_test_case 'Connection charset is UTF-8:' do
|
1475
|
+
setup do
|
1476
|
+
@m = Mysql.connect(MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD, MYSQL_DATABASE, MYSQL_PORT, MYSQL_SOCKET)
|
1477
|
+
@m.charset = "utf8"
|
1478
|
+
@m.query "create temporary table t (utf8 char(10) charset utf8, cp932 char(10) charset cp932, eucjp char(10) charset eucjpms, bin varbinary(10))"
|
1479
|
+
@utf8 = "いろは"
|
1480
|
+
@cp932 = @utf8.encode "CP932"
|
1481
|
+
@eucjp = @utf8.encode "EUC-JP-MS"
|
1482
|
+
@bin = "\x00\x01\x7F\x80\xFE\xFF".force_encoding("ASCII-8BIT")
|
1483
|
+
@default_internal = Encoding.default_internal
|
1484
|
+
end
|
1485
|
+
|
1486
|
+
teardown do
|
1487
|
+
v = $VERBOSE
|
1488
|
+
$VERBOSE = false
|
1489
|
+
Encoding.default_internal = @default_internal
|
1490
|
+
$VERBOSE = v
|
1491
|
+
end
|
1492
|
+
|
1493
|
+
sub_test_case 'default_internal is CP932' do
|
1766
1494
|
setup do
|
1767
|
-
@m
|
1768
|
-
|
1769
|
-
|
1770
|
-
|
1771
|
-
|
1772
|
-
@eucjp = @utf8.encode "EUC-JP-MS"
|
1773
|
-
@bin = "\x00\x01\x7F\x80\xFE\xFF".force_encoding("ASCII-8BIT")
|
1774
|
-
@default_internal = Encoding.default_internal
|
1495
|
+
@m.prepare("insert into t (utf8,cp932,eucjp,bin) values (?,?,?,?)").execute @utf8, @cp932, @eucjp, @bin
|
1496
|
+
v = $VERBOSE
|
1497
|
+
$VERBOSE = false
|
1498
|
+
Encoding.default_internal = 'CP932'
|
1499
|
+
$VERBOSE = v
|
1775
1500
|
end
|
1776
|
-
|
1777
|
-
|
1778
|
-
Encoding.default_internal = @default_internal
|
1501
|
+
test 'is converted to CP932' do
|
1502
|
+
assert @m.query('select "あいう"').fetch == ["\x82\xA0\x82\xA2\x82\xA4".force_encoding("CP932")]
|
1779
1503
|
end
|
1780
|
-
|
1781
|
-
|
1782
|
-
|
1783
|
-
|
1784
|
-
|
1785
|
-
|
1786
|
-
|
1787
|
-
|
1788
|
-
end
|
1789
|
-
test 'data is stored as is' do
|
1790
|
-
assert @m.query('select hex(utf8),hex(cp932),hex(eucjp),hex(bin) from t').fetch == ['E38184E3828DE381AF', '82A282EB82CD', 'A4A4A4EDA4CF', '00017F80FEFF']
|
1791
|
-
end
|
1792
|
-
test 'By simple query, charset of retrieved data is connection charset' do
|
1793
|
-
assert @m.query('select utf8,cp932,eucjp,bin from t').fetch == [@cp932, @cp932, @cp932, @bin]
|
1794
|
-
end
|
1795
|
-
test 'By prepared statement, charset of retrieved data is connection charset except for binary' do
|
1796
|
-
assert @m.prepare('select utf8,cp932,eucjp,bin from t').execute.fetch == [@cp932, @cp932, @cp932, @bin]
|
1797
|
-
end
|
1504
|
+
test 'data is stored as is' do
|
1505
|
+
assert @m.query('select hex(utf8),hex(cp932),hex(eucjp),hex(bin) from t').fetch == ['E38184E3828DE381AF', '82A282EB82CD', 'A4A4A4EDA4CF', '00017F80FEFF']
|
1506
|
+
end
|
1507
|
+
test 'By simple query, charset of retrieved data is connection charset' do
|
1508
|
+
assert @m.query('select utf8,cp932,eucjp,bin from t').fetch == [@cp932, @cp932, @cp932, @bin]
|
1509
|
+
end
|
1510
|
+
test 'By prepared statement, charset of retrieved data is connection charset except for binary' do
|
1511
|
+
assert @m.prepare('select utf8,cp932,eucjp,bin from t').execute.fetch == [@cp932, @cp932, @cp932, @bin]
|
1798
1512
|
end
|
1513
|
+
end
|
1799
1514
|
|
1800
|
-
|
1801
|
-
|
1802
|
-
|
1803
|
-
end
|
1515
|
+
sub_test_case 'query with CP932 encoding' do
|
1516
|
+
test 'is converted to UTF-8' do
|
1517
|
+
assert @m.query('select HEX("あいう")'.encode("CP932")).fetch == ["E38182E38184E38186"]
|
1804
1518
|
end
|
1519
|
+
end
|
1805
1520
|
|
1806
|
-
|
1807
|
-
|
1808
|
-
|
1809
|
-
end
|
1521
|
+
sub_test_case 'prepared statement with CP932 encoding' do
|
1522
|
+
test 'is converted to UTF-8' do
|
1523
|
+
assert @m.prepare('select HEX("あいう")'.encode("CP932")).execute.fetch == ["E38182E38184E38186"]
|
1810
1524
|
end
|
1525
|
+
end
|
1811
1526
|
|
1812
|
-
|
1813
|
-
|
1814
|
-
|
1815
|
-
|
1816
|
-
|
1817
|
-
|
1818
|
-
end
|
1819
|
-
test 'By simple query, charset of retrieved data is connection charset' do
|
1820
|
-
assert{ @m.query('select utf8,cp932,eucjp,bin from t').fetch == [@utf8, @utf8, @utf8, @bin] }
|
1821
|
-
end
|
1822
|
-
test 'By prepared statement, charset of retrieved data is connection charset except for binary' do
|
1823
|
-
assert{ @m.prepare('select utf8,cp932,eucjp,bin from t').execute.fetch == [@utf8, @utf8, @utf8, @bin] }
|
1824
|
-
end
|
1527
|
+
sub_test_case 'The encoding of data are correspond to charset of column:' do
|
1528
|
+
setup do
|
1529
|
+
@m.prepare("insert into t (utf8,cp932,eucjp,bin) values (?,?,?,?)").execute @utf8, @cp932, @eucjp, @bin
|
1530
|
+
end
|
1531
|
+
test 'data is stored as is' do
|
1532
|
+
assert{ @m.query('select hex(utf8),hex(cp932),hex(eucjp),hex(bin) from t').fetch == ['E38184E3828DE381AF', '82A282EB82CD', 'A4A4A4EDA4CF', '00017F80FEFF'] }
|
1825
1533
|
end
|
1534
|
+
test 'By simple query, charset of retrieved data is connection charset' do
|
1535
|
+
assert{ @m.query('select utf8,cp932,eucjp,bin from t').fetch == [@utf8, @utf8, @utf8, @bin] }
|
1536
|
+
end
|
1537
|
+
test 'By prepared statement, charset of retrieved data is connection charset except for binary' do
|
1538
|
+
assert{ @m.prepare('select utf8,cp932,eucjp,bin from t').execute.fetch == [@utf8, @utf8, @utf8, @bin] }
|
1539
|
+
end
|
1540
|
+
end
|
1826
1541
|
|
1827
|
-
|
1828
|
-
|
1829
|
-
|
1830
|
-
end
|
1831
|
-
test 'stored data is converted' do
|
1832
|
-
assert{ @m.query("select hex(utf8),hex(cp932),hex(eucjp),hex(bin) from t").fetch == ["E38184E3828DE381AF", "82A282EB82CD", "A4A4A4EDA4CF", "E38184E3828DE381AF"] }
|
1833
|
-
end
|
1834
|
-
test 'By simple query, charset of retrieved data is connection charset' do
|
1835
|
-
assert{ @m.query("select utf8,cp932,eucjp,bin from t").fetch == [@utf8, @utf8, @utf8, @utf8.dup.force_encoding('ASCII-8BIT')] }
|
1836
|
-
end
|
1837
|
-
test 'By prepared statement, charset of retrieved data is connection charset except for binary' do
|
1838
|
-
assert{ @m.prepare("select utf8,cp932,eucjp,bin from t").execute.fetch == [@utf8, @utf8, @utf8, @utf8.dup.force_encoding("ASCII-8BIT")] }
|
1839
|
-
end
|
1542
|
+
sub_test_case 'The encoding of data are different from charset of column:' do
|
1543
|
+
setup do
|
1544
|
+
@m.prepare("insert into t (utf8,cp932,eucjp,bin) values (?,?,?,?)").execute @utf8, @utf8, @utf8, @utf8
|
1840
1545
|
end
|
1546
|
+
test 'stored data is converted' do
|
1547
|
+
assert{ @m.query("select hex(utf8),hex(cp932),hex(eucjp),hex(bin) from t").fetch == ["E38184E3828DE381AF", "82A282EB82CD", "A4A4A4EDA4CF", "E38184E3828DE381AF"] }
|
1548
|
+
end
|
1549
|
+
test 'By simple query, charset of retrieved data is connection charset' do
|
1550
|
+
assert{ @m.query("select utf8,cp932,eucjp,bin from t").fetch == [@utf8, @utf8, @utf8, @utf8.dup.force_encoding('ASCII-8BIT')] }
|
1551
|
+
end
|
1552
|
+
test 'By prepared statement, charset of retrieved data is connection charset except for binary' do
|
1553
|
+
assert{ @m.prepare("select utf8,cp932,eucjp,bin from t").execute.fetch == [@utf8, @utf8, @utf8, @utf8.dup.force_encoding("ASCII-8BIT")] }
|
1554
|
+
end
|
1555
|
+
end
|
1841
1556
|
|
1842
|
-
|
1843
|
-
|
1844
|
-
|
1845
|
-
|
1846
|
-
|
1847
|
-
end
|
1557
|
+
sub_test_case 'The data include invalid byte code:' do
|
1558
|
+
test 'raises Encoding::InvalidByteSequenceError' do
|
1559
|
+
cp932 = "\x01\xFF\x80".force_encoding("CP932")
|
1560
|
+
assert_raise Encoding::InvalidByteSequenceError do
|
1561
|
+
@m.prepare("insert into t (cp932) values (?)").execute cp932
|
1848
1562
|
end
|
1849
1563
|
end
|
1850
1564
|
end
|