ruby-oci8 2.1.8 → 2.2.0.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.
@@ -1,6 +1,6 @@
1
1
  # oci8.rb -- OCI8
2
2
  #
3
- # Copyright (C) 2002-2013 Kubo Takehiro <kubo@jiubao.org>
3
+ # Copyright (C) 2002-2015 Kubo Takehiro <kubo@jiubao.org>
4
4
  #
5
5
  # Original Copyright is:
6
6
  # Oracle module for Ruby
@@ -140,10 +140,12 @@ class OCI8
140
140
  @session_handle.send(:attr_set_string, OCI_ATTR_USERNAME, username) if username
141
141
  @session_handle.send(:attr_set_string, OCI_ATTR_PASSWORD, password) if password
142
142
  if @@oracle_client_version >= ORAVER_11_1
143
- # 'rubyoci8' is displayed in V$SESSION_CONNECT_INFO.CLIENT_DRIVER
143
+ # Sets the driver name displayed in V$SESSION_CONNECT_INFO.CLIENT_DRIVER
144
144
  # if both the client and the server are Oracle 11g or upper.
145
+ # Only the first 8 chracters "ruby-oci" are displayed when the Oracle
146
+ # server version is lower than 12.0.1.2.
145
147
  # 424: OCI_ATTR_DRIVER_NAME
146
- @session_handle.send(:attr_set_string, 424, 'rubyoci8')
148
+ @session_handle.send(:attr_set_string, 424, "ruby-oci8 : #{OCI8::VERSION}")
147
149
  end
148
150
  server_attach(dbname, attach_mode)
149
151
  session_begin(cred ? cred : OCI_CRED_RDBMS, mode ? mode : OCI_DEFAULT)
@@ -157,7 +159,7 @@ class OCI8
157
159
  attr_set_ub4(176, stmt_cache_size) # 176: OCI_ATTR_STMTCACHESIZE
158
160
  end
159
161
 
160
- @prefetch_rows = nil
162
+ @prefetch_rows = 100
161
163
  @username = nil
162
164
  end
163
165
 
@@ -329,12 +331,12 @@ class OCI8
329
331
  end
330
332
  end
331
333
 
332
- # Sets the prefetch rows size. The default value is one.
334
+ # Sets the prefetch rows size. The default value is 100.
333
335
  # When a select statement is executed, the OCI library allocate
334
336
  # prefetch buffer to reduce the number of network round trips by
335
337
  # retrieving specified number of rows in one round trip.
336
338
  #
337
- # Note: Active record adaptors set 100 by default.
339
+ # Note: The default value had been 1 before ruby-oci8 2.2.0.
338
340
  def prefetch_rows=(num)
339
341
  @prefetch_rows = num
340
342
  end
@@ -531,19 +533,16 @@ class OraDate
531
533
  Date.new(year, month, day)
532
534
  end
533
535
 
534
- if defined? DateTime # ruby 1.8.0 or upper
535
-
536
- # timezone offset of the time the command started
537
- # @private
538
- @@tz_offset = Time.now.utc_offset.to_r/86400
536
+ # timezone offset of the time the command started
537
+ # @private
538
+ @@tz_offset = Time.now.utc_offset.to_r/86400
539
539
 
540
- # Returns a DateTime object which denotes self.
541
- #
542
- # Note that this is not daylight saving time aware.
543
- # The Time zone offset is that of the time the command started.
544
- def to_datetime
545
- DateTime.new(year, month, day, hour, minute, second, @@tz_offset)
546
- end
540
+ # Returns a DateTime object which denotes self.
541
+ #
542
+ # Note that this is not daylight saving time aware.
543
+ # The Time zone offset is that of the time the command started.
544
+ def to_datetime
545
+ DateTime.new(year, month, day, hour, minute, second, @@tz_offset)
547
546
  end
548
547
 
549
548
  # @private
@@ -15,10 +15,6 @@ class OCI8
15
15
  :cancel_read_at_exit => false,
16
16
  }
17
17
 
18
- if OCI8.oracle_client_version < OCI8::ORAVER_9_2
19
- @@properties[:statement_cache_size] = nil
20
- end
21
-
22
18
  # @private
23
19
  def @@properties.[](name)
24
20
  raise IndexError, "No such property name: #{name}" unless @@properties.has_key?(name)
@@ -45,9 +41,6 @@ class OCI8
45
41
  raise ArgumentError, "float_conversion_type's value should be either :ruby or :oracle."
46
42
  end
47
43
  when :statement_cache_size
48
- if OCI8.oracle_client_version < OCI8::ORAVER_9_2
49
- raise RuntimeError, ":statement_cache_size is disabled on Oracle 9iR1 client."
50
- end
51
44
  val = val.to_i
52
45
  raise ArgumentError, "The property value for :statement_cache_size must not be negative." if val < 0
53
46
  when :events_mode
@@ -101,7 +94,7 @@ class OCI8
101
94
  # From ruby 1.9.2, a float value converted from Oracle number 15.7 by
102
95
  # the Oracle function OCINumberToReal() makes a string representation
103
96
  # 15.700000000000001 by Float#to_s.
104
- # See: http://rubyforge.org/forum/forum.php?thread_id=50030&forum_id=1078
97
+ # See: https://web.archive.org/web/20140521195004/https://rubyforge.org/forum/forum.php?thread_id=50030&forum_id=1078
105
98
  #
106
99
  # *Since:* 2.1.0
107
100
  #
@@ -109,7 +102,6 @@ class OCI8
109
102
  #
110
103
  # The statement cache size per each session. The default size is 0, which
111
104
  # means no statement cache, since 2.1.2. It was 20 in 2.1.1.
112
- # This feature is available on Oracle 9iR2 or later.
113
105
  # See: http://docs.oracle.com/cd/E11882_01/appdev.112/e10646/oci09adv.htm#i471377
114
106
  #
115
107
  # *Since:* 2.1.1
@@ -0,0 +1,3 @@
1
+ class OCI8
2
+ VERSION = "2.2.0.1"
3
+ end
@@ -14,15 +14,25 @@ else
14
14
  gem_platform = Gem::Platform::RUBY
15
15
  end
16
16
 
