jdbc-helper 0.6.0 → 0.6.1

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.
@@ -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