ruby-oci8 2.2.10-x64-mingw-ucrt

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.
Files changed (78) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +14 -0
  3. data/COPYING +30 -0
  4. data/COPYING_old +64 -0
  5. data/ChangeLog +3826 -0
  6. data/Makefile +92 -0
  7. data/NEWS +1209 -0
  8. data/README.md +66 -0
  9. data/dist-files +112 -0
  10. data/docs/bind-array-to-in_cond.md +38 -0
  11. data/docs/conflicts-local-connections-and-processes.md +98 -0
  12. data/docs/hanging-after-inactivity.md +63 -0
  13. data/docs/install-binary-package.md +44 -0
  14. data/docs/install-full-client.md +111 -0
  15. data/docs/install-instant-client.md +194 -0
  16. data/docs/install-on-osx.md +46 -0
  17. data/docs/ldap-auth-and-function-interposition.md +123 -0
  18. data/docs/number-type-mapping.md +79 -0
  19. data/docs/platform-specific-issues.md +164 -0
  20. data/docs/report-installation-issue.md +50 -0
  21. data/docs/timeout-parameters.md +94 -0
  22. data/lib/.document +1 -0
  23. data/lib/dbd/OCI8.rb +591 -0
  24. data/lib/oci8/.document +8 -0
  25. data/lib/oci8/bindtype.rb +333 -0
  26. data/lib/oci8/check_load_error.rb +146 -0
  27. data/lib/oci8/compat.rb +117 -0
  28. data/lib/oci8/connection_pool.rb +179 -0
  29. data/lib/oci8/cursor.rb +605 -0
  30. data/lib/oci8/datetime.rb +605 -0
  31. data/lib/oci8/encoding-init.rb +45 -0
  32. data/lib/oci8/encoding.yml +537 -0
  33. data/lib/oci8/metadata.rb +2148 -0
  34. data/lib/oci8/object.rb +641 -0
  35. data/lib/oci8/oci8.rb +756 -0
  36. data/lib/oci8/ocihandle.rb +591 -0
  37. data/lib/oci8/oracle_version.rb +153 -0
  38. data/lib/oci8/properties.rb +196 -0
  39. data/lib/oci8/version.rb +3 -0
  40. data/lib/oci8.rb +190 -0
  41. data/lib/oci8lib_310.so +0 -0
  42. data/lib/ruby-oci8.rb +1 -0
  43. data/metaconfig +142 -0
  44. data/pre-distclean.rb +7 -0
  45. data/ruby-oci8.gemspec +85 -0
  46. data/setup.rb +1342 -0
  47. data/test/README.md +37 -0
  48. data/test/config.rb +201 -0
  49. data/test/setup_test_object.sql +199 -0
  50. data/test/setup_test_package.sql +59 -0
  51. data/test/test_all.rb +56 -0
  52. data/test/test_appinfo.rb +62 -0
  53. data/test/test_array_dml.rb +332 -0
  54. data/test/test_bind_array.rb +70 -0
  55. data/test/test_bind_boolean.rb +99 -0
  56. data/test/test_bind_integer.rb +47 -0
  57. data/test/test_bind_raw.rb +45 -0
  58. data/test/test_bind_string.rb +105 -0
  59. data/test/test_bind_time.rb +177 -0
  60. data/test/test_break.rb +125 -0
  61. data/test/test_clob.rb +85 -0
  62. data/test/test_connection_pool.rb +124 -0
  63. data/test/test_connstr.rb +220 -0
  64. data/test/test_datetime.rb +585 -0
  65. data/test/test_dbi.rb +365 -0
  66. data/test/test_dbi_clob.rb +53 -0
  67. data/test/test_encoding.rb +103 -0
  68. data/test/test_error.rb +87 -0
  69. data/test/test_metadata.rb +2674 -0
  70. data/test/test_object.rb +546 -0
  71. data/test/test_oci8.rb +624 -0
  72. data/test/test_oracle_version.rb +68 -0
  73. data/test/test_oradate.rb +255 -0
  74. data/test/test_oranumber.rb +792 -0
  75. data/test/test_package_type.rb +981 -0
  76. data/test/test_properties.rb +17 -0
  77. data/test/test_rowid.rb +32 -0
  78. metadata +123 -0
