ruby-oci8 2.1.5.1-x64-mingw32 → 2.1.7-x64-mingw32

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.
@@ -89,6 +89,15 @@ class OCI8
89
89
  # attr_get_oradate(OCI_ATTR_TIMESTAMP)
90
90
  #end
91
91
 
92
+ # Returns the database link name if the object is at the remote host.
93
+ # Note that this is available only when the object is returned by OCI8#describe_* methods.
94
+ #
95
+ # @return [String or nil] database link name
96
+ # @since 2.1.7
97
+ def obj_link
98
+ @obj_link
99
+ end
100
+
92
101
  # @private
93
102
  def inspect
94
103
  "#<#{self.class.name}:(#{obj_id}) #{obj_schema}.#{obj_name}>"
@@ -110,7 +119,7 @@ class OCI8
110
119
  Proc.new do |p|
111
120
  if p.charset_form == :nchar
112
121
  "NVARCHAR2(#{p.char_size})"
113
- elsif p.char_used?
122
+ elsif p.respond_to?(:char_used?) && p.char_used?
114
123
  "VARCHAR2(#{p.char_size} CHAR)"
115
124
  else
116
125
  "VARCHAR2(#{p.data_size})"
@@ -248,6 +257,12 @@ class OCI8
248
257
  "TIMESTAMP(#{fsprecision}) WITH LOCAL TIME ZONE"
249
258
  end
250
259
  end]
260
+ DATA_TYPE_MAP[245] = [:record,
261
+ Proc.new do |p|
262
+ "#{p.schema_name}.#{p.type_name}"
263
+ end]
264
+ DATA_TYPE_MAP[252] = [:boolean, "BOOLEAN"]
265
+ DATA_TYPE_MAP[266] = [:pls_integer, "PLS_INTEGER"]
251
266
 
252
267
  def __data_type # :nodoc:
253
268
  return @data_type if defined? @data_type
@@ -337,6 +352,9 @@ class OCI8
337
352
  #when 228; :sysfirst # OCI_TYPECODE_SYSFIRST
338
353
  #when 235; :syslast # OCI_TYPECODE_SYSLAST
339
354
  when 266; :pls_integer # OCI_TYPECODE_PLS_INTEGER
355
+ when 250; :record # OCI_TYPECODE_RECORD
356
+ when 251; :itable # OCI_TYPECODE_ITABLE
357
+ when 252; :boolean # OCI_TYPECODE_BOOLEAN
340
358
  end
341
359
  end
342
360
  end
@@ -632,6 +650,12 @@ class OCI8
632
650
  end
633
651
  private :list_subprograms
634
652
 
653
+ # package type list
654
+ def list_types # :nodoc:
655
+ __param(137) # OCI_ATTR_LIST_PKG_TYPES
656
+ end
657
+ private :list_types
658
+
635
659
  # Returns +true+ if the package subprograms have
636
660
  # {invoker's rights}[http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28370/subprograms.htm#i18574].
637
661
  # Otherwise, +false+.
@@ -647,6 +671,22 @@ class OCI8
647
671
  prog.instance_variable_set(:@is_standalone, false)
648
672
  end
649
673
  end
674
+
675
+ if OCI8.oracle_client_version < ORAVER_12_1
676
+ def types
677
+ raise "This version of the Oracle client does not support PL/SQL package type descriptions."
678
+ end
679
+ else
680
+ # Returns an array of types defined within the Package.
681
+ #
682
+ # @return [array of OCI8::Metadata::Type]
683
+ # @since 2.1.6
684
+ def types
685
+ @types ||= list_types.to_a.each do |type|
686
+ type.instance_variable_set(:@is_standalone, false)
687
+ end
688
+ end
689
+ end
650
690
  end
651
691
 
652
692
  # Information about types
@@ -851,6 +891,15 @@ class OCI8
851
891
  attr_get_string(OCI_ATTR_SUPERTYPE_NAME) if is_subtype?