17
+ if defined? OCI8
18
+ oci8_version = OCI8::VERSION
19
+ else
20
+ # Load oci8/version.rb temporarily and delete OCI8.
21
+ # Some 'bundler' tasks load this file before 'require "oci8"'
22
+ # and fail with 'TypeError: superclass mismatch for class OCI8.'
23
+ Kernel.load File.dirname(__FILE__) + '/lib/oci8/version.rb'
24
+ oci8_version = OCI8::VERSION
25
+ Object.send(:remove_const, :OCI8)
26
+ end
27
+
17
28
  spec = Gem::Specification.new do |s|
18
29
  s.name = 'ruby-oci8'
19
- s.version = File.read('VERSION').strip
30
+ s.version = oci8_version
20
31
  s.summary = 'Ruby interface for Oracle using OCI8 API'
21
32
  s.email = 'kubo@jiubao.org'
22
- s.homepage = 'https://github.com/kubo/ruby-oci8/'
23
- s.rubyforge_project = 'ruby-oci8'
33
+ s.homepage = 'http://www.rubydoc.info/github/kubo/ruby-oci8'
24
34
  s.description = <<EOS
25
- ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8i, Oracle9i, Oracle10g, Oracle11g and Oracle Instant Client.
35
+ ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle 10g or later including Oracle Instant Client.
26
36
  EOS
27
37
  s.has_rdoc = 'yard'
28
38
  s.authors = ['Kubo Takehiro']
@@ -31,7 +41,7 @@ EOS
31
41
  files = File.read('dist-files').split("\n")
32
42
  if gem_platform == Gem::Platform::RUBY
33
43
  s.extensions << 'ext/oci8/extconf.rb'
34
- s.required_ruby_version = '>= 1.8.0'
44
+ s.required_ruby_version = '>= 1.9.1'
35
45
  else
36
46
  so_files = Dir.glob('ext/oci8/oci8lib_*.so')
37
47
  so_vers = so_files.collect do |file|
@@ -481,8 +481,20 @@ EOS
481
481
  def test_client_driver_name
482
482
  if OCI8.oracle_client_version >= OCI8::ORAVER_11_1 and @conn.oracle_server_version >= OCI8::ORAVER_11_1
483
483
  sid = @conn.select_one("select userenv('sid') from dual")[0].to_i
484
- driver_name = @conn.select_one('select client_driver from v$session_connect_info where sid = :1', sid)[0]
485
- assert_equal('rubyoci8', driver_name)
484
+ cursor = @conn.parse('select client_driver from v$session_connect_info where sid = :1')
485
+ cursor.exec(sid)
486
+ column_size = cursor.column_metadata[0].data_size
487
+ expected_value = case column_size
488
+ when 30 # Oracle version >= 12.1.0.2
489
+ "ruby-oci8 : #{OCI8::VERSION}"
490
+ when 9 # Oracle version < 12.1.0.2
491
+ 'ruby-oci' # only the first 8 characters
492
+ else
493
+ raise "Unknown column size #{column_size}"
494
+ end
495
+ driver_name = cursor.fetch[0]
496
+ cursor.close
497
+ assert_equal(expected_value, driver_name)
486
498
  end
487
499
  end
488
500
  end # TestOCI8
