jdbc-helper 0.6.0 → 0.6.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/jdbc-helper/connection/result_set_enumerator.rb +2 -3
- data/lib/jdbc-helper/connection/statement_pool.rb +4 -2
- data/lib/jdbc-helper/connection.rb +6 -1
- data/lib/jdbc-helper/sql.rb +2 -2
- data/lib/jdbc-helper/wrapper/object_wrapper.rb +1 -2
- data/test/test_connection.rb +56 -12
- data/test/test_connectors.rb +20 -3
- data/test/test_sql.rb +3 -0
- metadata +1 -1
@@ -36,7 +36,7 @@ class ResultSetEnumerator
|
|
36
36
|
case gt
|
37
37
|
when :getBigNum
|
38
38
|
v = @rset.getBigDecimal idx+=1
|
39
|
-
@rset.was_null ? nil :
|
39
|
+
@rset.was_null ? nil : v.toPlainString.to_i
|
40
40
|
when :getBigDecimal
|
41
41
|
v = @rset.getBigDecimal idx+=1
|
42
42
|
@rset.was_null ? nil : BigDecimal.new(v.toPlainString)
|
@@ -44,8 +44,7 @@ class ResultSetEnumerator
|
|
44
44
|
v = @rset.send gt, idx+=1
|
45
45
|
@rset.was_null ? nil : v
|
46
46
|
end
|
47
|
-
},
|
48
|
-
count += 1)
|
47
|
+
}, count += 1)
|
49
48
|
end
|
50
49
|
ensure
|
51
50
|
close
|
@@ -24,8 +24,10 @@ class StatementPool
|
|
24
24
|
|
25
25
|
def take
|
26
26
|
if @free.empty?
|
27
|
-
|
28
|
-
|
27
|
+
if @occupied.length >= @max_size
|
28
|
+
raise RuntimeError.new("Statement nesting level is too deep (likely a bug)")
|
29
|
+
end
|
30
|
+
|
29
31
|
@occupied << nstmt = @conn.send(:create_statement)
|
30
32
|
nstmt
|
31
33
|
else
|
@@ -162,7 +162,12 @@ class Connection
|
|
162
162
|
Java::JavaClass.for_name @driver
|
163
163
|
|
164
164
|
timeout = args.has_key?(:timeout) ? args.delete(:timeout) : Constants::DEFAULT_LOGIN_TIMEOUT
|
165
|
-
|
165
|
+
if timeout
|
166
|
+
if timeout.is_a?(Fixnum) == false || timeout <= 0
|
167
|
+
raise ArgumentError.new("Timeout must be a positive integer")
|
168
|
+
end
|
169
|
+
java.sql.DriverManager.setLoginTimeout timeout
|
170
|
+
end
|
166
171
|
|
167
172
|
props = java.util.Properties.new
|
168
173
|
(args.keys - [:url, :driver]).each do | key |
|
data/lib/jdbc-helper/sql.rb
CHANGED
@@ -19,8 +19,7 @@ class ObjectWrapper
|
|
19
19
|
# @param [String/Symbol] name Name of the object to be wrapped
|
20
20
|
def initialize(conn, name)
|
21
21
|
raise NotImplementedError.new(
|
22
|
-
"JDBCHelper::ObjectWrapper is an abstract class") if
|
23
|
-
self.instance_of? ObjectWrapper
|
22
|
+
"JDBCHelper::ObjectWrapper is an abstract class") if self.instance_of? ObjectWrapper
|
24
23
|
|
25
24
|
@connection = conn
|
26
25
|
@name = name.to_s
|
data/test/test_connection.rb
CHANGED
@@ -65,7 +65,9 @@ class TestConnection < Test::Unit::TestCase
|
|
65
65
|
conn.update "drop table #{TEST_TABLE}" rescue nil
|
66
66
|
cnt = conn.update "
|
67
67
|
create table #{TEST_TABLE} (
|
68
|
-
a timestamp
|
68
|
+
a timestamp,
|
69
|
+
b date
|
70
|
+
#{", c time" if @type == :mysql}
|
69
71
|
)"
|
70
72
|
assert_equal 0, cnt
|
71
73
|
end
|
@@ -143,6 +145,21 @@ class TestConnection < Test::Unit::TestCase
|
|
143
145
|
assert_equal 20, conn.fetch_size
|
144
146
|
|
145
147
|
# No way to confirm whether if this is really working as it's supposed to be.
|
148
|
+
|
149
|
+
conn.query('select 1 from dual') do |r1|
|
150
|
+
assert_equal 20, conn.fetch_size
|
151
|
+
conn.query('select 1 from dual') do |r2|
|
152
|
+
assert_equal 20, conn.fetch_size
|
153
|
+
conn.query('select 1 from dual') do |r3|
|
154
|
+
assert_equal 20, conn.fetch_size
|
155
|
+
conn.set_fetch_size 30
|
156
|
+
assert_equal 30, conn.fetch_size
|
157
|
+
end
|
158
|
+
assert_equal 30, conn.fetch_size
|
159
|
+
end
|
160
|
+
assert_equal 30, conn.fetch_size
|
161
|
+
end
|
162
|
+
assert_equal 30, conn.fetch_size
|
146
163
|
end
|
147
164
|
end
|
148
165
|
|
@@ -214,8 +231,8 @@ class TestConnection < Test::Unit::TestCase
|
|
214
231
|
iq = lambda do | i |
|
215
232
|
"insert into #{TEST_TABLE} values (#{i}, 'A')"
|
216
233
|
end
|
217
|
-
ins1 = conn.prepare "insert into #{TEST_TABLE} values (? + #{count},
|
218
|
-
ins2 = conn.prepare "insert into #{TEST_TABLE} values (? + #{count * 2},
|
234
|
+
ins1 = conn.prepare "insert into #{TEST_TABLE} values (? + #{count}, ?)"
|
235
|
+
ins2 = conn.prepare "insert into #{TEST_TABLE} values (? + #{count * 2}, ?)"
|
219
236
|
|
220
237
|
# update
|
221
238
|
assert_equal 1, conn.update(iq.call 0)
|
@@ -226,19 +243,21 @@ class TestConnection < Test::Unit::TestCase
|
|
226
243
|
|
227
244
|
count.times do | p |
|
228
245
|
conn.add_batch iq.call(p)
|
229
|
-
ins1.add_batch p
|
230
|
-
ins2.add_batch p
|
246
|
+
ins1.add_batch p, 'B'.to_java
|
247
|
+
ins2.add_batch p, 'C'
|
231
248
|
end
|
232
249
|
conn.execute_batch
|
233
250
|
assert_equal count * 3, conn.table(TEST_TABLE).count
|
251
|
+
assert conn.table(TEST_TABLE).where("a >= #{count}", "a < #{count * 2}").map(&:b).all? { |e| e == 'B' }
|
252
|
+
assert conn.table(TEST_TABLE).where("a >= #{count * 2}").map(&:b).all? { |e| e == 'C' }
|
234
253
|
|
235
254
|
# add_batch clear_batch
|
236
255
|
reset_test_table conn
|
237
256
|
|
238
257
|
count.times do | p |
|
239
258
|
conn.add_batch iq.call(p)
|
240
|
-
ins1.add_batch p
|
241
|
-
ins2.add_batch p
|
259
|
+
ins1.add_batch p, 'B'.to_java
|
260
|
+
ins2.add_batch p, 'C'
|
242
261
|
end
|
243
262
|
conn.clear_batch
|
244
263
|
# Already cleared, no effect
|
@@ -409,18 +428,43 @@ class TestConnection < Test::Unit::TestCase
|
|
409
428
|
end
|
410
429
|
|
411
430
|
def test_setter_timestamp
|
431
|
+
require 'date'
|
412
432
|
each_connection do | conn |
|
413
433
|
# Java timestamp
|
414
434
|
reset_test_table_ts conn
|
415
|
-
|
416
|
-
|
417
|
-
|
435
|
+
now = Time.now
|
436
|
+
lt = (now.to_f * 1000).to_i
|
437
|
+
ts = java.sql.Timestamp.new(lt)
|
438
|
+
d = java.sql.Date.new( Time.mktime(Date.today.year, Date.today.month, Date.today.day).to_i * 1000 )
|
439
|
+
t = java.sql.Time.new lt
|
440
|
+
|
441
|
+
if @type == :mysql
|
442
|
+
conn.prepare("insert into #{TEST_TABLE} (a, b, c) values (?, ?, ?)").update(ts, d, t)
|
443
|
+
# MySQL doesn't have subsecond precision
|
444
|
+
assert [lt, lt / 1000 * 1000].include?(conn.query("select a from #{TEST_TABLE}")[0][0].getTime)
|
445
|
+
# The JDBC spec states that java.sql.Dates have _no_ time component
|
446
|
+
# http://bugs.mysql.com/bug.php?id=2876
|
447
|
+
assert_equal d.getTime, conn.query("select b from #{TEST_TABLE}")[0][0].getTime
|
448
|
+
|
449
|
+
# http://stackoverflow.com/questions/907170/java-getminutes-and-gethours
|
450
|
+
t2 = conn.query("select c from #{TEST_TABLE}")[0][0]
|
451
|
+
cal = java.util.Calendar.getInstance
|
452
|
+
cal.setTime(t)
|
453
|
+
cal2 = java.util.Calendar.getInstance
|
454
|
+
cal2.setTime(t2)
|
455
|
+
assert_equal now.hour, cal2.get(java.util.Calendar::HOUR_OF_DAY)
|
456
|
+
assert_equal now.min, cal2.get(java.util.Calendar::MINUTE)
|
457
|
+
assert_equal now.sec, cal2.get(java.util.Calendar::SECOND)
|
458
|
+
assert_equal cal.get(java.util.Calendar::HOUR_OF_DAY), cal2.get(java.util.Calendar::HOUR_OF_DAY)
|
459
|
+
assert_equal cal.get(java.util.Calendar::MINUTE), cal2.get(java.util.Calendar::MINUTE)
|
460
|
+
assert_equal cal.get(java.util.Calendar::SECOND), cal2.get(java.util.Calendar::SECOND)
|
461
|
+
end
|
418
462
|
|
419
463
|
# Ruby time
|
420
464
|
reset_test_table_ts conn
|
421
465
|
ts = Time.now
|
422
|
-
conn.prepare("insert into #{TEST_TABLE} values (?)").update(ts)
|
423
|
-
got = conn.query("select
|
466
|
+
conn.prepare("insert into #{TEST_TABLE} (a) values (?)").update(ts)
|
467
|
+
got = conn.query("select a from #{TEST_TABLE}")[0][0]
|
424
468
|
assert [ts.to_i * 1000, (ts.to_f * 1000).to_i].include?(got.getTime)
|
425
469
|
end
|
426
470
|
end
|
data/test/test_connectors.rb
CHANGED
@@ -14,6 +14,20 @@ class TestConnectors < Test::Unit::TestCase
|
|
14
14
|
if conn_info['driver'] =~ /mysql/
|
15
15
|
host = conn_info['url'].match(%r{//(.*?)/})[1]
|
16
16
|
db = conn_info['url'].match(%r{/([^/?]*?)(\?.*)?$})[1]
|
17
|
+
|
18
|
+
assert_raise(ArgumentError) {
|
19
|
+
JDBCHelper::MySQLConnector.connect(host, conn_info['user'], conn_info['password'], db, 0)
|
20
|
+
}
|
21
|
+
assert_raise(ArgumentError) {
|
22
|
+
JDBCHelper::MySQLConnector.connect(host, conn_info['user'], conn_info['password'], db, -1)
|
23
|
+
}
|
24
|
+
assert_raise(ArgumentError) {
|
25
|
+
JDBCHelper::MySQLConnector.connect(host, conn_info['user'], conn_info['password'], db, "timeout")
|
26
|
+
}
|
27
|
+
assert_raise(ArgumentError) {
|
28
|
+
JDBCHelper::MySQLConnector.connect(host, conn_info['user'], conn_info['password'], db, 60, "extra")
|
29
|
+
}
|
30
|
+
|
17
31
|
conn = JDBCHelper::MySQLConnector.connect(host, conn_info['user'], conn_info['password'], db)
|
18
32
|
|
19
33
|
assert conn.closed? == false
|
@@ -32,10 +46,13 @@ class TestConnectors < Test::Unit::TestCase
|
|
32
46
|
host = conn_info['url'].match(%r{@(.*?)/})[1]
|
33
47
|
svc = conn_info['url'].match(%r{/([^/?]*?)(\?.*)?$})[1]
|
34
48
|
conn = JDBCHelper::OracleConnector.connect(host, conn_info['user'], conn_info['password'], svc)
|
49
|
+
conn2 = JDBCHelper::OracleConnector.connect_by_sid(host + ':1521', conn_info['user'], conn_info['password'], svc)
|
35
50
|
|
36
|
-
|
37
|
-
|
38
|
-
|
51
|
+
[conn, conn2].each do |c|
|
52
|
+
assert c.closed? == false
|
53
|
+
c.close
|
54
|
+
assert c.closed?
|
55
|
+
end
|
39
56
|
|
40
57
|
@conn = nil
|
41
58
|
ret = JDBCHelper::OracleConnector.connect(host, conn_info['user'], conn_info['password'], svc) do |conn|
|
data/test/test_sql.rb
CHANGED
@@ -52,6 +52,7 @@ class TestSQL < Test::Unit::TestCase
|
|
52
52
|
assert_equal "where a in ('aa', 'bb', 'cc', 4)", SQL.where(:a => %w[aa bb cc] + [4])
|
53
53
|
assert_equal "where a = 1 and b = 'A''s'", SQL.where(:a => 1, :b => "A's")
|
54
54
|
assert_equal "where (a = 1 or b = 1)", SQL.where("a = 1 or b = 1")
|
55
|
+
assert_equal "where (a = 1 or b = 1)", SQL.where(JDBCHelper::SQL("a = 1 or b = 1"))
|
55
56
|
assert_equal "where (a = 1 or b = 1) and c = 2", SQL.where("a = 1 or b = 1", :c => 2)
|
56
57
|
assert_equal "where c = 2 and (a = 1 or b = 1)", SQL.where({:c => 2}, "a = 1 or b = 1")
|
57
58
|
assert_equal "where c = 2 and (a = 1 or b = 1) and (e = 2) and f = 3",
|
@@ -61,6 +62,8 @@ class TestSQL < Test::Unit::TestCase
|
|
61
62
|
|
62
63
|
# Non-primitive datatypes not implemented (TODO?)
|
63
64
|
assert_raise(NotImplementedError) { SQL.where(:a => Time.now) }
|
65
|
+
assert_raise(NotImplementedError) { SQL.where(5) }
|
66
|
+
assert_raise(NotImplementedError) { SQL.where(Time.now) }
|
64
67
|
|
65
68
|
# Invalid SQL detection
|
66
69
|
assert_raise(ArgumentError) { SQL.where(" 'a--b' -- cde") }
|