852
892
  end
853
893
 
894
+ # Returns the package name if the type is a package type.
895
+ # Otherwise, +nil+.
896
+ #
897
+ # @return [String or nil]
898
+ # @since 2.1.6
899
+ def package_name
900
+ attr_get_string(12, false) # OCI_ATTR_PACKAGE_NAME
901
+ end
902
+
854
903
  # Returns attribute information of the type.
855
904
  #
856
905
  # @return [array of OCI8::Metadata::TypeAttr]
@@ -1199,6 +1248,7 @@ class OCI8
1199
1248
  # schema name of the synonym translation
1200
1249
  def schema_name
1201
1250
  @schema_name ||= attr_get_string(OCI_ATTR_SCHEMA_NAME)
1251
+ @schema_name.size == 0 ? nil : @schema_name
1202
1252
  end
1203
1253
 
1204
1254
  # object name of the synonym translation
@@ -1214,11 +1264,7 @@ class OCI8
1214
1264
 
1215
1265
  # full-qualified synonym translation name with schema, object and database link name.
1216
1266
  def translated_name
1217
- if link.nil?
1218
- schema_name + '.' + name
1219
- else
1220
- schema_name + '.' + name + '@' + link
1221
- end
1267
+ (schema_name ? schema_name + '.' : '') + name + (link ? '@' + link : '')
1222
1268
  end
1223
1269
 
1224
1270
  def inspect # :nodoc:
@@ -1487,10 +1533,21 @@ class OCI8
1487
1533
  end
1488
1534
 
1489
1535
  # Indicates whether an argument has a default
1536
+ #
1537
+ # @return [1 or 0]
1538
+ # @deprecated
1490
1539
  def has_default
1491
1540
  attr_get_ub1(OCI_ATTR_HAS_DEFAULT)
1492
1541
  end
1493
1542
 
1543
+ # Indicates whether an argument has a default
1544
+ #
1545
+ # @return [true or false]
1546
+ # @since 2.1.6
1547
+ def has_default?
1548
+ __boolean(OCI_ATTR_HAS_DEFAULT)
1549
+ end
1550
+
1494
1551
  # The list of arguments at the next level (when the argument is
1495
1552
  # of a record or table type).
1496
1553
  def list_arguments
@@ -1648,8 +1705,9 @@ class OCI8
1648
1705
  #when OCI_LTYPE_TABLE_ALIAS; offset = ?
1649
1706
  #when OCI_LTYPE_VARIABLE_TYPE; offset = ?
1650
1707
  #when OCI_LTYPE_NAME_VALUE; offset = ?
1708
+ when 15; offset = 0 # OCI_LTYPE_PACKAGE_TYPE
1651
1709
  else
1652
- raise NotImplementedError, "unsupported list type #{list.ltype}"
1710
+ raise NotImplementedError, "unsupported list type #{ltype}"
1653
1711
  end
1654
1712
  ary = []
1655
1713
  0.upto(num_params - 1) do |i|
@@ -1994,7 +2052,13 @@ class OCI8
1994
2052
  # @param [String] object_name
1995
2053
  # @return [a subclass of OCI8::Metadata::Base]
1996
2054
  def describe_any(object_name)
1997
- __describe(object_name, OCI8::Metadata::Unknown, true)
2055
+ if /^PUBLIC\.(.*)/i =~ object_name
2056
+ md = __describe($1, OCI8::Metadata::Unknown, true)
2057
+ raise OCIError.new(4043, object_name) if md.obj_schema != 'PUBLIC'
2058
+ md
2059
+ else
2060
+ __describe(object_name, OCI8::Metadata::Unknown, true)
2061
+ end
1998
2062
  end
1999
2063
  # Returns table or view information. If the name is a current schema's synonym
2000
2064
  # name or a public synonym name, it returns table or view information which
@@ -2011,6 +2075,9 @@ class OCI8
2011
2075
  __describe(table_name, OCI8::Metadata::Table, false)