@@ -0,0 +1,967 @@
1
+ require 'oci8'
2
+ require File.dirname(__FILE__) + '/config'
3
+
4
+ if $oracle_version < OCI8::ORAVER_12_1
5
+ raise "Package types are not supported in this Oracle version."
6
+ end
7
+
8
+ conn = OCI8.new($dbuser, $dbpass, $dbname)
9
+ test_package_version = nil
10
+ begin
11
+ cursor = conn.parse('begin :1 := rb_test_pkg.package_version; end;')
12
+ cursor.bind_param(1, nil, Integer)
13
+ cursor.exec
14
+ test_package_version = cursor[1]
15
+ cursor.close
16
+ rescue OCIError
17
+ raise if $!.code != 6550
18
+ end
19
+ raise <<EOS if test_package_version != 1
20
+ You need to execute SQL statements in #{File.dirname(__FILE__)}/setup_test_package.sql as follows:
21
+
22
+ $ sqlplus USERNAME/PASSWORD
23
+ SQL> @test/setup_test_package.sql
24
+
25
+ EOS
26
+
27
+ class TestPackageType < Minitest::Test
28
+ def setup
29
+ @conn = get_oci8_connection
30
+ end
31
+
32
+ def teardown
33
+ @conn.logoff
34
+ end
35
+
36
+ def check_attributes(msg, obj, attrs)
37
+ attrs.each do |method, expected_value|
38
+ val = method.is_a?(Array) ? obj[method[0]] : obj.send(method)
39
+ if expected_value.is_a? Hash
40
+ check_attributes("#{msg} > #{method}", val, expected_value)
41
+ else
42
+ assert_equal(expected_value, val, "#{msg} > #{method}")
43
+ end
44
+ end
45
+ end
46
+
47
+ def test_describe_package
48
+ integer_type_attrs = {
49
+ :class => OCI8::Metadata::Type,
50
+ #:typecode => nil,
51
+ #:collection_typecode => nil,
52
+ :is_incomplete_type? => false,
53
+ :is_system_type? => true,
54
+ :is_predefined_type? => true,
55
+ :is_transient_type? => false,
56
+ :is_system_generated_type? => false,
57
+ :has_nested_table? => false,
58
+ :has_lob? => false,
59
+ :has_file? => false,
60
+ #:collection_element => nil,
61
+ :num_type_attrs => 0,
62
+ :num_type_methods => 0,
63
+ #:map_method => nil,
64
+ #:order_method => nil,
65
+ :is_invoker_rights? => false,
66
+ :name => 'INTEGER',
67
+ :schema_name => 'SYS',
68
+ :is_final_type? => true,
69
+ :is_instantiable_type? => true,
70
+ :is_subtype? => false,
71
+ :supertype_schema_name => nil,
72
+ :supertype_name => nil,
73
+ :package_name => nil,
74
+ :type_attrs => [],
75
+ #:type_methods => [],
76
+ :inspect => '#<OCI8::Metadata::Type:(0) SYS.INTEGER>', # TODO: change to "INTEGER"
77
+ }
78
+
79
+ pls_integer_type_attrs = {
80
+ :class => OCI8::Metadata::Type,
81
+ #:typecode => nil,
82
+ #:collection_typecode => nil,
83
+ :is_incomplete_type? => false,
84
+ :is_system_type? => true,
85
+ :is_predefined_type? => true,
86
+ :is_transient_type? => false,
87
+ :is_system_generated_type? => false,
88
+ :has_nested_table? => false,
89
+ :has_lob? => false,
90
+ :has_file? => false,
91
+ #:collection_element => nil,
92
+ :num_type_attrs => 0,
93
+ :num_type_methods => 0,
94
+ #:map_method => nil,
95
+ #:order_method => nil,
96
+ :is_invoker_rights? => false,
97
+ :name => 'PL/SQL PLS INTEGER',
98
+ :schema_name => 'SYS',
99
+ :is_final_type? => true,
100
+ :is_instantiable_type? => true,
101
+ :is_subtype? => false,
102
+ :supertype_schema_name => nil,
103
+ :supertype_name => nil,
104
+ :package_name => nil,
105
+ :type_attrs => [],
106
+ #:type_methods => [],
107
+ :inspect => '#<OCI8::Metadata::Type:(0) SYS.PL/SQL PLS INTEGER>', # TODO: change to "PLS_INTEGER"
108
+ }
109
+
110
+ boolean_type_attrs = {
111
+ :class => OCI8::Metadata::Type,
112
+ #:typecode => nil,
113
+ #:collection_typecode => nil,
114
+ :is_incomplete_type? => false,
115
+ :is_system_type? => true,
116
+ :is_predefined_type? => true,
117
+ :is_transient_type? => false,
118
+ :is_system_generated_type? => false,
119
+ :has_nested_table? => false,
120
+ :has_lob? => false,
121
+ :has_file? => false,
122
+ #:collection_element => nil,
123
+ :num_type_attrs => 0,
124
+ :num_type_methods => 0,
125
+ #:map_method => nil,
126
+ #:order_method => nil,
127
+ :is_invoker_rights? => false,
128
+ :name => 'PL/SQL BOOLEAN',
129
+ :schema_name => 'SYS',
130
+ :is_final_type? => true,
131
+ :is_instantiable_type? => true,
132
+ :is_subtype? => false,
133
+ :supertype_schema_name => nil,
134
+ :supertype_name => nil,
135
+ :package_name => nil,
136
+ :type_attrs => [],
137
+ #:type_methods => [],
138
+ :inspect => '#<OCI8::Metadata::Type:(0) SYS.PL/SQL BOOLEAN>', # TODO: change to "BOOLEAN"
139
+ }
140
+
141
+ varchar2_type_attrs = {
142
+ :class => OCI8::Metadata::Type,
143
+ #:typecode => nil,
144
+ #:collection_typecode => nil,
145
+ :is_incomplete_type? => false,
146
+ :is_system_type? => true,
147
+ :is_predefined_type? => true,
148
+ :is_transient_type? => false,
149
+ :is_system_generated_type? => false,
150
+ :has_nested_table? => false,
151
+ :has_lob? => false,
152
+ :has_file? => false,
153
+ #:collection_element => nil,
154
+ :num_type_attrs => 0,
155
+ :num_type_methods => 0,
156
+ #:map_method => nil,
157
+ #:order_method => nil,
158
+ :is_invoker_rights? => false,
159
+ :name => 'VARCHAR2',
160
+ :schema_name => 'SYS',
161
+ :is_final_type? => true,
162
+ :is_instantiable_type? => true,
163
+ :is_subtype? => false,
164
+ :supertype_schema_name => nil,
165
+ :supertype_name => nil,
166
+ :package_name => nil,
167
+ :type_attrs => [],
168
+ #:type_methods => #[],
169
+ :inspect => '#<OCI8::Metadata::Type:(0) SYS.VARCHAR2>', # TODO: change to "VARCHAR2"
170
+ }
171
+
172
+ array_of_integer_type_attrs = {
173
+ :class => OCI8::Metadata::Type,
174
+ :typecode => :named_collection,
175
+ :collection_typecode => :varray,
176
+ :is_incomplete_type? => false,
177
+ :is_system_type? => false,
178
+ :is_predefined_type? => false,
179
+ :is_transient_type? => false,
180
+ :is_system_generated_type? => false,
181
+ :has_nested_table? => false,
182
+ :has_lob? => false,
183
+ :has_file? => false,
184
+ :collection_element => {
185
+ :class => OCI8::Metadata::Collection,
186
+ :data_size => 22,
187
+ :typecode => :integer,
188
+ :data_type => :number,
189
+ :num_elems => 50,
190
+ :precision => 38,
191
+ :scale => 0,
192
+ :type_name => 'INTEGER',
193
+ :schema_name => 'SYS',
194
+ :type_metadata => integer_type_attrs,
195
+ :inspect => '#<OCI8::Metadata::Collection: NUMBER(38)>', # TODO: change to "INTEGER"
196
+ },
197
+ :num_type_attrs => 0,
198
+ :num_type_methods => 0,
199
+ :map_method => nil,
200
+ :order_method => nil,
201
+ :is_invoker_rights? => false,
202
+ :name => 'ARRAY_OF_INTEGER',
203
+ :schema_name => @conn.username,
204
+ :is_final_type? => true,
205
+ :is_instantiable_type? => true,
206
+ :is_subtype? => false,
207
+ :supertype_schema_name => nil,
208
+ :supertype_name => nil,
209
+ :package_name => 'RB_TEST_PKG',
210
+ :type_attrs => [],
211
+ :type_methods => [],
212
+ :inspect => "#<OCI8::Metadata::Type:(0) #{@conn.username}.ARRAY_OF_INTEGER>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.ARRAY_OF_INTEGER"
213
+ }
214
+
215
+ table_of_pls_integer_type_attrs = {
216
+ :class => OCI8::Metadata::Type,
217
+ :typecode => :named_collection,
218
+ :collection_typecode => :table,
219
+ :is_incomplete_type? => false,
220
+ :is_system_type? => false,
221
+ :is_predefined_type? => false,
222
+ :is_transient_type? => false,
223
+ :is_system_generated_type? => false,
224
+ :has_nested_table? => true,
225
+ :has_lob? => false,
226
+ :has_file? => false,
227
+ :collection_element => {
228
+ :class => OCI8::Metadata::Collection,
229
+ :data_size => 0,
230
+ :typecode => :pls_integer,
231
+ :data_type => :pls_integer,
232
+ :num_elems => 0,
233
+ :precision => 0,
234
+ :scale => 0,
235
+ :type_name => 'PL/SQL PLS INTEGER',
236
+ :schema_name => 'SYS',
237
+ :type_metadata => pls_integer_type_attrs,
238
+ :inspect => '#<OCI8::Metadata::Collection: PLS_INTEGER>',
239
+ },
240
+ :num_type_attrs => 0,
241
+ :num_type_methods => 0,
242
+ :map_method => nil,
243
+ :order_method => nil,
244
+ :is_invoker_rights? => false,
245
+ :name => 'TABLE_OF_PLS_INTEGER',
246
+ :schema_name => @conn.username,
247
+ :is_final_type? => true,
248
+ :is_instantiable_type? => true,
249
+ :is_subtype? => false,
250
+ :supertype_schema_name => nil,
251
+ :supertype_name => nil,
252
+ :package_name => 'RB_TEST_PKG',
253
+ :type_attrs => [],
254
+ :type_methods => [],
255
+ :inspect => "#<OCI8::Metadata::Type:(0) #{@conn.username}.TABLE_OF_PLS_INTEGER>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.TABLE_OF_PLS_INTEGER"
256
+ }
257
+
258
+ table_of_boolean_type_attrs = {
259
+ :class => OCI8::Metadata::Type,
260
+ :typecode => :named_collection,
261
+ :collection_typecode => :table,
262
+ :is_incomplete_type? => false,
263
+ :is_system_type? => false,
264
+ :is_predefined_type? => false,
265
+ :is_transient_type? => false,
266
+ :is_system_generated_type? => false,
267
+ :has_nested_table? => true,
268
+ :has_lob? => false,
269
+ :has_file? => false,
270
+ :collection_element => {
271
+ :class => OCI8::Metadata::Collection,
272
+ :data_size => 0,
273
+ :typecode => :boolean,
274
+ :data_type => :boolean,
275
+ :num_elems => 0,
276
+ :precision => 0,
277
+ :scale => 0,
278
+ :type_name => 'PL/SQL BOOLEAN',
279
+ :schema_name => 'SYS',
280
+ :type_metadata => boolean_type_attrs,
281
+ :inspect => '#<OCI8::Metadata::Collection: BOOLEAN>',
282
+ },
283
+ :num_type_attrs => 0,
284
+ :num_type_methods => 0,
285
+ :map_method => nil,
286
+ :order_method => nil,
287
+ :is_invoker_rights? => false,
288
+ :name => 'TABLE_OF_BOOLEAN',
289
+ :schema_name => @conn.username,
290
+ :is_final_type? => true,
291
+ :is_instantiable_type? => true,
292
+ :is_subtype? => false,
293
+ :supertype_schema_name => nil,
294
+ :supertype_name => nil,
295
+ :package_name => 'RB_TEST_PKG',
296
+ :type_attrs => [],
297
+ :type_methods => [],
298
+ :inspect => "#<OCI8::Metadata::Type:(0) #{@conn.username}.TABLE_OF_BOOLEAN>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.TABLE_OF_BOOLEAN"
299
+ }
300
+
301
+ indexed_table_of_varchar2_type_attrs = {
302
+ :class => OCI8::Metadata::Type,
303
+ :typecode => :named_collection,
304
+ :collection_typecode => :itable,
305
+ :is_incomplete_type? => false,
306
+ :is_system_type? => false,
307
+ :is_predefined_type? => false,
308
+ :is_transient_type? => false,
309
+ :is_system_generated_type? => false,
310
+ :has_nested_table? => false,
311
+ :has_lob? => false,
312
+ :has_file? => false,
313
+ :collection_element => {
314
+ :class => OCI8::Metadata::Collection,
315
+ :data_size => 10,
316
+ :typecode => :varchar2,
317
+ :data_type => :varchar2,
318
+ :num_elems => 5,
319
+ :precision => 0,
320
+ :scale => 0,
321
+ :type_name => 'VARCHAR2',
322
+ :schema_name => 'SYS',
323
+ :type_metadata => varchar2_type_attrs,
324
+ :inspect => '#<OCI8::Metadata::Collection: VARCHAR2(10)>',
325
+ },
326
+ :num_type_attrs => 0,
327
+ :num_type_methods => 0,
328
+ :map_method => nil,
329
+ :order_method => nil,
330
+ :is_invoker_rights? => false,
331
+ :name => 'INDEXED_TABLE_OF_VARCHAR2',
332
+ :schema_name => @conn.username,
333
+ :is_final_type? => true,
334
+ :is_instantiable_type? => true,
335
+ :is_subtype? => false,
336
+ :supertype_schema_name => nil,
337
+ :supertype_name => nil,
338
+ :package_name => 'RB_TEST_PKG',
339
+ :type_attrs => [],
340
+ :type_methods => [],
341
+ :inspect => "#<OCI8::Metadata::Type:(0) #{@conn.username}.INDEXED_TABLE_OF_VARCHAR2>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.INDEXED_TABLE_OF_VARCHAR2"
342
+ }
343
+
344
+ rec1_type_attrs = {
345
+ :class => OCI8::Metadata::Type,
346
+ :typecode => :record,
347
+ :collection_typecode => nil,
348
+ :is_incomplete_type? => false,
349
+ :is_system_type? => false,
350
+ :is_predefined_type? => false,
351
+ :is_transient_type? => false,
352
+ :is_system_generated_type? => false,
353
+ :has_nested_table? => false,
354
+ :has_lob? => false,
355
+ :has_file? => false,
356
+ :collection_element => nil,
357
+ :num_type_attrs => 2,
358
+ :num_type_methods => 0,
359
+ :map_method => nil,
360
+ :order_method => nil,
361
+ :is_invoker_rights? => false,
362
+ :name => 'REC1',
363
+ :schema_name => @conn.username,
364
+ :is_final_type? => true,
365
+ :is_instantiable_type? => true,
366
+ :is_subtype? => false,
367
+ :supertype_schema_name => nil,
368
+ :supertype_name => nil,
369
+ :package_name => 'RB_TEST_PKG',
370
+ :type_attrs => {
371
+ :class => Array,
372
+ :size => 2,
373
+ [0] => {
374
+ :class => OCI8::Metadata::TypeAttr,
375
+ :data_size => 0,
376
+ :typecode => :pls_integer,
377
+ :data_type => :pls_integer,
378
+ :name => 'I',
379
+ :precision => 0,
380
+ :scale => 0,
381
+ :type_name => 'PL/SQL PLS INTEGER',
382
+ :schema_name => 'SYS',
383
+ :fsprecision => 0,
384
+ :lfprecision => 0,
385
+ :type_metadata => pls_integer_type_attrs,
386
+ :inspect => '#<OCI8::Metadata::TypeAttr: I PLS_INTEGER>',
387
+ },
388
+ [1] => {
389
+ :class => OCI8::Metadata::TypeAttr,
390
+ :data_size => 22,
391
+ :typecode => :integer,
392
+ :data_type => :number,
393
+ :name => 'J',
394
+ :precision => 38,
395
+ :scale => 0,
396
+ :type_name => 'INTEGER',
397
+ :schema_name => 'SYS',
398
+ :fsprecision => 0,
399
+ :lfprecision => 0,
400
+ :type_metadata => integer_type_attrs,
401
+ :inspect => '#<OCI8::Metadata::TypeAttr: J NUMBER(38)>', # TODO: change to "INTEGER"
402
+ },
403
+ },
404
+ :type_methods => [],
405
+ :inspect => "#<OCI8::Metadata::Type:(0) #{@conn.username}.REC1>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.REC1"
406
+ }
407
+
408
+ rec2_type_attrs = {
409
+ :class => OCI8::Metadata::Type,
410
+ :typecode => :record,
411
+ :collection_typecode => nil,
412
+ :is_incomplete_type? => false,
413
+ :is_system_type? => false,
414
+ :is_predefined_type? => false,
415
+ :is_transient_type? => false,
416
+ :is_system_generated_type? => false,
417
+ :has_nested_table? => false,
418
+ :has_lob? => false,
419
+ :has_file? => false,
420
+ :collection_element => nil,
421
+ :num_type_attrs => 3,
422
+ :num_type_methods => 0,
423
+ :map_method => nil,
424
+ :order_method => nil,
425
+ :is_invoker_rights? => false,
426
+ :name => 'REC2',
427
+ :schema_name => @conn.username,
428
+ :is_final_type? => true,
429
+ :is_instantiable_type? => true,
430
+ :is_subtype? => false,
431
+ :supertype_schema_name => nil,
432
+ :supertype_name => nil,
433
+ :package_name => 'RB_TEST_PKG',
434
+ :type_attrs => {
435
+ :class => Array,
436
+ :size => 3,
437
+ [0] => {
438
+ :class => OCI8::Metadata::TypeAttr,
439
+ :data_size => 0,
440
+ :typecode => :boolean,
441
+ :data_type => :boolean,
442
+ :name => 'B',
443
+ :precision => 0,
444
+ :scale => 0,
445
+ :type_name => 'PL/SQL BOOLEAN',
446
+ :schema_name => 'SYS',
447
+ :fsprecision => 0,
448
+ :lfprecision => 0,
449
+ :type_metadata => boolean_type_attrs,
450
+ :inspect => '#<OCI8::Metadata::TypeAttr: B BOOLEAN>',
451
+ },
452
+ [1] => {
453
+ :class => OCI8::Metadata::TypeAttr,
454
+ :data_size => 0,
455
+ :typecode => :named_collection,
456
+ :data_type => :named_type,
457
+ :name => 'IT',
458
+ :precision => 0,
459
+ :scale => 0,
460
+ :type_name => 'INDEXED_TABLE_OF_VARCHAR2',
461
+ :schema_name => @conn.username,
462
+ :fsprecision => 0,
463
+ :lfprecision => 0,
464
+ :type_metadata => indexed_table_of_varchar2_type_attrs,
465
+ :inspect => "#<OCI8::Metadata::TypeAttr: IT #{@conn.username}.INDEXED_TABLE_OF_VARCHAR2>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.INDEXED_TABLE_OF_VARCHAR2"
466
+ },
467
+ [2] => {
468
+ :class => OCI8::Metadata::TypeAttr,
469
+ :data_size => 0,
470
+ :typecode => :record,
471
+ :data_type => :record,
472
+ :name => 'REC',
473
+ :precision => 0,
474
+ :scale => 0,
475
+ :type_name => 'REC1',
476
+ :schema_name => @conn.username,
477
+ :fsprecision => 0,
478
+ :lfprecision => 0,
479
+ :type_metadata => rec1_type_attrs,
480
+ :inspect => "#<OCI8::Metadata::TypeAttr: REC #{@conn.username}.REC1>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.REC1"
481
+ },
482
+ },
483
+ :type_methods => [],
484
+ :inspect => "#<OCI8::Metadata::Type:(0) #{@conn.username}.REC2>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.REC2"
485
+ }
486
+
487
+ table_of_rec1_type_attrs = {
488
+ :class => OCI8::Metadata::Type,
489
+ :typecode => :named_collection,
490
+ :collection_typecode => :table,
491
+ :is_incomplete_type? => false,
492
+ :is_system_type? => false,
493
+ :is_predefined_type? => false,
494
+ :is_transient_type? => false,
495
+ :is_system_generated_type? => false,
496
+ :has_nested_table? => true,
497
+ :has_lob? => false,
498
+ :has_file? => false,
499
+ :collection_element => {
500
+ :class => OCI8::Metadata::Collection,
501
+ :data_size => 0,
502
+ :typecode => :record,
503
+ :data_type => :record,
504
+ :num_elems => 0,
505
+ :precision => 0,
506
+ :scale => 0,
507
+ :type_name => 'REC1',
508
+ :schema_name => @conn.username,
509
+ :type_metadata => rec1_type_attrs,
510
+ :inspect => "#<OCI8::Metadata::Collection: #{@conn.username}.REC1>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.REC1"
511
+ },
512
+ :num_type_attrs => 0,
513
+ :num_type_methods => 0,
514
+ :map_method => nil,
515
+ :order_method => nil,
516
+ :is_invoker_rights? => false,
517
+ :name => 'TABLE_OF_REC1',
518
+ :schema_name => @conn.username,
519
+ :is_final_type? => true,
520
+ :is_instantiable_type? => true,
521
+ :is_subtype? => false,
522
+ :supertype_schema_name => nil,
523
+ :supertype_name => nil,
524
+ :package_name => 'RB_TEST_PKG',
525
+ :type_attrs => [],
526
+ :type_methods => [],
527
+ :inspect => "#<OCI8::Metadata::Type:(0) #{@conn.username}.TABLE_OF_REC1>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.TABLE_OF_REC1"
528
+ }
529
+
530
+ table_of_rec2_type_attrs = {
531
+ :class => OCI8::Metadata::Type,
532
+ :typecode => :named_collection,
533
+ :collection_typecode => :table,
534
+ :is_incomplete_type? => false,
535
+ :is_system_type? => false,
536
+ :is_predefined_type? => false,
537
+ :is_transient_type? => false,
538
+ :is_system_generated_type? => false,
539
+ :has_nested_table? => true,
540
+ :has_lob? => false,
541
+ :has_file? => false,
542
+ :collection_element => {
543
+ :class => OCI8::Metadata::Collection,
544
+ :data_size => 0,
545
+ :typecode => :record,
546
+ :data_type => :record,
547
+ :num_elems => 0,
548
+ :precision => 0,
549
+ :scale => 0,
550
+ :type_name => 'REC2',
551
+ :schema_name => @conn.username,
552
+ :type_metadata => rec2_type_attrs,
553
+ :inspect => "#<OCI8::Metadata::Collection: #{@conn.username}.REC2>",
554
+ #:inspect => "#<OCI8::Metadata::Collection: #{@conn.username}.RB_TEST_PKG.REC2>",
555
+ },
556
+ :num_type_attrs => 0,
557
+ :num_type_methods => 0,
558
+ :map_method => nil,
559
+ :order_method => nil,
560
+ :is_invoker_rights? => false,
561
+ :name => 'TABLE_OF_REC2',
562
+ :schema_name => @conn.username,
563
+ :is_final_type? => true,
564
+ :is_instantiable_type? => true,
565
+ :is_subtype? => false,
566
+ :supertype_schema_name => nil,
567
+ :supertype_name => nil,
568
+ :package_name => 'RB_TEST_PKG',
569
+ :type_attrs => [],
570
+ :type_methods => [],
571
+ :inspect => "#<OCI8::Metadata::Type:(0) #{@conn.username}.TABLE_OF_REC2>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.TABLE_OF_REC2"
572
+ }
573
+
574
+ type_metadata_attrs = {
575
+ 'ARRAY_OF_INTEGER' => array_of_integer_type_attrs,
576
+ 'TABLE_OF_PLS_INTEGER' => table_of_pls_integer_type_attrs,
577
+ 'TABLE_OF_BOOLEAN' => table_of_boolean_type_attrs,
578
+ 'INDEXED_TABLE_OF_VARCHAR2' => indexed_table_of_varchar2_type_attrs,
579
+ 'REC1' => rec1_type_attrs,
580
+ 'REC2' => rec2_type_attrs,
581
+ 'TABLE_OF_REC1' => table_of_rec1_type_attrs,
582
+ 'TABLE_OF_REC2' => table_of_rec2_type_attrs,
583
+ }
584
+
585
+ sum_table_of_pls_integer_subprogram_attrs = {
586
+ :class => OCI8::Metadata::Function,
587
+ :obj_name => 'SUM_TABLE_OF_PLS_INTEGER',
588
+ :obj_schema => nil,
589
+ :is_invoker_rights? => false,
590
+ :name => 'SUM_TABLE_OF_PLS_INTEGER',
591
+ :overload_id => 0,
592
+ :arguments => {
593
+ :class => Array,
594
+ :size => 2,
595
+ [0] => {
596
+ :class => OCI8::Metadata::Argument,
597
+ :obj_name => nil,
598
+ :obj_schema => nil,
599
+ :name => "",
600
+ :position => 0,
601
+ #:typecode => nil,
602
+ :data_type => 3,
603
+ :data_size => 0,
604
+ :precision => 0,
605
+ :scale => 0,
606
+ :level => 0,
607
+ :has_default => 0,
608
+ :has_default? => false,
609
+ :iomode => :out,
610
+ :radix => 0,
611
+ :type_name => "",
612
+ :schema_name => "",
613
+ :sub_name => "",
614
+ :link => "",
615
+ #:type_metadata => nil,
616
+ :arguments => [],
617
+ :inspect => '#<OCI8::Metadata::Argument: unknown(3)>', # TODO: change to "PLS_INTEGER"
618
+ },
619
+ [1] => {
620
+ :class => OCI8::Metadata::Argument,
621
+ :obj_name => nil,
622
+ :obj_schema => nil,
623
+ :name => "TBL",
624
+ :position => 1,
625
+ #:typecode => nil,
626
+ :data_type => :named_type,
627
+ :data_size => 0,
628
+ :precision => 0,
629
+ :scale => 0,
630
+ :level => 0,
631
+ :has_default => 0,
632
+ :has_default? => false,
633
+ :iomode => :in,
634
+ :radix => 0,
635
+ :type_name => "RB_TEST_PKG",
636
+ :schema_name => @conn.username,
637
+ :sub_name => "TABLE_OF_PLS_INTEGER",
638
+ :link => "",
639
+ #:type_metadata => nil,
640
+ :arguments => {
641
+ :class => Array,
642
+ :size => 1,
643
+ [0] => {
644
+ :class => OCI8::Metadata::Argument,
645
+ :obj_name => nil,
646
+ :obj_schema => nil,
647
+ :name => "",
648
+ :position => 1,
649
+ #:typecode => nil,
650
+ :data_type => 3,
651
+ :data_size => 0,
652
+ :precision => 0,
653
+ :scale => 0,
654
+ :level => 1,
655
+ :has_default => 0,
656
+ :has_default? => false,
657
+ :iomode => :in,
658
+ :radix => 0,
659
+ :type_name => "",
660
+ :schema_name => "",
661
+ :sub_name => "",
662
+ :link => "",
663
+ #:type_metadata => nil,
664
+ :arguments => [],
665
+ :inspect => '#<OCI8::Metadata::Argument: unknown(3)>', # TODO: change to "PLS_INTEGER"
666
+ },
667
+ },
668
+ :inspect => "#<OCI8::Metadata::Argument: TBL #{@conn.username}.RB_TEST_PKG>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.TABLE_OF_PLS_INTEGER"
669
+ },
670
+ },
671
+ :is_standalone? => false,
672
+ :inspect => '#<OCI8::Metadata::Function: SUM_TABLE_OF_PLS_INTEGER>', # FIXME
673
+ }
674
+
675
+ add_rec1_values_subprogram_attrs = {
676
+ :class => OCI8::Metadata::Function,
677
+ :obj_name => 'ADD_REC1_VALUES',
678
+ :obj_schema => nil,
679
+ :is_invoker_rights? => false,
680
+ :name => 'ADD_REC1_VALUES',
681
+ :overload_id => 0,
682
+ :arguments => {
683
+ :class => Array,
684
+ :size => 2,
685
+ [0] => {
686
+ :class => OCI8::Metadata::Argument,
687
+ :obj_name => nil,
688
+ :obj_schema => nil,
689
+ :name => "",
690
+ :position => 0,
691
+ #:typecode => nil,
692
+ :data_type => 3,
693
+ :data_size => 0,
694
+ :precision => 0,
695
+ :scale => 0,
696
+ :level => 0,
697
+ :has_default => 0,
698
+ :has_default? => false,
699
+ :iomode => :out,
700
+ :radix => 0,
701
+ :type_name => "",
702
+ :schema_name => "",
703
+ :sub_name => "",
704
+ :link => "",
705
+ #:type_metadata => nil,
706
+ :arguments => [],
707
+ :inspect => '#<OCI8::Metadata::Argument: unknown(3)>', # TODO: change to "PLS_INTEGER"
708
+ },
709
+ [1] => {
710
+ :class => OCI8::Metadata::Argument,
711
+ :obj_name => nil,
712
+ :obj_schema => nil,
713
+ :name => "TBL",
714
+ :position => 1,
715
+ #:typecode => nil,
716
+ :data_type => :named_type,
717
+ :data_size => 0,
718
+ :precision => 0,
719
+ :scale => 0,
720
+ :level => 0,
721
+ :has_default => 0,
722
+ :has_default? => false,
723
+ :iomode => :in,
724
+ :radix => 0,
725
+ :type_name => "RB_TEST_PKG",
726
+ :schema_name => @conn.username,
727
+ :sub_name => "TABLE_OF_REC1",
728
+ :link => "",
729
+ #:type_metadata => nil,
730
+ :arguments => {
731
+ :class => Array,
732
+ :size => 1,
733
+ [0] => {
734
+ :class => OCI8::Metadata::Argument,
735
+ :obj_name => nil,
736
+ :obj_schema => nil,
737
+ :name => "",
738
+ :position => 1,
739
+ #:typecode => nil,
740
+ :data_type => 250,
741
+ :data_size => 0,
742
+ :precision => 0,
743
+ :scale => 0,
744
+ :level => 1,
745
+ :has_default => 0,
746
+ :has_default? => false,
747
+ :iomode => :in,
748
+ :radix => 0,
749
+ :type_name => "RB_TEST_PKG",
750
+ :schema_name => @conn.username,
751
+ :sub_name => "REC1",
752
+ :link => "",
753
+ #:type_metadata => nil,
754
+ :arguments => {
755
+ :class => Array,
756
+ :size => 2,
757
+ [0] => {
758
+ :class => OCI8::Metadata::Argument,
759
+ :obj_name => nil,
760
+ :obj_schema => nil,
761
+ :name => "I",
762
+ :position => 1,
763
+ #:typecode => nil,
764
+ :data_type => 3,
765
+ :data_size => 0,
766
+ :precision => 0,
767
+ :scale => 0,
768
+ :level => 2,
769
+ :has_default => 0,
770
+ :has_default? => false,
771
+ :iomode => :in,
772
+ :radix => 0,
773
+ :type_name => "",
774
+ :schema_name => "",
775
+ :sub_name => "",
776
+ :link => "",
777
+ #:type_metadata => nil,
778
+ :arguments => [],
779
+ :inspect => '#<OCI8::Metadata::Argument: I unknown(3)>', # TODO: change to "PLS_INTEGER"
780
+ },
781
+ [1] => {
782
+ :class => OCI8::Metadata::Argument,
783
+ :obj_name => nil,
784
+ :obj_schema => nil,
785
+ :name => "J",
786
+ :position => 2,
787
+ #:typecode => nil,
788
+ :data_type => :number,
789
+ :data_size => 22,
790
+ :precision => 38,
791
+ :scale => 0,
792
+ :level => 2,
793
+ :has_default => 0,
794
+ :has_default? => false,
795
+ :iomode => :in,
796
+ :radix => 10,
797
+ :type_name => "",
798
+ :schema_name => "",
799
+ :sub_name => "",
800
+ :link => "",
801
+ #:type_metadata => nil,
802
+ :arguments => [],
803
+ :inspect => '#<OCI8::Metadata::Argument: J NUMBER(38)>', # TODO: change to "INTEGER"
804
+ },
805
+ },
806
+ :inspect => '#<OCI8::Metadata::Argument: unknown(250)>', # TODO: change to "#{@conn.username}.RB_TEST_PKG.REC1"
807
+ },
808
+ },
809
+ :inspect => "#<OCI8::Metadata::Argument: TBL #{@conn.username}.RB_TEST_PKG>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.TABLE_OF_REC1"
810
+ },
811
+ },
812
+ :is_standalone? => false,
813
+ :inspect => '#<OCI8::Metadata::Function: ADD_REC1_VALUES>', # TODO: change to "#{@conn.username}.RB_TEST_PKG.ADD_REC1_VALUES"
814
+ }
815
+
816
+ out_rec1_values_subprogram_attrs = {
817
+ :class => OCI8::Metadata::Procedure,
818
+ :obj_name => 'OUT_REC1_VALUES',
819
+ :obj_schema => nil,
820
+ :is_invoker_rights? => false,
821
+ :name => 'OUT_REC1_VALUES',
822
+ :overload_id => 0,
823
+ :arguments => {
824
+ :class => Array,
825
+ :size => 1,
826
+ [0] => {
827
+ :class => OCI8::Metadata::Argument,
828
+ :obj_name => nil,
829
+ :obj_schema => nil,
830
+ :name => "TBL",
831
+ :position => 1,
832
+ #:typecode => nil,
833
+ :data_type => :named_type,
834
+ :data_size => 0,
835
+ :precision => 0,
836
+ :scale => 0,
837
+ :level => 0,
838
+ :has_default => 0,
839
+ :has_default? => false,
840
+ :iomode => :out,
841
+ :radix => 0,
842
+ :type_name => "RB_TEST_PKG",
843
+ :schema_name => @conn.username,
844
+ :sub_name => "TABLE_OF_REC1",
845
+ :link => "",
846
+ #:type_metadata => nil,
847
+ :arguments => {
848
+ :class => Array,
849
+ :size => 1,
850
+ [0] => {
851
+ :class => OCI8::Metadata::Argument,
852
+ :obj_name => nil,
853
+ :obj_schema => nil,
854
+ :name => "",
855
+ :position => 1,
856
+ #:typecode => nil,
857
+ :data_type => 250,
858
+ :data_size => 0,
859
+ :precision => 0,
860
+ :scale => 0,
861
+ :level => 1,
862
+ :has_default => 0,
863
+ :has_default? => false,
864
+ :iomode => :out,
865
+ :radix => 0,
866
+ :type_name => "RB_TEST_PKG",
867
+ :schema_name => @conn.username,
868
+ :sub_name => "REC1",
869
+ :link => "",
870
+ #:type_metadata => nil,
871
+ :arguments => {
872
+ :class => Array,
873
+ :size => 2,
874
+ [0] => {
875
+ :class => OCI8::Metadata::Argument,
876
+ :obj_name => nil,
877
+ :obj_schema => nil,
878
+ :name => "I",
879
+ :position => 1,
880
+ #:typecode => nil,
881
+ :data_type => 3,
882
+ :data_size => 0,
883
+ :precision => 0,
884
+ :scale => 0,
885
+ :level => 2,
886
+ :has_default => 0,
887
+ :has_default? => false,
888
+ :iomode => :out,
889
+ :radix => 0,
890
+ :type_name => "",
891
+ :schema_name => "",
892
+ :sub_name => "",
893
+ :link => "",
894
+ #:type_metadata => nil,
895
+ :arguments => [],
896
+ :inspect => '#<OCI8::Metadata::Argument: I unknown(3)>', # TODO: change to "PLS_INTEGER"
897
+ },
898
+ [1] => {
899
+ :class => OCI8::Metadata::Argument,
900
+ :obj_name => nil,
901
+ :obj_schema => nil,
902
+ :name => "J",
903
+ :position => 2,
904
+ #:typecode => nil,
905
+ :data_type => :number,
906
+ :data_size => 22,
907
+ :precision => 38,
908
+ :scale => 0,
909
+ :level => 2,
910
+ :has_default => 0,
911
+ :has_default? => false,
912
+ :iomode => :out,
913
+ :radix => 10,
914
+ :type_name => "",
915
+ :schema_name => "",
916
+ :sub_name => "",
917
+ :link => "",
918
+ #:type_metadata => nil,
919
+ :arguments => [],
920
+ :inspect => '#<OCI8::Metadata::Argument: J NUMBER(38)>', # TODO: change to "INTEGER"
921
+ },
922
+ },
923
+ :inspect => '#<OCI8::Metadata::Argument: unknown(250)>', # TODO: change to "#{@conn.username}.RB_TEST_PKG.REC1"
924
+ },
925
+ },
926
+ :inspect => "#<OCI8::Metadata::Argument: TBL #{@conn.username}.RB_TEST_PKG>", # TODO: change to "#{@conn.username}.RB_TEST_PKG.TABLE_OF_REC1"
927
+ },
928
+ },
929
+ :is_standalone? => false,
930
+ :inspect => '#<OCI8::Metadata::Procedure: OUT_REC1_VALUES>', # TODO: change to "#{@conn.username}.RB_TEST_PKG.OUT_REC1_VALUES"
931
+ }
932
+
933
+ subprogram_metadata_attrs = {
934
+ 'SUM_TABLE_OF_PLS_INTEGER' => sum_table_of_pls_integer_subprogram_attrs,
935
+ 'ADD_REC1_VALUES' => add_rec1_values_subprogram_attrs,
936
+ 'OUT_REC1_VALUES' => out_rec1_values_subprogram_attrs,
937
+ }
938
+
939
+ pkg_metadata = @conn.describe_package('rb_test_pkg')
940
+
941
+ assert_kind_of(OCI8::Metadata::Package, pkg_metadata)
942
+ assert_equal(false, pkg_metadata.is_invoker_rights?)
943
+ type_metadata = pkg_metadata.types
944
+ assert_kind_of(Array, type_metadata)
945
+ assert_equal(8, type_metadata.size)
946
+ type_metadata.each do |md|
947
+ attrs = type_metadata_attrs[md.name]
948
+ if attrs
949
+ check_attributes(md.name, md, attrs)
950
+ else
951
+ raise "unknown type name #{md.name}"
952
+ end
953
+ end
954
+
955
+ subprogram_metadata = pkg_metadata.subprograms
956
+ assert_kind_of(Array, subprogram_metadata)
957
+ assert_equal(3, subprogram_metadata.size)
958
+ subprogram_metadata.each do |md|
959
+ attrs = subprogram_metadata_attrs[md.name]
960
+ if attrs
961
+ check_attributes(md.name, md, attrs)
962
+ else
963
+ raise "unknown subprogram name #{md.name}"
964
+ end
965
+ end
966
+ end
967
+ end