jdbc-helper 0.7.6 → 0.7.7
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/CHANGELOG.markdown +8 -0
- data/README.markdown +48 -12
- data/Rakefile +0 -8
- data/jdbc-helper.gemspec +4 -4
- data/lib/jdbc-helper/connection.rb +46 -86
- data/lib/jdbc-helper/connection/callable_statement.rb +6 -6
- data/lib/jdbc-helper/connection/parameterized_statement.rb +8 -11
- data/lib/jdbc-helper/connection/prepared_statement.rb +11 -11
- data/lib/jdbc-helper/connection/result_set_enumerator.rb +3 -2
- data/lib/jdbc-helper/connection/row.rb +5 -0
- data/lib/jdbc-helper/connector/mssql.rb +1 -1
- data/lib/jdbc-helper/connector/mysql.rb +1 -1
- data/lib/jdbc-helper/connector/oracle.rb +2 -2
- data/lib/jdbc-helper/connector/postgresql.rb +1 -1
- data/lib/jdbc-helper/sql/expression.rb +2 -2
- data/lib/jdbc-helper/sql/sql.rb +3 -3
- data/lib/jdbc-helper/sql/sql_prepared.rb +5 -12
- data/lib/jdbc-helper/version.rb +1 -1
- data/lib/jdbc-helper/wrapper/function_wrapper.rb +1 -1
- data/lib/jdbc-helper/wrapper/procedure_wrapper.rb +7 -2
- data/lib/jdbc-helper/wrapper/table_wrapper.rb +58 -10
- data/test/helper.rb +5 -0
- data/test/test_connection.rb +36 -18
- data/test/test_object_wrapper.rb +61 -13
- metadata +23 -22
data/test/helper.rb
CHANGED
data/test/test_connection.rb
CHANGED
@@ -8,14 +8,21 @@ class TestConnection < Test::Unit::TestCase
|
|
8
8
|
|
9
9
|
def get_one_two
|
10
10
|
"
|
11
|
-
select 1
|
11
|
+
select 1 One, 'two' tWo from dual
|
12
12
|
union all
|
13
|
-
select 1
|
13
|
+
select 1 One, 'two' tWo from dual
|
14
14
|
"
|
15
15
|
end
|
16
16
|
|
17
17
|
def check_one_two(rec)
|
18
18
|
assert_equal 2, rec.length
|
19
|
+
assert_equal %w[one two], rec.labels.map(&:downcase)
|
20
|
+
assert_equal %w[one two], rec.keys.map(&:downcase)
|
21
|
+
assert_equal [1, 'two'], rec.values
|
22
|
+
|
23
|
+
assert_equal 2, rec.to_h.length
|
24
|
+
assert_equal 1, rec.to_h.insensitive[:one]
|
25
|
+
assert_equal 'two', rec.to_h.insensitive[:two]
|
19
26
|
|
20
27
|
assert_equal 1, rec.one
|
21
28
|
assert_equal 1, rec[0]
|
@@ -65,7 +72,7 @@ class TestConnection < Test::Unit::TestCase
|
|
65
72
|
end
|
66
73
|
|
67
74
|
# ---------------------------------------------------------------
|
68
|
-
|
75
|
+
|
69
76
|
def test_invalid_driver
|
70
77
|
assert_raise(NameError) {
|
71
78
|
JDBCHelper::Connection.new(:driver => 'xxx', :url => 'localhost')
|
@@ -251,7 +258,6 @@ class TestConnection < Test::Unit::TestCase
|
|
251
258
|
|
252
259
|
# update
|
253
260
|
assert_equal 1, conn.update(iq.call 0)
|
254
|
-
assert_equal 1, conn.prev_stat.success_count
|
255
261
|
|
256
262
|
# add_batch execute_batch
|
257
263
|
reset_test_table conn
|
@@ -262,6 +268,7 @@ class TestConnection < Test::Unit::TestCase
|
|
262
268
|
ins2.add_batch p, 'C'
|
263
269
|
end
|
264
270
|
conn.execute_batch
|
271
|
+
conn.execute_batch # Subsequent call has no effect
|
265
272
|
assert_equal count * 3, conn.table(TEST_TABLE).count
|
266
273
|
assert conn.table(TEST_TABLE).where("a >= #{count}", "a < #{count * 2}").map(&:b).all? { |e| e == 'B' }
|
267
274
|
assert conn.table(TEST_TABLE).where("a >= #{count * 2}").map(&:b).all? { |e| e == 'C' }
|
@@ -279,6 +286,14 @@ class TestConnection < Test::Unit::TestCase
|
|
279
286
|
ins1.execute_batch
|
280
287
|
ins2.execute_batch
|
281
288
|
assert_equal 0, conn.table(TEST_TABLE).count
|
289
|
+
|
290
|
+
# Return values
|
291
|
+
count.times do | p |
|
292
|
+
conn.update iq.call(p)
|
293
|
+
end
|
294
|
+
conn.add_batch("delete from #{TEST_TABLE} where a < 5")
|
295
|
+
conn.add_batch("delete from #{TEST_TABLE} where a < 7")
|
296
|
+
assert_equal 7, conn.execute_batch
|
282
297
|
end
|
283
298
|
end
|
284
299
|
|
@@ -290,14 +305,18 @@ class TestConnection < Test::Unit::TestCase
|
|
290
305
|
assert_equal conn.prepared_statements.first, sel
|
291
306
|
|
292
307
|
# Fetch size
|
293
|
-
if iter == 0
|
294
|
-
|
295
|
-
|
296
|
-
|
308
|
+
assert_nil conn.fetch_size if iter == 0
|
309
|
+
assert_nil sel.fetch_size if iter == 0
|
310
|
+
|
311
|
+
fsz = conn.fetch_size
|
297
312
|
conn.fetch_size = 100
|
313
|
+
assert_equal 100, conn.fetch_size
|
314
|
+
assert_equal fsz, sel.fetch_size
|
315
|
+
|
298
316
|
sel.fetch_size = 10
|
299
317
|
assert_equal 100, conn.fetch_size
|
300
318
|
assert_equal 10, sel.fetch_size
|
319
|
+
|
301
320
|
sel.set_fetch_size 20
|
302
321
|
assert_equal 100, conn.fetch_size
|
303
322
|
assert_equal 20, sel.fetch_size
|
@@ -352,7 +371,6 @@ class TestConnection < Test::Unit::TestCase
|
|
352
371
|
# update
|
353
372
|
assert ins.closed? == false
|
354
373
|
assert_equal 1, ins.update(0, 'A')
|
355
|
-
assert_equal 1, conn.prev_stat.success_count
|
356
374
|
ins.close
|
357
375
|
assert_equal 0, conn.prepared_statements.length
|
358
376
|
|
@@ -405,7 +423,7 @@ class TestConnection < Test::Unit::TestCase
|
|
405
423
|
end
|
406
424
|
end
|
407
425
|
end
|
408
|
-
|
426
|
+
|
409
427
|
def test_transaction
|
410
428
|
each_connection do | conn |
|
411
429
|
reset_test_table conn
|
@@ -482,7 +500,7 @@ class TestConnection < Test::Unit::TestCase
|
|
482
500
|
conn.prepare("insert into #{TEST_TABLE} (a) values (?)").update(ts)
|
483
501
|
got = conn.query("select a from #{TEST_TABLE}")[0][0]
|
484
502
|
arr = [
|
485
|
-
ts.to_i * 1000,
|
503
|
+
ts.to_i * 1000,
|
486
504
|
(ts.to_f * 1000).to_i,
|
487
505
|
# SQL Server seems to round up the millisecond precision
|
488
506
|
(ts.to_f * 1000).to_i / 10 * 10
|
@@ -516,7 +534,7 @@ class TestConnection < Test::Unit::TestCase
|
|
516
534
|
end)
|
517
535
|
result = cstmt_name.call(
|
518
536
|
:i1 => 'hello', :i2 => 10,
|
519
|
-
:io1 => [100, Fixnum], 'io2' => [Time.now, Time],
|
537
|
+
:io1 => [100, Fixnum], 'io2' => [Time.now, Time],
|
520
538
|
:n1 => nil,
|
521
539
|
:o1 => Float, 'o2' => String)
|
522
540
|
assert_instance_of Hash, result
|
@@ -526,7 +544,7 @@ class TestConnection < Test::Unit::TestCase
|
|
526
544
|
# Invalid parameters
|
527
545
|
#assert_raise(NativeException) { cstmt_ord.call 1 }
|
528
546
|
assert_raise(ArgumentError) { cstmt_ord.call({}, {}) }
|
529
|
-
assert_raise
|
547
|
+
assert_raise { cstmt_name.call 1 }
|
530
548
|
assert_raise(ArgumentError) { cstmt_name.call({}, {}) }
|
531
549
|
|
532
550
|
# Close
|
@@ -551,7 +569,7 @@ class TestConnection < Test::Unit::TestCase
|
|
551
569
|
result = cstmt_name.call(
|
552
570
|
#:i1 => 'hello',
|
553
571
|
:i2 => 10,
|
554
|
-
:io1 => [100, Fixnum], 'io2' => [Time.now, Time],
|
572
|
+
:io1 => [100, Fixnum], 'io2' => [Time.now, Time],
|
555
573
|
:n1 => nil,
|
556
574
|
:o1 => Float, 'o2' => String)
|
557
575
|
assert_instance_of Hash, result
|
@@ -578,12 +596,12 @@ class TestConnection < Test::Unit::TestCase
|
|
578
596
|
def test_invalid_sql
|
579
597
|
each_connection do | conn |
|
580
598
|
reset_test_table conn
|
581
|
-
assert_raise
|
599
|
+
assert_raise do
|
582
600
|
conn.query("delete from #{TEST_TABLE}")
|
583
601
|
end
|
584
602
|
omit "Oracle does not throw Exception when " +
|
585
603
|
"select statement given to executeUpdate" if conn.driver =~ /oracle/
|
586
|
-
assert_raise
|
604
|
+
assert_raise do
|
587
605
|
conn.update("select * from #{TEST_TABLE}")
|
588
606
|
end
|
589
607
|
end
|
@@ -593,7 +611,7 @@ class TestConnection < Test::Unit::TestCase
|
|
593
611
|
each_connection do | conn |
|
594
612
|
reset_test_table conn
|
595
613
|
|
596
|
-
rse_class = JDBCHelper::Connection::ResultSetEnumerator
|
614
|
+
rse_class = JDBCHelper::Connection::ResultSetEnumerator
|
597
615
|
|
598
616
|
# Connection#execute
|
599
617
|
assert_equal 1, conn.execute("insert into #{TEST_TABLE} values (0, 'A')")
|
@@ -631,7 +649,7 @@ class TestConnection < Test::Unit::TestCase
|
|
631
649
|
end
|
632
650
|
end
|
633
651
|
end
|
634
|
-
|
652
|
+
|
635
653
|
def test_statement_pool_leakage
|
636
654
|
q = "select * from #{TEST_TABLE}"
|
637
655
|
u = "update #{TEST_TABLE} set a = 1"
|
data/test/test_object_wrapper.rb
CHANGED
@@ -89,6 +89,7 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
89
89
|
# With symbol
|
90
90
|
assert_kind_of JDBCHelper::ObjectWrapper, conn.table(:some_table)
|
91
91
|
assert_instance_of JDBCHelper::TableWrapper, conn.table(:some_table)
|
92
|
+
assert_instance_of JDBCHelper::TableWrapper, conn[:some_table]
|
92
93
|
assert_kind_of JDBCHelper::ObjectWrapper, conn.function(:some_func)
|
93
94
|
assert_instance_of JDBCHelper::FunctionWrapper, conn.function(:some_func)
|
94
95
|
assert_kind_of JDBCHelper::ObjectWrapper, conn.procedure(:some_proc)
|
@@ -132,18 +133,18 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
132
133
|
}
|
133
134
|
end
|
134
135
|
|
135
|
-
def insert table, cnt = 100
|
136
|
+
def insert table, cnt = 100, offset = 1
|
136
137
|
require 'java'
|
137
138
|
|
138
139
|
params = insert_params.dup
|
139
140
|
params.delete(:num_wtf) unless @type == :oracle
|
140
141
|
|
141
|
-
|
142
|
+
cnt.times do |pk|
|
142
143
|
icnt = table.
|
143
144
|
default(:gamma => 'hello world').
|
144
145
|
default(:alpha => 200).
|
145
146
|
insert(params.merge(
|
146
|
-
:id => pk,
|
147
|
+
:id => pk + offset,
|
147
148
|
:delta => blob_data)
|
148
149
|
)
|
149
150
|
assert_equal 1, icnt unless table.batch?
|
@@ -171,7 +172,7 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
171
172
|
each_connection do |conn, conn_info|
|
172
173
|
next unless [:mysql, :oracle].include?(@type) # TODO: postgres / sqlserver
|
173
174
|
|
174
|
-
{
|
175
|
+
{
|
175
176
|
:proc => @procedure_name,
|
176
177
|
:db_proc => [conn_info['database'], @procedure_name].join('.')
|
177
178
|
}.each do |mode, prname|
|
@@ -191,7 +192,7 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
191
192
|
|
192
193
|
result = pr.call(
|
193
194
|
:io1 => [100, Fixnum],
|
194
|
-
'io2' => [Time.now, Time],
|
195
|
+
'io2' => [Time.now, Time],
|
195
196
|
:i2 => 10,
|
196
197
|
:i1 => 'hello',
|
197
198
|
:o1 => Float, 'o2' => String)
|
@@ -207,7 +208,7 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
207
208
|
pend("Not tested") do
|
208
209
|
result = pr.call(
|
209
210
|
:io1 => [100, Fixnum],
|
210
|
-
'io2' => [Time.now, Time],
|
211
|
+
'io2' => [Time.now, Time],
|
211
212
|
#:i2 => 10,
|
212
213
|
:i1 => 'hello',
|
213
214
|
:o1 => Float, 'o2' => String)
|
@@ -270,8 +271,8 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
270
271
|
table = conn.table(@table_name)
|
271
272
|
params = {
|
272
273
|
:id => 1,
|
273
|
-
:alpha => 100,
|
274
|
-
:beta => JDBCHelper::SQL('0.1 + 0.2'),
|
274
|
+
:alpha => 100,
|
275
|
+
:beta => JDBCHelper::SQL('0.1 + 0.2'),
|
275
276
|
:gamma => 'hello world' }
|
276
277
|
|
277
278
|
100.times do
|
@@ -290,7 +291,7 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
290
291
|
table = conn.table(@table_name)
|
291
292
|
params = {
|
292
293
|
:id => 1,
|
293
|
-
:beta => JDBCHelper::SQL('0.1 + 0.2'),
|
294
|
+
:beta => JDBCHelper::SQL('0.1 + 0.2'),
|
294
295
|
:gamma => 'hello world' }
|
295
296
|
|
296
297
|
100.times do |i|
|
@@ -338,7 +339,7 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
338
339
|
|
339
340
|
# Alias
|
340
341
|
cnt = 0
|
341
|
-
table.select('alpha
|
342
|
+
table.select('alpha OMega') do |row|
|
342
343
|
cnt += 1
|
343
344
|
assert_equal 100, row.omega
|
344
345
|
assert_equal ['omega'], row.labels.map(&:downcase)
|
@@ -483,7 +484,19 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
483
484
|
|
484
485
|
insert table.batch, 50
|
485
486
|
assert_equal 0, table.count
|
486
|
-
|
487
|
+
table.execute_batch :delete
|
488
|
+
assert_equal 0, table.count
|
489
|
+
table.execute_batch :update
|
490
|
+
assert_equal 0, table.count
|
491
|
+
|
492
|
+
table.batch.delete
|
493
|
+
table.execute_batch :update, :insert
|
494
|
+
assert_equal 50, table.count
|
495
|
+
table.clear_batch
|
496
|
+
|
497
|
+
insert table.batch, 50
|
498
|
+
assert_equal 50, table.count
|
499
|
+
table.clear_batch
|
487
500
|
assert_equal 50, table.count
|
488
501
|
|
489
502
|
table.batch.update(:alpha => JDBCHelper::SQL('alpha * 2'))
|
@@ -493,10 +506,29 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
493
506
|
table.delete(:id => 1..10)
|
494
507
|
assert_equal 40, table.count
|
495
508
|
|
496
|
-
# Finally
|
497
|
-
|
509
|
+
# Finally with TableWrapper#execute_batch
|
510
|
+
insert table.batch, 60, 1000
|
511
|
+
assert_equal 40, table.count
|
512
|
+
table.execute_batch :delete, :update
|
513
|
+
assert_equal 40, table.count
|
514
|
+
table.execute_batch :insert
|
515
|
+
assert_equal 100, table.count
|
498
516
|
|
499
517
|
assert_equal 200, table.select(:alpha).to_a.first.alpha.to_i
|
518
|
+
|
519
|
+
# Order of execution
|
520
|
+
table.batch.update(:alpha => JDBCHelper::SQL('alpha * 4'))
|
521
|
+
insert table.batch, 50, 2000
|
522
|
+
table.batch.delete
|
523
|
+
ret = table.execute_batch :delete, :insert, :update
|
524
|
+
omit_if(conn.driver =~ /oracle/) do
|
525
|
+
# https://forums.oracle.com/forums/thread.jspa?threadID=532945
|
526
|
+
assert_equal 100, ret[:delete]
|
527
|
+
assert_equal 50, ret[:insert]
|
528
|
+
assert_equal 50, ret[:update]
|
529
|
+
end
|
530
|
+
assert_equal 50, table.count
|
531
|
+
assert_equal 400, table.select(:alpha).to_a.first.alpha.to_i
|
500
532
|
end
|
501
533
|
end
|
502
534
|
|
@@ -685,5 +717,21 @@ class TestObjectWrapper < Test::Unit::TestCase
|
|
685
717
|
assert_equal 100, t.count
|
686
718
|
end
|
687
719
|
end
|
720
|
+
|
721
|
+
def test_fetch_size
|
722
|
+
each_connection do |conn|
|
723
|
+
create_table conn
|
724
|
+
|
725
|
+
fsz = 100
|
726
|
+
conn.fetch_size = fsz
|
727
|
+
cnt = cnt2 = 0
|
728
|
+
conn.table(@table_name).fetch_size(fsz) { |row| cnt += 1 }
|
729
|
+
conn.table(@table_name).fetch_size(fsz).each { |row| cnt2 += 1 }
|
730
|
+
assert_equal cnt, conn.table(@table_name).count
|
731
|
+
assert_equal cnt2, conn.table(@table_name).count
|
732
|
+
|
733
|
+
conn.table(@table_name).fetch_size("No").count
|
734
|
+
end
|
735
|
+
end
|
688
736
|
end
|
689
737
|
|
metadata
CHANGED
@@ -2,14 +2,14 @@
|
|
2
2
|
name: jdbc-helper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
4
|
prerelease:
|
5
|
-
version: 0.7.
|
5
|
+
version: 0.7.7
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
8
8
|
- Junegunn Choi
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2013-01-14 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: insensitive_hash
|
@@ -18,18 +18,12 @@ dependencies:
|
|
18
18
|
- - ! '>='
|
19
19
|
- !ruby/object:Gem::Version
|
20
20
|
version: 0.2.4
|
21
|
-
- - <
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.4.0
|
24
21
|
none: false
|
25
22
|
requirement: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
24
|
- - ! '>='
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: 0.2.4
|
30
|
-
- - <
|
31
|
-
- !ruby/object:Gem::Version
|
32
|
-
version: 0.4.0
|
33
27
|
none: false
|
34
28
|
prerelease: false
|
35
29
|
type: :runtime
|
@@ -37,31 +31,35 @@ dependencies:
|
|
37
31
|
name: bundler
|
38
32
|
version_requirements: !ruby/object:Gem::Requirement
|
39
33
|
requirements:
|
40
|
-
- -
|
34
|
+
- - ! '>='
|
41
35
|
- !ruby/object:Gem::Version
|
42
|
-
version:
|
36
|
+
version: !binary |-
|
37
|
+
MA==
|
43
38
|
none: false
|
44
39
|
requirement: !ruby/object:Gem::Requirement
|
45
40
|
requirements:
|
46
|
-
- -
|
41
|
+
- - ! '>='
|
47
42
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
43
|
+
version: !binary |-
|
44
|
+
MA==
|
49
45
|
none: false
|
50
46
|
prerelease: false
|
51
47
|
type: :development
|
52
48
|
- !ruby/object:Gem::Dependency
|
53
|
-
name:
|
49
|
+
name: simplecov
|
54
50
|
version_requirements: !ruby/object:Gem::Requirement
|
55
51
|
requirements:
|
56
|
-
- -
|
52
|
+
- - ! '>='
|
57
53
|
- !ruby/object:Gem::Version
|
58
|
-
version:
|
54
|
+
version: !binary |-
|
55
|
+
MA==
|
59
56
|
none: false
|
60
57
|
requirement: !ruby/object:Gem::Requirement
|
61
58
|
requirements:
|
62
|
-
- -
|
59
|
+
- - ! '>='
|
63
60
|
- !ruby/object:Gem::Version
|
64
|
-
version:
|
61
|
+
version: !binary |-
|
62
|
+
MA==
|
65
63
|
none: false
|
66
64
|
prerelease: false
|
67
65
|
type: :development
|
@@ -71,13 +69,15 @@ dependencies:
|
|
71
69
|
requirements:
|
72
70
|
- - ! '>='
|
73
71
|
- !ruby/object:Gem::Version
|
74
|
-
version:
|
72
|
+
version: !binary |-
|
73
|
+
MA==
|
75
74
|
none: false
|
76
75
|
requirement: !ruby/object:Gem::Requirement
|
77
76
|
requirements:
|
78
77
|
- - ! '>='
|
79
78
|
- !ruby/object:Gem::Version
|
80
|
-
version:
|
79
|
+
version: !binary |-
|
80
|
+
MA==
|
81
81
|
none: false
|
82
82
|
prerelease: false
|
83
83
|
type: :development
|
@@ -141,13 +141,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
141
141
|
requirements:
|
142
142
|
- - ! '>='
|
143
143
|
- !ruby/object:Gem::Version
|
144
|
-
version:
|
144
|
+
version: !binary |-
|
145
|
+
MA==
|
145
146
|
none: false
|
146
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
147
148
|
requirements:
|
148
149
|
- - ! '>='
|
149
150
|
- !ruby/object:Gem::Version
|
150
|
-
version:
|
151
|
+
version: !binary |-
|
152
|
+
MA==
|
151
153
|
none: false
|
152
154
|
requirements: []
|
153
155
|
rubyforge_project:
|
@@ -164,4 +166,3 @@ test_files:
|
|
164
166
|
- test/test_object_wrapper.rb
|
165
167
|
- test/test_sql.rb
|
166
168
|
- test/testrb
|
167
|
-
...
|