2012
2076
  else
2013
2077
  # check tables, views, synonyms and public synonyms.
2078
+
2079
+ # follow synonyms up to 20 times to prevent infinite loop
2080
+ # caused by recursive synonyms.
2014
2081
  recursive_level = 20
2015
2082
  recursive_level.times do
2016
2083
  metadata = __describe(table_name, OCI8::Metadata::Unknown, true)
@@ -2019,6 +2086,11 @@ class OCI8
2019
2086
  return metadata
2020
2087
  when OCI8::Metadata::Synonym
2021
2088
  table_name = metadata.translated_name
2089
+ if metadata.obj_link and metadata.link.nil?
2090
+ # table_name is a synonym in a remote database for an object in the
2091
+ # remote database itself.
2092
+ table_name = "#{table_name}@#{metadata.obj_link}"
2093
+ end
2022
2094
  else
2023
2095
  raise OCIError.new(4043, table_name) # ORA-04043: object %s does not exist
2024
2096
  end
@@ -2066,7 +2138,13 @@ class OCI8
2066
2138
  # @param [String] synonym_name
2067
2139
  # @return [OCI8::Metadata::Synonym]
2068
2140
  def describe_synonym(synonym_name, check_public_also = true)
2069
- __describe(synonym_name, OCI8::Metadata::Synonym, check_public_also)
2141
+ if /^PUBLIC\.(.*)/i =~ synonym_name
2142
+ md = __describe($1, OCI8::Metadata::Synonym, true)
2143
+ raise OCIError.new(4043, synonym_name) if md.obj_schema != 'PUBLIC'
2144
+ md
2145
+ else
2146
+ __describe(synonym_name, OCI8::Metadata::Synonym, check_public_also)
2147
+ end
2070
2148
  end
2071
2149
  # Returns sequence information
2072
2150
  #
@@ -71,6 +71,29 @@ EOS
71
71
  OCI8::TDO.new(self, metadata, klass)
72
72
  end
73
73
 
74
+ # Returns the type descriptor object which correspond to the given type name.
75
+ #
76
+ # @param [String] typename
77
+ # @return [OCI8::TDO]
78
+ #
79
+ # @private
80
+ def get_tdo_by_typename(typename)
81
+ tdo = @name_to_tdo && @name_to_tdo[typename]
82
+ return tdo if tdo
83
+
84
+ metadata = describe_any(typename)
85
+ if metadata.is_a? OCI8::Metadata::Synonym
86
+ metadata = describe_any(metadata.translated_name)
87
+ end
88
+ unless metadata.is_a? OCI8::Metadata::Type
89
+ raise "unknown typename #{typename}"
90
+ end
91
+ tdo = get_tdo_by_metadata(metadata)
92
+
93
+ @name_to_tdo[typename] = tdo
94
+ tdo
95
+ end
96
+
74
97
  # A helper class to bind arguments.
75
98
  #
76
99
  # @private
Binary file
Binary file
@@ -19,7 +19,7 @@ spec = Gem::Specification.new do |s|
19
19
  s.version = File.read('VERSION').strip
20
20
  s.summary = 'Ruby interface for Oracle using OCI8 API'
21
21
  s.email = 'kubo@jiubao.org'
22
- s.homepage = 'http://ruby-oci8.rubyforge.org'
22
+ s.homepage = 'https://github.com/kubo/ruby-oci8/'
23
23
  s.rubyforge_project = 'ruby-oci8'
24
24
  s.description = <<EOS
25
25
  ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8i, Oracle9i, Oracle10g, Oracle11g and Oracle Instant Client.
@@ -18,6 +18,21 @@ $lobreadnum = 256 # counts in charactors
18
18
 
19
19
  # don't modify below.
20
20
 