@@ -0,0 +1,332 @@
1
+ require 'oci8'
2
+ require File.dirname(__FILE__) + '/config'
3
+
4
+ class TestArrayDML < Minitest::Test
5
+ def setup
6
+ @conn = get_oci8_connection
7
+ end
8
+
9
+ def teardown
10
+ @conn.logoff
11
+ end
12
+
13
+ # test inserting arrays with different data types
14
+ # including char, varchar2, number, date and so on
15
+ def test_array_insert1
16
+ drop_table('test_table')
17
+ sql = <<-EOS
18
+ CREATE TABLE test_table
19
+ (C CHAR(10) NOT NULL,
20
+ V VARCHAR2(20),
21
+ N NUMBER(10, 2),
22
+ D DATE,
23
+ INT NUMBER(30),
24
+ BIGNUM NUMBER(30),
25
+ T TIMESTAMP)
26
+ STORAGE (
27
+ INITIAL 4k
28
+ NEXT 4k
29
+ MINEXTENTS 1
30
+ MAXEXTENTS UNLIMITED
31
+ PCTINCREASE 0)
32
+ EOS
33
+ @conn.exec(sql)
34
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:C, :V, :N, :D, :INT, :BIGNUM, :T)")
35
+ max_array_size = 3
36
+ cursor.max_array_size= max_array_size
37
+
38
+ cursor.bind_param_array(1, nil, String)
39
+ cursor.bind_param_array(2, nil ,String)
40
+ cursor.bind_param_array(3, nil, Fixnum)
41
+ cursor.bind_param_array(4, nil, OraDate)
42
+ cursor.bind_param_array(5, nil, Integer)
43
+ cursor.bind_param_array(6, nil, Bignum)
44
+ cursor.bind_param_array(7, nil, DateTime)
45
+
46
+ c_arr = Array.new
47
+ v_arr = Array.new
48
+ n_arr = Array.new
49
+ d_arr = Array.new
50
+ int_arr = Array.new
51
+ bignum_arr = Array.new
52
+ t_arr = Array.new
53
+
54
+ 1.upto(30) do |i|
55
+ c_arr << format("%10d", i * 10)
56
+ v_arr << i.to_s
57
+ n_arr << i
58
+ d_arr << OraDate.new(2000 + i, 12, 24, 23, 59, 59)
59
+ int_arr << i * 11111111111
60
+ bignum_arr << i * 10000000000
61
+ t_arr << DateTime.new(2000 + i, 12, 24, 23, 59, 59)
62
+
63
+ if i%max_array_size == 0
64
+ cursor[1] = c_arr
65
+ cursor[2] = v_arr
66
+ cursor[3] = n_arr
67
+ cursor[4] = d_arr
68
+ cursor[5] = int_arr
69
+ cursor[6] = bignum_arr
70
+ cursor[7] = t_arr
71
+
72
+ r = cursor.exec_array
73
+ assert_equal(max_array_size, r)
74
+ assert_equal(c_arr, cursor[1])
75
+ assert_equal(v_arr, cursor[2])
76
+ assert_equal(n_arr, cursor[3])
77
+ assert_equal(d_arr, cursor[4])
78
+ assert_equal(int_arr, cursor[5])
79
+ assert_equal(bignum_arr, cursor[6])
80
+ assert_equal(t_arr, cursor[7])
81
+ c_arr.clear
82
+ v_arr.clear
83
+ n_arr.clear
84
+ d_arr.clear
85
+ int_arr.clear
86
+ bignum_arr.clear
87
+ t_arr.clear
88
+ end
89
+ end
90
+ cursor.close
91
+
92
+ cursor = @conn.parse("SELECT * FROM test_table ORDER BY c")
93
+ cursor.define(5, Integer)
94
+ cursor.define(6, Bignum)
95
+ cursor.exec
96
+ assert_equal(["C","V","N","D","INT","BIGNUM","T"], cursor.get_col_names)
97
+ 1.upto(30) do |i|
98
+ rv = cursor.fetch
99
+ assert_equal(format("%10d", i * 10), rv[0])
100
+ assert_equal(i.to_s, rv[1])
101
+ assert_equal(i, rv[2])
102
+ tm = Time.local(2000 + i, 12, 24, 23, 59, 59)
103
+ assert_equal(tm, rv[3])
104
+ assert_equal(i * 11111111111, rv[4])
105
+ assert_equal(i * 10000000000, rv[5])
106
+ assert_equal(tm, rv[6])
107
+ end
108
+ assert_nil(cursor.fetch)
109
+ drop_table('test_table')
110
+ end
111
+
112
+ # Raise error when binding arrays are not the same size
113
+ def test_array_insert2
114
+ drop_table('test_table')
115
+ sql = <<-EOS
116
+ CREATE TABLE test_table
117
+ (N NUMBER(10, 2) NOT NULL,
118
+ V VARCHAR(20))
119
+ EOS
120
+ @conn.exec(sql)
121
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
122
+ max_array_size = 10
123
+ cursor.max_array_size = max_array_size
124
+ cursor.bind_param_array(1, nil, Fixnum)
125
+ cursor.bind_param_array(2, nil, String)
126
+ n_arr = Array.new
127
+ v_arr = Array.new
128
+ 1.upto(max_array_size) do |i|
129
+ n_arr << i
130
+ v_arr << i.to_s if i != max_array_size
131
+ end
132
+ cursor[1] = n_arr
133
+ assert_raises(RuntimeError) { cursor[2] = v_arr }
134
+ cursor.close
135
+
136
+ drop_table('test_table')
137
+ end
138
+
139
+ # All binds are clear from cursor after calling "max_array_size=",
140
+ # in that case, you have to re-bind the array parameters
141
+ # otherwise, an error will be raised.
142
+ def test_array_insert3
143
+ drop_table('test_table')
144
+ sql = <<-EOS
145
+ CREATE TABLE test_table
146
+ (N NUMBER(10, 2) NOT NULL,
147
+ V VARCHAR(20),
148
+ T TIMESTAMP)
149
+ EOS
150
+ @conn.exec(sql)
151
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V, :T)")
152
+ cursor.max_array_size = 3
153
+ cursor.bind_param_array(1, [1, 2, 3])
154
+ cursor.bind_param_array(2, ['happy', 'new', 'year'])
155
+ cursor.bind_param_array(3, [Time.gm(1990,1,1), Time.gm(2000,1,1), Time.gm(2010,1,1)])
156
+ cursor.exec_array
157
+ cursor.max_array_size = 2
158
+ assert_raises(RuntimeError) { cursor.exec_array }
159
+ drop_table('test_table')
160
+ end
161
+
162
+ # The size of binding arrays are not required to be same as max_array_size. The
163
+ # only requirement is that they should be the same size, and the size will be
164
+ # used as execution count for OCIStmtExecute.
165
+ def test_array_insert4
166
+ drop_table('test_table')
167
+ sql = <<-EOS
168
+ CREATE TABLE test_table
169
+ (N NUMBER(10, 2) NOT NULL,
170
+ V VARCHAR(20))
171
+ EOS
172
+ @conn.exec(sql)
173
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
174
+ max_array_size = 4
175
+ cursor.max_array_size = max_array_size
176
+ cursor.bind_param_array(1, nil, Fixnum)
177
+ cursor.bind_param_array(2, nil, String)
178
+ n_arr = Array.new
179
+ v_arr = Array.new
180
+ 1.upto( max_array_size - 1 ) do |i|
181
+ n_arr << i
182
+ v_arr << i.to_s
183
+ end
184
+ cursor[1] = n_arr
185
+ cursor[2] = v_arr
186
+ cursor.exec_array
187
+ cursor.close
188
+
189
+ cursor = @conn.parse("SELECT * FROM test_table ORDER BY N")
190
+ cursor.exec
191
+ 1.upto( max_array_size - 1 ) do |i|
192
+ rv = cursor.fetch
193
+ assert_equal(i, rv[0])
194
+ assert_equal(i.to_s, rv[1])
195
+ end
196
+ assert_nil(cursor.fetch)
197
+ cursor.close
198
+ drop_table('test_table')
199
+ end
200
+
201
+ # Inserting "nil" elements with array dml raises an error
202
+ def test_array_insert5
203
+ drop_table('test_table')
204
+ sql = <<-EOS
205
+ CREATE TABLE test_table
206
+ (N NUMBER(10, 2),
207
+ V VARCHAR(20))
208
+ EOS
209
+ @conn.exec(sql)
210
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
211
+ max_array_size = 3
212
+ cursor.max_array_size = max_array_size
213
+ cursor.bind_param_array(1, nil, Fixnum)
214
+ cursor.bind_param_array(2, nil, String)
215
+ assert_raises(RuntimeError) { cursor.exec_array }
216
+ cursor.close
217
+ drop_table('test_table')
218
+ end
219
+
220
+ # delete with array bindings
221
+ def test_array_delete
222
+ drop_table('test_table')
223
+ sql = <<-EOS
224
+ CREATE TABLE test_table
225
+ (N NUMBER(10, 2),
226
+ V VARCHAR(20))
227
+ EOS
228
+ @conn.exec(sql)
229
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
230
+ max_array_size = 10
231
+ cursor.max_array_size = max_array_size
232
+ n_arr = Array.new
233
+ v_arr = Array.new
234
+ 1.upto( max_array_size) do |i|
235
+ n_arr << i
236
+ v_arr << i.to_s
237
+ end
238
+ cursor.bind_param_array(1, nil, Fixnum)
239
+ cursor.bind_param_array(2, nil, String)
240
+ cursor[1] = n_arr
241
+ cursor[2] = v_arr
242
+ cursor.exec_array
243
+ cursor.close
244
+
245
+ cursor = @conn.parse("DELETE FROM test_table WHERE N=:1")
246
+ cursor.max_array_size = max_array_size
247
+ delete_arr = Array.new
248
+ 1.upto(max_array_size) do |i|
249
+ if i%2 == 0
250
+ delete_arr << i
251
+ end
252
+ end
253
+ cursor.bind_param_array(1, nil, Fixnum)
254
+ cursor[1] = delete_arr
255
+ cursor.exec_array
256
+ cursor.close
257
+
258
+ cursor = @conn.parse("SELECT * FROM test_table ORDER BY N")
259
+ cursor.exec
260
+ 1.upto( max_array_size ) do |i|
261
+ if i%2 != 0
262
+ rv = cursor.fetch
263
+ assert_equal(rv[0], i)
264
+ assert_equal(rv[1], i.to_s)
265
+ end
266
+ end
267
+ assert_nil(cursor.fetch)
268
+ cursor.close
269
+
270
+ drop_table('test_table')
271
+ end
272
+
273
+ # update with array bindings
274
+ def test_array_update
275
+ drop_table('test_table')
276
+ sql = <<-EOS
277
+ CREATE TABLE test_table
278
+ (N NUMBER(10, 2),
279
+ V VARCHAR(20))
280
+ EOS
281
+ @conn.exec(sql)
282
+ cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
283
+ max_array_size = 10
284
+ cursor.max_array_size = max_array_size
285
+ n_arr = Array.new
286
+ v_arr = Array.new
287
+ 1.upto( max_array_size) do |i|
288
+ n_arr << i
289
+ v_arr << i.to_s
290
+ end
291
+ cursor.bind_param_array(1, nil, Fixnum)
292
+ cursor.bind_param_array(2, nil, String)
293
+ cursor[1] = n_arr
294
+ cursor[2] = v_arr
295
+ cursor.exec_array
296
+ cursor.close
297
+
298
+ cursor = @conn.parse("UPDATE test_table SET V=:1 WHERE N=:2")
299
+ cursor.max_array_size = max_array_size
300
+ update_arr = Array.new
301
+ update_v_arr = Array.new
302
+ 1.upto(max_array_size) do |i|
303
+ if i%2 == 0
304
+ update_arr << i
305
+ update_v_arr << (i * 10).to_s
306
+ end
307
+ end
308
+ cursor.bind_param_array(1, nil, String)
309
+ cursor.bind_param_array(2, nil, Fixnum)
310
+ cursor[1] = update_v_arr
311
+ cursor[2] = update_arr
312
+ cursor.exec_array
313
+ cursor.close
314
+
315
+ cursor = @conn.parse("SELECT * FROM test_table ORDER BY N")
316
+ cursor.exec
317
+ 1.upto( max_array_size ) do |i|
318
+ rv = cursor.fetch
319
+ if i%2 != 0
320
+ assert_equal(rv[0], i)
321
+ assert_equal(rv[1], i.to_s)
322
+ else
323
+ assert_equal(rv[0], i)
324
+ assert_equal(rv[1], (i * 10).to_s)
325
+ end
326
+ end
327
+ assert_nil(cursor.fetch)
328
+
329
+ cursor.close
330
+ drop_table('test_table')
331
+ end
332
+ end
@@ -0,0 +1,70 @@
1
+ require 'oci8'
2
+ require File.dirname(__FILE__) + '/config'
3
+
4
+ class TestBindArray < Minitest::Test
5
+
6
+ def test_bind_array_names
7
+ assert_equal(":id_0", OCI8::in_cond(:id, []).names)
8
+ assert_equal(":id_0", OCI8::in_cond(:id, [1]).names)
9
+ assert_equal(":id_0, :id_1", OCI8::in_cond(:id, [1, 2]).names)
10
+ assert_equal(":id_0, :id_1, :id_2", OCI8::in_cond(:id, [1, 2, 3]).names)
11
+ end
12
+
13
+ def test_bind_array_values
14
+ assert_equal([[nil, String, nil]], OCI8::in_cond(:id, []).values)
15
+ assert_equal([[1, nil, nil]], OCI8::in_cond(:id, [1]).values)
16
+ assert_equal([[1, nil, nil], [2, nil, nil]], OCI8::in_cond(:id, [1, 2]).values)
17
+ assert_equal([[1, nil, nil], [2, nil, nil], [3, nil, nil]], OCI8::in_cond(:id, [1, 2, 3]).values)
18
+ end
19
+
20
+ def test_bind_array_values_containg_nil
21
+ assert_equal([[nil, String]], OCI8::in_cond(:id, [nil]).values)
22
+ assert_equal([[nil, Fixnum], [2, nil, nil], [3, nil, nil]], OCI8::in_cond(:id, [nil, 2, 3]).values)
23
+ assert_equal([[1, nil, nil], [nil, Fixnum], [3, nil, nil]], OCI8::in_cond(:id, [1, nil, 3]).values)
24
+ end
25
+
26
+ def test_bind_array_values_with_type
27
+ assert_equal([[nil, Integer, nil]], OCI8::in_cond(:id, [], Integer).values)
28
+ assert_equal([[1, Integer, nil]], OCI8::in_cond(:id, [1], Integer).values)
29
+ assert_equal([[1, Integer, nil], [2, Integer, nil]], OCI8::in_cond(:id, [1, 2], Integer).values)
30
+ assert_equal([[1, Integer, nil], [2, Integer, nil], [3, Integer, nil]], OCI8::in_cond(:id, [1, 2, 3], Integer).values)
31
+ assert_equal([[nil, Integer, nil], [2, Integer, nil], [3, Integer, nil]], OCI8::in_cond(:id, [nil, 2, 3], Integer).values)
32
+ assert_equal([[1, Integer, nil], [nil, Integer, nil], [3, Integer, nil]], OCI8::in_cond(:id, [1, nil, 3], Integer).values)
33
+ end
34
+
35
+ def test_select
36
+ @conn = get_oci8_connection
37
+ begin
38
+ drop_table('test_table')
39
+ @conn.exec(<<EOS)
40
+ CREATE TABLE test_table (ID NUMBER(38))
41
+ EOS
42
+ cursor = @conn.parse('insert into test_table values(:1)')
43
+ cursor.bind_param(1, nil, Integer)
44
+ [1, 3, 5].each do |id|
45
+ cursor.exec(id)
46
+ end
47
+ cursor.close
48
+
49
+ [
50
+ [],
51
+ [1],
52
+ [1, 2],
53
+ [1, 2, 3],
54
+ [nil],
55
+ [nil, 2, 3],
56
+ [1, nil, 3],
57
+ ].each do |ids|
58
+ in_cond = OCI8::in_cond(:id, ids)
59
+ cursor = @conn.exec("select * from test_table where id in (#{in_cond.names}) order by id", *in_cond.values)
60
+ ([1, 3, 5] & ids).each do |id|
61
+ assert_equal(id, cursor.fetch[0])
62
+ end
63
+ end
64
+
65
+ drop_table('test_table')
66
+ ensure
67
+ @conn.logoff
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,99 @@
1
+ # Low-level API
2
+ require 'oci8'
3
+ require File.dirname(__FILE__) + '/config'
4
+
5
+ class TestBindBoolean < Minitest::Test
6
+ def setup
7
+ @conn = get_oci8_connection()
8
+ end
9
+
10
+ def test_set_raw
11
+ stmt = <<EOS
12
+ DECLARE
13
+ bool_val boolean;
14
+ int_val pls_integer;
15
+ BEGIN
16
+ bool_val := :in;
17
+ IF bool_val THEN
18
+ int_val := 1;
19
+ ELSE
20
+ int_val := 0;
21
+ END IF;
22
+ :out := int_val;
23
+ END;
24
+ EOS
25
+ # explicit bind
26
+ cursor = @conn.parse(stmt)
27
+ cursor.bind_param(:in, nil, TrueClass)
28
+ cursor.bind_param(:out, nil, Integer)
29
+
30
+ cursor[:in] = true
31
+ cursor.exec
32
+ assert_equal(1, cursor[:out])
33
+
34
+ cursor[:in] = false
35
+ cursor.exec
36
+ assert_equal(0, cursor[:out])
37
+
38
+ # implicit bind
39
+ do_block_cnt = 0
40
+ @conn.exec(stmt, true, 0) do |in_val, out_val|
41
+ assert_equal(true, in_val)
42
+ assert_equal(1, out_val)
43
+ do_block_cnt += 1
44
+ end
45
+
46
+ @conn.exec(stmt, false, 0) do |in_val, out_val|
47
+ assert_equal(false, in_val)
48
+ assert_equal(0, out_val)
49
+ do_block_cnt += 1
50
+ end
51
+ assert_equal(2, do_block_cnt)
52
+ end
53
+
54
+ def test_get_raw
55
+ stmt = <<EOS
56
+ DECLARE
57
+ int_val pls_integer;
58
+ bool_val boolean;
59
+ BEGIN
60
+ int_val := :in;
61
+ IF int_val <> 0 THEN
62
+ bool_val := TRUE;
63
+ ELSE
64
+ bool_val := FALSE;
65
+ END IF;
66
+ :out := bool_val;
67
+ END;
68
+ EOS
69
+ cursor = @conn.parse(stmt)
70
+ cursor.bind_param(:in, nil, Integer)
71
+ cursor.bind_param(:out, nil, TrueClass)
72
+
73
+ cursor[:in] = 1
74
+ cursor.exec
75
+ assert_equal(true, cursor[:out])
76
+
77
+ cursor[:in] = 0
78
+ cursor.exec
79
+ assert_equal(false, cursor[:out])
80
+
81
+ do_block_cnt = 0
82
+ @conn.exec(stmt, 1, true) do |in_val, out_val|
83
+ assert_equal(1, in_val)
84
+ assert_equal(true, out_val)
85
+ do_block_cnt += 1
86
+ end
87
+
88
+ @conn.exec(stmt, 0, true) do |in_val, out_val|
89
+ assert_equal(0, in_val)
90
+ assert_equal(false, out_val)
91
+ do_block_cnt += 1
92
+ end
93
+ assert_equal(2, do_block_cnt)
94
+ end
95
+
96
+ def teardown
97
+ @conn.logoff
98
+ end
99
+ end
@@ -0,0 +1,47 @@
1
+ require 'oci8'
2
+ require File.dirname(__FILE__) + '/config'
3
+
4
+ class TestBindInteger < Minitest::Test
5
+
6
+ def setup
7
+ @conn = get_oci8_connection
8
+ end
9
+
10
+ POSITIVE_INTS = [
11
+ 100,
12
+ 2**30,
13
+ 2**31,
14
+ 2**32,
15
+ 2**33,
16
+ 2**62,
17
+ 2**63,
18
+ 2**64,
19
+ ('9' * 38).to_i
20
+ ]
21
+
22
+ def bind_and_get(input_value, output_type)
23
+ cursor = @conn.parse("BEGIN :out := :in; END;")
24
+ cursor.bind_param(:out, output_type)
25
+ cursor.bind_param(:in, input_value)
26
+ cursor.exec
27
+ result = cursor[:out]
28
+ cursor.close
29
+ result
30
+ end
31
+
32
+ (POSITIVE_INTS + [0] + POSITIVE_INTS.map(&:-@)).each do |num|
33
+ define_method("test_bind_param_with_input_of '#{num}'") do
34
+ assert_equal(OraNumber.new(num.to_s), bind_and_get(num, OraNumber))
35
+ end
36
+
37
+ define_method("test_bind_param_with_output_of '#{num}'") do
38
+ result = bind_and_get(OraNumber.new(num.to_s), Integer)
39
+ assert_equal(num, result)
40
+ assert_kind_of(Integer, result)
41
+ end
42
+ end
43
+
44
+ def teardown
45
+ @conn.logoff
46
+ end
47
+ end
@@ -0,0 +1,45 @@
1
+ # Low-level API
2
+ require 'oci8'
3
+ require File.dirname(__FILE__) + '/config'
4
+
5
+ class TestBindRaw < Minitest::Test
6
+ CHECK_TARGET = [
7
+ ["0123456789:;<=>?", "303132333435363738393A3B3C3D3E3F"],
8
+ ["@ABCDEFGHIJKLMNO", "404142434445464748494A4B4C4D4E4F"],
9
+ ["PQRSTUVWXYZ[\\]^_", "505152535455565758595A5B5C5D5E5F"],
10
+ ["`abcdefghijklmno", "606162636465666768696A6B6C6D6E6F"],
11
+ ["pqrstuvwxyz{|}~", "707172737475767778797A7B7C7D7E"],
12
+ ]
13
+
14
+ def setup
15
+ @conn = get_oci8_connection()
16
+ end
17
+
18
+ def test_set_raw
19
+ cursor = @conn.parse("BEGIN :hex := RAWTOHEX(:raw); END;")
20
+ cursor.bind_param(:raw, nil, OCI8::RAW, 16)
21
+ cursor.bind_param(:hex, nil, String, 32)
22
+
23
+ CHECK_TARGET.each do |raw, hex|
24
+ cursor[:raw] = raw
25
+ cursor.exec
26
+ assert_equal(hex, cursor[:hex])
27
+ end
28
+ end
29
+
30
+ def test_get_raw
31
+ cursor = @conn.parse("BEGIN :raw := HEXTORAW(:hex); END;")
32
+ cursor.bind_param(:hex, nil, String, 32)
33
+ cursor.bind_param(:raw, nil, OCI8::RAW, 16)
34
+
35
+ CHECK_TARGET.each do |raw, hex|
36
+ cursor[:hex] = hex
37
+ cursor.exec
38
+ assert_equal(raw, cursor[:raw])
39
+ end
40
+ end
41
+
42
+ def teardown
43
+ @conn.logoff
44
+ end
45
+ end
@@ -0,0 +1,105 @@
1
+ # -*- coding: utf-8 -*-
2
+ require 'oci8'
3
+ require File.dirname(__FILE__) + '/config'
4
+
5
+ class TestBindString < Minitest::Test
6
+ def setup
7
+ @conn = get_oci8_connection
8
+ end
9
+
10
+ def teardown
11
+ @conn.logoff
12
+ end
13
+
14
+ if OCI8.client_charset_name.include? 'UTF8'
15
+
16
+ def test_bind_string_as_nchar
17
+ if ['AL32UTF8', 'UTF8', 'ZHS32GB18030'].include? @conn.database_charset_name
18
+ warn "Skip test_bind_string_as_nchar. It needs Oracle server whose database chracter set is incompatible with unicode."
19
+ else
20
+ drop_table('test_table')
21
+ @conn.exec("CREATE TABLE test_table (ID NUMBER(5), V VARCHAR2(10), NV1 NVARCHAR2(10), NV2 NVARCHAR2(10))")
22
+
23
+ orig_prop = OCI8.properties[:bind_string_as_nchar]
24
+ begin
25
+ utf8_string = "a¡あ"
26
+
27
+ OCI8.properties[:bind_string_as_nchar] = false
28
+ @conn.exec("INSERT INTO test_table VALUES (1, N'#{utf8_string}', N'#{utf8_string}', :1)", utf8_string)
29
+ v, nv1, nv2 = @conn.select_one('select V, NV1, NV2 from test_table where ID = 1')
30
+ assert_not_equal(utf8_string, v) # Some UTF-8 chracters should be garbled.
31
+ assert_equal(utf8_string, nv1) # No garbled characters
32
+ assert_equal(v, nv2) # Garbled as VARCHAR2 column.
33
+
34
+ OCI8.properties[:bind_string_as_nchar] = true
35
+ @conn.exec("INSERT INTO test_table VALUES (2, N'#{utf8_string}', N'#{utf8_string}', :1)", utf8_string)
36
+ v, nv1, nv2 = @conn.select_one('select V, NV1, NV2 from test_table where ID = 2')
37
+ assert_not_equal(utf8_string, v) # Some UTF-8 chracters should be garbled.
38
+ assert_equal(utf8_string, nv1) # No garbled characters
39
+ assert_equal(nv1, nv2) # Same as NVARCHAR2.
40
+
41
+ @conn.commit
42
+ ensure
43
+ OCI8.properties[:bind_string_as_nchar] = orig_prop
44
+ end
45
+ end
46
+ end
47
+
48
+ def test_length_semantics # This test needs to be revised.
49
+ orig_prop = OCI8.properties[:length_semantics]
50
+ begin
51
+ utf8_string = "a¡あ"
52
+
53
+ OCI8.properties[:length_semantics] = :byte
54
+ assert_equal(:byte, OCI8.properties[:length_semantics])
55
+ cursor = @conn.parse <<EOS
56
+ DECLARE
57
+ TMP VARCHAR2(6);
58
+ BEGIN
59
+ TMP := :in;
60
+ :out := TMP;
61
+ END;
62
+ EOS
63
+ cursor.bind_param(:in, utf8_string)
64
+ cursor.bind_param(:out, nil, String, 5)
65
+ begin
66
+ cursor.exec
67
+ rescue OCIError
68
+ assert_equal(6502, $!.code)
69
+ end
70
+ cursor.bind_param(:out, nil, String, 6)
71
+ cursor.exec
72
+ assert_equal(utf8_string, cursor[:out])
73
+
74
+ OCI8.properties[:length_semantics] = :char
75
+ assert_equal(:char, OCI8.properties[:length_semantics])
76
+ cursor = @conn.parse <<EOS
77
+ DECLARE
78
+ TMP VARCHAR2(6);
79
+ BEGIN
80
+ TMP := :in;
81
+ :out := TMP;
82
+ END;
83
+ EOS
84
+ cursor.bind_param(:in, utf8_string, String, 3)
85
+ cursor.bind_param(:out, nil, String, 2)
86
+ begin
87
+ cursor.exec
88
+ rescue OCIError
89
+ assert_equal(6502, $!.code)
90
+ end
91
+ cursor.bind_param(:out, nil, String, 3)
92
+ cursor.exec
93
+ assert_equal(utf8_string, cursor[:out])
94
+ ensure
95
+ OCI8.properties[:length_semantics] = orig_prop
96
+ end
97
+ end
98
+
99
+ else
100
+
101
+ def test_dummy
102
+ # to suppress "No tests were specified."
103
+ end
104
+ end
105
+ end