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.
@@ -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 : BigDecimal.new(v.toPlainString).to_i
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
- raise RuntimeError.new("Statement nesting level is too deep (likely a bug)") if
28
- @occupied.length >= @max_size
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
- java.sql.DriverManager.setLoginTimeout timeout if timeout
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 |
@@ -150,8 +150,8 @@ protected
150
150
 
151
151
  def self.where_unit conds
152
152
  case conds
153
- when String
154
- conds = conds.strip
153
+ when String, JDBCHelper::SQL
154
+ conds = conds.to_s.strip
155
155
  conds.empty? ? '' : "(#{conds})"
156
156
  when Hash
157
157
  conds.map { |k, v|
@@ -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
@@ -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}, 'B')"
218
- ins2 = conn.prepare "insert into #{TEST_TABLE} values (? + #{count * 2}, 'C')"
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
- ts = java.sql.Timestamp.new(Time.now.to_i * 1000)
416
- conn.prepare("insert into #{TEST_TABLE} values (?)").update(ts)
417
- assert_equal ts, conn.query("select * from #{TEST_TABLE}")[0][0]
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 * from #{TEST_TABLE}")[0][0]
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
@@ -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
- assert conn.closed? == false
37
- conn.close
38
- assert conn.closed?
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") }
metadata CHANGED
@@ -2,7 +2,7 @@
2
2
  name: jdbc-helper
3
3
  version: !ruby/object:Gem::Version
4
4
  prerelease:
5
- version: 0.6.0
5
+ version: 0.6.1
6
6
  platform: ruby
7
7
  authors:
8
8
  - Junegunn Choi