21
+ begin
22
+ require 'minitest/autorun'
23
+ Minitest = MiniTest unless defined? Minitest
24
+ Minitest::Test = Minitest::Unit::TestCase unless defined? Minitest::Test
25
+ rescue LoadError
26
+ require 'test/unit'
27
+ module Minitest
28
+ Test = ::Test::Unit::TestCase
29
+ Assertions = ::Test::Unit::Assertions
30
+ module Assertions
31
+ alias refute_nil assert_not_nil
32
+ end
33
+ end
34
+ end
35
+
21
36
  # $oracle_server_version: database compatible level of the Oracle server.
22
37
  # $oracle_client_version: Oracle client library version for which oci8 is compiled.
23
38
  # $oracle_version: lower value of $oracle_server_version and $oracle_client_version.
@@ -108,77 +123,72 @@ def convert_to_datetime(year, month, day, hour, minute, sec, subsec, timezone)
108
123
  end
109
124
  end
110
125
 
111
- module Test
112
- module Unit
113
- class TestCase
126
+ class Minitest::Test
114
127
 
115
- def get_oci8_connection()
116
- OCI8.new($dbuser, $dbpass, $dbname)
128
+ def get_oci8_connection()
129
+ OCI8.new($dbuser, $dbpass, $dbname)
117
130
  rescue OCIError
118
- raise if $!.code != 12516 && $!.code != 12520
119
- # sleep a few second and try again if
120
- # the error code is ORA-12516 or ORA-12520.
121
- #
122
- # ORA-12516 - TNS:listener could not find available handler with
123
- # matching protocol stack
124
- # ORA-12520 - TNS:listener could not find available handler for
125
- # requested type of server
126
- #
127
- # Thanks to Christopher Jones.
128
- #
129
- # Ref: The Underground PHP and Oracle Manual (page 175 in vesion 1.4)
130
- # http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf
131
- #
132
- sleep(5)
133
- OCI8.new($dbuser, $dbpass, $dbname)
134
- end
131
+ raise if $!.code != 12516 && $!.code != 12520
132
+ # sleep a few second and try again if
133
+ # the error code is ORA-12516 or ORA-12520.
134
+ #
135
+ # ORA-12516 - TNS:listener could not find available handler with
136
+ # matching protocol stack
137
+ # ORA-12520 - TNS:listener could not find available handler for
138
+ # requested type of server
139
+ #
140
+ # Thanks to Christopher Jones.
141
+ #
142
+ # Ref: The Underground PHP and Oracle Manual (page 175 in vesion 1.4)
143
+ # http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf
144
+ #
145
+ sleep(5)
146
+ OCI8.new($dbuser, $dbpass, $dbname)
147
+ end
148
+
149
+ def get_dbi_connection()
150
+ DBI.connect("dbi:OCI8:#{$dbname}", $dbuser, $dbpass, 'AutoCommit' => false)
151
+ rescue DBI::DatabaseError
152
+ raise if $!.err != 12516 && $!.err != 12520
153
+ # same as get_oci8_connection()
154
+ sleep(5)
155
+ DBI.connect("dbi:OCI8:#{$dbname}", $dbuser, $dbpass, 'AutoCommit' => false)
156
+ end
135
157
 
136
- def get_dbi_connection()
137
- DBI.connect("dbi:OCI8:#{$dbname}", $dbuser, $dbpass, 'AutoCommit' => false)
158
+ def drop_table(table_name)
159
+ if $oracle_server_version < OCI8::ORAVER_10_1
160
+ # Oracle 8 - 9i
161
+ sql = "DROP TABLE #{table_name}"
162
+ else
163
+ # Oracle 10g -
164
+ sql = "DROP TABLE #{table_name} PURGE"
165
+ end
166
+
167
+ if defined? @conn
168
+ begin
169
+ @conn.exec(sql)
170
+ rescue OCIError
171
+ raise if $!.code != 942 # table or view does not exist
172
+ end
173
+ elsif instance_variable_get(:@dbh)
174
+ begin
175
+ @dbh.do(sql)
138
176
  rescue DBI::DatabaseError
139
- raise if $!.err != 12516 && $!.err != 12520
140
- # same as get_oci8_connection()
141
- sleep(5)
142
- DBI.connect("dbi:OCI8:#{$dbname}", $dbuser, $dbpass, 'AutoCommit' => false)
177
+ raise if $!.err != 942 # table or view does not exist
143
178
  end
179
+ end
180
+ end # drop_table
144
181
 
145
- def drop_table(table_name)
146
- if $oracle_server_version < OCI8::ORAVER_10_1
147
- # Oracle 8 - 9i
148
- sql = "DROP TABLE #{table_name}"
149
- else
150
- # Oracle 10g -
151
- sql = "DROP TABLE #{table_name} PURGE"
152
- end
153
-
154
- if defined? @conn
155
- begin
156
- @conn.exec(sql)
157
- rescue OCIError
158
- raise if $!.code != 942 # table or view does not exist
159
- end
160
- elsif instance_variable_get(:@dbh)
161
- begin
162
- @dbh.do(sql)
163
- rescue DBI::DatabaseError
164
- raise if $!.err != 942 # table or view does not exist
165
- end
166
- end
167
- end # drop_table
168
-
169
- def drop_type(type_name)
170
- begin
171
- @conn.exec("DROP TYPE BODY #{type_name}")
172
- rescue OCIError
173
- raise if $!.code != 4043
174
- end
175
- begin
176
- @conn.exec("DROP TYPE #{type_name}")
177
- rescue OCIError
178
- raise if $!.code != 4043
179
- end
180
- end # drop_type
182
+ def drop_type(type_name)
183
+ begin
184
+ @conn.exec("DROP TYPE BODY #{type_name}")
185
+ rescue OCIError
186
+ raise if $!.code != 4043
181
187
  end
182
- end
188
+ begin
189
+ @conn.exec("DROP TYPE #{type_name}")
190
+ rescue OCIError
191
+ raise if $!.code != 4043
192
+ end
193
+ end # drop_type
183
194
  end
184
-
@@ -1,7 +1,6 @@
1
1
  srcdir = File.dirname(__FILE__)
2
2
 
3
3
  require 'oci8'
4
- require 'test/unit'
5
4
  require "#{srcdir}/config"
6
5
 
7
6
  require "#{srcdir}/test_oradate"
@@ -30,6 +29,10 @@ if OCI8.respond_to? :encoding
30
29
  require "#{srcdir}/test_encoding"
31
30
  end
32
31
 
32
+ if $oracle_version >= OCI8::ORAVER_12_1
33
+ require "#{srcdir}/test_package_type"
34
+ end
35
+
33
36
  # Ruby/DBI
34
37
  begin
35
38
  require 'dbi'
@@ -47,8 +50,3 @@ unless dbi_not_found
47
50
  require "#{srcdir}/test_dbi_clob"
48
51
  end
49
52
  end
50
-
51
- #Test::Unit::AutoRunner.run(true, true)
52
- if defined? Test::Unit::AutoRunner
53
- Test::Unit::AutoRunner.run()
54
- end
@@ -1,8 +1,7 @@
1
1
  require 'oci8'
2
- require 'test/unit'
3
2
  require File.dirname(__FILE__) + '/config'
4
3
 
5
- class TestAppInfo < Test::Unit::TestCase
4
+ class TestAppInfo < Minitest::Test
6
5
 
7
6
  def setup
8
7
  @conn = get_oci8_connection
@@ -14,7 +13,7 @@ class TestAppInfo < Test::Unit::TestCase
14
13
  @conn.client_identifier = client_id
15
14
  assert_equal(client_id, @conn.select_one("SELECT SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') FROM DUAL")[0]);
16
15
  # check the first character
17
- assert_raise ArgumentError do
16
+ assert_raises ArgumentError do
18
17
  @conn.client_identifier = ':bad_identifier'
19
18
  end
20
19