ruby-oci8 1.0.7 → 2.0.0

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 (89) hide show
  1. data/ChangeLog +1254 -390
  2. data/Makefile +10 -13
  3. data/README +56 -385
  4. data/VERSION +1 -1
  5. data/dist-files +26 -27
  6. data/ext/oci8/.document +1 -0
  7. data/ext/oci8/MANIFEST +0 -4
  8. data/ext/oci8/apiwrap.c.tmpl +172 -0
  9. data/ext/oci8/apiwrap.h.tmpl +61 -0
  10. data/ext/oci8/apiwrap.rb +91 -0
  11. data/ext/oci8/apiwrap.yml +1243 -0
  12. data/ext/oci8/attr.c +124 -384
  13. data/ext/oci8/bind.c +472 -164
  14. data/ext/oci8/encoding.c +196 -0
  15. data/ext/oci8/env.c +84 -253
  16. data/ext/oci8/error.c +196 -127
  17. data/ext/oci8/extconf.rb +82 -59
  18. data/ext/oci8/lob.c +710 -370
  19. data/ext/oci8/metadata.c +359 -0
  20. data/ext/oci8/object.c +622 -0
  21. data/ext/oci8/oci8.c +577 -161
  22. data/ext/oci8/oci8.h +354 -258
  23. data/ext/oci8/oci8lib.c +493 -0
  24. data/ext/oci8/ocidatetime.c +473 -0
  25. data/ext/oci8/ocinumber.c +1123 -24
  26. data/ext/oci8/oraconf.rb +72 -106
  27. data/ext/oci8/oradate.c +511 -321
  28. data/ext/oci8/stmt.c +752 -572
  29. data/ext/oci8/win32.c +131 -0
  30. data/ext/oci8/xmldb.c +383 -0
  31. data/lib/.document +2 -0
  32. data/lib/dbd/OCI8.rb +2 -17
  33. data/lib/oci8.rb.in +41 -1622
  34. data/lib/oci8/.document +5 -0
  35. data/lib/oci8/compat.rb +108 -0
  36. data/lib/oci8/datetime.rb +489 -0
  37. data/lib/oci8/encoding-init.rb +40 -0
  38. data/lib/oci8/encoding.yml +537 -0
  39. data/lib/oci8/metadata.rb +2077 -0
  40. data/lib/oci8/object.rb +548 -0
  41. data/lib/oci8/oci8.rb +773 -0
  42. data/lib/oci8/oracle_version.rb +144 -0
  43. data/metaconfig +3 -3
  44. data/ruby-oci8.gemspec +5 -5
  45. data/setup.rb +4 -4
  46. data/test/config.rb +64 -84
  47. data/test/test_all.rb +14 -21
  48. data/test/test_array_dml.rb +317 -0
  49. data/test/test_bind_raw.rb +18 -25
  50. data/test/test_bind_time.rb +78 -91
  51. data/test/test_break.rb +37 -35
  52. data/test/test_clob.rb +33 -89
  53. data/test/test_connstr.rb +5 -4
  54. data/test/test_datetime.rb +469 -0
  55. data/test/test_dbi.rb +99 -60
  56. data/test/test_dbi_clob.rb +3 -8
  57. data/test/test_metadata.rb +65 -51
  58. data/test/test_oci8.rb +151 -55
  59. data/test/test_oracle_version.rb +70 -0
  60. data/test/test_oradate.rb +76 -83
  61. data/test/test_oranumber.rb +405 -71
  62. data/test/test_rowid.rb +6 -11
  63. metadata +31 -32
  64. data/NEWS +0 -420
  65. data/ext/oci8/const.c +0 -165
  66. data/ext/oci8/define.c +0 -53
  67. data/ext/oci8/describe.c +0 -81
  68. data/ext/oci8/descriptor.c +0 -39
  69. data/ext/oci8/handle.c +0 -273
  70. data/ext/oci8/oranumber.c +0 -445
  71. data/ext/oci8/param.c +0 -37
  72. data/ext/oci8/server.c +0 -182
  73. data/ext/oci8/session.c +0 -99
  74. data/ext/oci8/svcctx.c +0 -238
  75. data/ruby-oci8.spec +0 -62
  76. data/support/README +0 -4
  77. data/support/runit/assert.rb +0 -281
  78. data/support/runit/cui/testrunner.rb +0 -101
  79. data/support/runit/error.rb +0 -4
  80. data/support/runit/method_mappable.rb +0 -20
  81. data/support/runit/robserver.rb +0 -25
  82. data/support/runit/setuppable.rb +0 -15
  83. data/support/runit/teardownable.rb +0 -16
  84. data/support/runit/testcase.rb +0 -113
  85. data/support/runit/testfailure.rb +0 -25
  86. data/support/runit/testresult.rb +0 -121
  87. data/support/runit/testsuite.rb +0 -43
  88. data/support/runit/version.rb +0 -3
  89. data/test/test_describe.rb +0 -137
@@ -0,0 +1,144 @@
1
+ # oracle_version.rb implements OCI8::OracleVersion.
2
+ #
3
+ # Copyright (C) 2009 KUBO Takehiro <kubo@jiubao.org>
4
+
5
+ #--
6
+
7
+ class OCI8
8
+
9
+ # A data class, representing Oracle version.
10
+ #
11
+ # Oracle version is represented by five numbers:
12
+ # *major*, *minor*, *update*, *patch* and *port_update*.
13
+ class OracleVersion
14
+ include Comparable
15
+
16
+ # The first part of the Oracle version.
17
+ attr_reader :major
18
+ # The second part of the Oracle version.
19
+ attr_reader :minor
20
+ # The third part of the Oracle version.
21
+ attr_reader :update
22
+ # The fifth part of the Oracle version.
23
+ attr_reader :patch
24
+ # The fourth part of the Oracle version.
25
+ attr_reader :port_update
26
+
27
+ # Creates a OCI8::OracleVersion object.
28
+ #
29
+ # If the first argument _arg_ is a String, it is parsed as dotted
30
+ # version string. If it is bigger than 0x08000000, it is parsed as
31
+ # a number contains 5-digit Oracle version. Otherwise, it is used
32
+ # as a major version and the rest arguments are minor, update,
33
+ # patch and port_update. Unspecified version numbers are zeros by
34
+ # default.
35
+ #
36
+ # == Example
37
+ # oraver = OCI8::OracleVersion.new('10.2.0.4')
38
+ # oraver.major # => 10
39
+ # oraver.minor # => 2
40
+ # oraver.update # => 0
41
+ # oraver.patch # => 4
42
+ # oraver.port_update # => 0
43
+ #
44
+ # oraver = OCI8::OracleVersion.new(0x0a200400)
45
+ # oraver.major # => 10
46
+ # oraver.minor # => 2
47
+ # oraver.update # => 0
48
+ # oraver.patch # => 4
49
+ # oraver.port_update # => 0
50
+ def initialize(arg, minor = nil, update = nil, patch = nil, port_update = nil)
51
+ if arg.is_a? String
52
+ major, minor, update, patch, port_update = arg.split('.').collect do |v|
53
+ v.to_i
54
+ end
55
+ elsif arg >= 0x08000000
56
+ major = (arg & 0xFF000000) >> 24
57
+ minor = (arg & 0x00F00000) >> 20
58
+ update = (arg & 0x000FF000) >> 12
59
+ patch = (arg & 0x00000F00) >> 8
60
+ port_update = (arg & 0x000000FF)
61
+ else
62
+ major = arg
63
+ end
64
+ @major = major
65
+ @minor = minor || 0
66
+ @update = update || 0
67
+ @patch = patch || 0
68
+ @port_update = port_update || 0
69
+ end
70
+
71
+ # :call-seq:
72
+ # oraver <=> other_oraver -> -1, 0, +1
73
+ #
74
+ # Compares +oraver+ and +other_oraver+.
75
+ #
76
+ # <=> is the basis for the methods <, <=, ==, >, >=, and between?,
77
+ # included from module Comparable.
78
+ def <=>(other)
79
+ cmp = @major <=> other.major
80
+ return cmp if cmp != 0
81
+ cmp = @minor <=> other.minor
82
+ return cmp if cmp != 0
83
+ cmp = @update <=> other.update
84
+ return cmp if cmp != 0
85
+ cmp = @patch <=> other.patch
86
+ return cmp if cmp != 0
87
+ @port_update <=> other.port_update
88
+ end
89
+
90
+ # :call-seq:
91
+ # oraver.to_i -> integer
92
+ #
93
+ # Returns an integer number contains 5-digit Oracle version.
94
+ #
95
+ # If the hexadecimal notation is 0xAABCCDEE, *major*, *minor*,
96
+ # *update*, *patch* and *port_update* are 0xAA, 0xB, 0xCC, 0xD and
97
+ # 0xEE respectively.
98
+ #
99
+ # == Example
100
+ # oraver = OCI8::OracleVersion.new('10.2.0.4')
101
+ # oraver.to_i # => 169870336
102
+ # '%08x' % oraver.to_i # => "0a200400"
103
+ def to_i
104
+ (@major << 24) | (@minor << 20) | (@update << 12) | (@patch << 8) | @port_update
105
+ end
106
+
107
+ # :call-seq:
108
+ # oraver.to_s -> string
109
+ #
110
+ # Returns a dotted version string of the Oracle version.
111
+ #
112
+ # == Example
113
+ # oraver = OCI8::OracleVersion.new('10.2.0.4')
114
+ # oraver.to_s # => '10.2.0.4.0'
115
+ def to_s
116
+ format('%d.%d.%d.%d.%d', @major, @minor, @update, @patch, @port_update)
117
+ end
118
+
119
+ # :call-seq:
120
+ # oraver.eql? other -> true or false
121
+ #
122
+ # Returns true if +oraver+ and +other+ are the same type and have
123
+ # equal values.
124
+ #--
125
+ # This is for class Hash to test members for equality.
126
+ def eql?(other)
127
+ other.is_a? OCI8::OracleVersion and (self <=> other) == 0
128
+ end
129
+
130
+ # :call-seq:
131
+ # oraver.hash -> integer
132
+ #
133
+ # Returns a hash based on the value of +oraver+.
134
+ #--
135
+ # This is for class Hash.
136
+ def hash
137
+ to_i
138
+ end
139
+
140
+ def inspect # :nodoc:
141
+ "#<#{self.class.to_s}: #{self.to_s}>"
142
+ end
143
+ end
144
+ end
data/metaconfig CHANGED
@@ -10,7 +10,7 @@ ToplevelInstaller.module_eval {
10
10
  old = Dir.pwd
11
11
  @installer.mkdir_p "#{objdir_root}/test"
12
12
  Dir.chdir "#{objdir_root}/test"
13
- @installer.ruby("-I#{srcdir_root}/ext/oci8 -I#{srcdir_root}/lib -I#{srcdir_root}/support -I#{srcdir_root}/test #{srcdir_root}/test/test_all.rb")
13
+ @installer.ruby("-w -I#{srcdir_root}/ext/oci8 -I#{srcdir_root}/lib -I#{srcdir_root}/support -I#{srcdir_root}/test #{srcdir_root}/test/test_all.rb")
14
14
  Dir.chdir old
15
15
  end
16
16
 
@@ -120,8 +120,8 @@ install_files['oci8lib.so'] = <<-EOS
120
120
  install_files['oci8.rb'] = <<-EOS
121
121
  #{get_zcontent('lib/oci8.rb')}EOS
122
122
 
123
- install_files['dbd/OCI8.rb'] = <<-EOS
124
- #{get_zcontent('lib/dbd/OCI8.rb')}EOS
123
+ install_files['DBD/OCI8/OCI8.rb'] = <<-EOS
124
+ #{get_zcontent('lib/DBD/OCI8/OCI8.rb')}EOS
125
125
 
126
126
  begin
127
127
  installer = Installer.new(install_files)
@@ -23,20 +23,20 @@ spec = Gem::Specification.new do |s|
23
23
  s.description = <<EOS
24
24
  ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8, Oracle8i, Oracle9i, Oracle10g and Oracle Instant Client.
25
25
  EOS
26
- s.autorequire = 'oci8'
27
26
  s.has_rdoc = true
28
- s.required_ruby_version = '~> 1.8.0'
29
27
  s.authors = ['KUBO Takehiro']
30
28
  s.platform = gem_platform
31
29
  files = File.read('dist-files').split("\n")
32
30
  if gem_platform == Gem::Platform::RUBY
33
31
  s.require_paths = ['lib']
34
32
  s.extensions << 'ext/oci8/extconf.rb'
33
+ s.required_ruby_version = '>= 1.8.0'
35
34
  else
36
35
  s.require_paths = ['lib', 'ext/oci8']
37
- # exclude C source files.
38
- files.delete_if do |file|
39
- file[0, 4] == 'ext/'
36
+ if RUBY_VERSION =~ /^1\.9\./
37
+ s.required_ruby_version = '~> 1.9.1'
38
+ else
39
+ s.required_ruby_version = '~> 1.8.0'
40
40
  end
41
41
  # check files created by a make command.
42
42
  ['ext/oci8/oci8lib.so', 'lib/oci8.rb'].each do |file|
data/setup.rb CHANGED
@@ -91,7 +91,7 @@ end
91
91
  # Config
92
92
  #
93
93
 
94
- if arg = ARGV.detect{|arg| /\A--rbconfig=/ =~ arg }
94
+ if arg = ARGV.detect{|a| /\A--rbconfig=/ =~ a }
95
95
  ARGV.delete(arg)
96
96
  require arg.split(/=/, 2)[1]
97
97
  $".push 'rbconfig.rb'
@@ -145,7 +145,7 @@ class ConfigTable
145
145
  sodir = "$site-ruby/#{c['arch']}"
146
146
  end
147
147
 
148
- if arg = c['configure_args'].split.detect {|arg| /--with-make-prog=/ =~ arg }
148
+ if arg = c['configure_args'].split.detect {|a| /--with-make-prog=/ =~ a }
149
149
  makeprog = arg.sub(/'/, '').split(/=/, 2)[1]
150
150
  else
151
151
  makeprog = 'make'
@@ -495,7 +495,7 @@ module FileOperations
495
495
  end
496
496
 
497
497
  REJECT_DIRS = %w(
498
- CVS SCCS RCS CVS.adm
498
+ CVS SCCS RCS CVS.adm .svn .git
499
499
  )
500
500
 
501
501
  def all_dirs_in(dirname)
@@ -1163,7 +1163,7 @@ class Installer
1163
1163
  end
1164
1164
 
1165
1165
  def ruby_scripts
1166
- collect_filenames_auto().select {|n| /\.rb\z/ =~ n }
1166
+ collect_filenames_auto().select {|n| /\.(rb|yml)\z/ =~ n }
1167
1167
  end
1168
1168
 
1169
1169
  # picked up many entries from cvs-1.11.1/src/ignore.c
@@ -24,106 +24,86 @@ $lobreadnum = 256 # counts in charactors
24
24
  # $oracle_client_version: Oracle client library version for which oci8 is compiled.
25
25
  # $oracle_version: lower value of $oracle_server_version and $oracle_client_version.
26
26
  conn = OCI8.new($dbuser, $dbpass, $dbname)
27
- conn.exec('select value from database_compatible_level') do |row|
28
- ver = row[0].split('.')
29
- $oracle_server_version = (ver[0] + ver[1] + ver[2]).to_i
27
+ begin
28
+ conn.exec('select value from database_compatible_level') do |row|
29
+ $oracle_server_version = OCI8::OracleVersion.new(row[0])
30
+ end
31
+ rescue OCIError
32
+ raise if $!.code != 942 # ORA-00942: table or view does not exist
33
+ $oracle_server_version = OCI8::ORAVER_8_0
30
34
  end
31
35
  conn.logoff
32
- $oracle_client_version = OCI8::CLIENT_VERSION.to_i
33
- if $oracle_server_version < $oracle_client_version
36
+
37
+ if $oracle_server_version < OCI8.oracle_client_version
34
38
  $oracle_version = $oracle_server_version
35
39
  else
36
- $oracle_version = $oracle_client_version
40
+ $oracle_version = OCI8.oracle_client_version
37
41
  end
38
42
 
39
- if $oracle_version <= 805
40
- $describe_need_object_mode = true
41
- $test_clob = false
42
- elsif $oracle_version < 810
43
- $describe_need_object_mode = false
43
+ if $oracle_version < OCI8::ORAVER_8_1
44
44
  $test_clob = false
45
45
  else
46
- $describe_need_object_mode = false
47
46
  $test_clob = true
48
47
  end
49
48
 
50
- def do_connect ()
51
- begin
52
- yield
53
- rescue OCIError
54
- raise if $!.code != 12516 && $!.code != 12520
55
- # sleep a few seconds and try again if
56
- # the error code is ORA-12516 or ORA-12520.
57
- #
58
- # ORA-12516 - TNS:listener could not find available handler with
59
- # matching protocol stack
60
- # ORA-12520 - TNS:listener could not find available handler for
61
- # requested type of server
62
- #
63
- # Thanks to Christopher Jones.
64
- #
65
- # Ref: The Underground PHP and Oracle Manual (page 175 in vesion 1.4)
66
- # http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf
67
- #
68
- sleep(5)
69
- yield
70
- end
71
- end
72
-
73
- $env_is_initialized = false
74
- def setup_lowapi()
75
- if ! $env_is_initialized
76
- if $describe_need_object_mode
77
- OCIEnv.initialise(OCI_OBJECT)
78
- else
79
- OCIEnv.initialise(OCI_DEFAULT)
80
- end
81
- $env_is_initialized = true
82
- end
83
- env = OCIEnv.init()
84
- svc = do_connect { env.logon($dbuser, $dbpass, $dbname) }
85
- stmt = env.alloc(OCIStmt)
86
- return env, svc, stmt
87
- end
88
-
89
- def get_oci_connection()
90
- do_connect { OCI8.new($dbuser, $dbpass, $dbname) }
91
- end
49
+ module Test
50
+ module Unit
51
+ class TestCase
92
52
 
93
- def get_dbi_connection()
94
- do_connect { DBI.connect("dbi:OCI8:#{$dbname}", $dbuser, $dbpass, 'AutoCommit' => false) }
95
- end
53
+ def get_oci8_connection()
54
+ OCI8.new($dbuser, $dbpass, $dbname)
55
+ rescue OCIError
56
+ raise if $!.code != 12516 && $!.code != 12520
57
+ # sleep a few second and try again if
58
+ # the error code is ORA-12516 or ORA-12520.
59
+ #
60
+ # ORA-12516 - TNS:listener could not find available handler with
61
+ # matching protocol stack
62
+ # ORA-12520 - TNS:listener could not find available handler for
63
+ # requested type of server
64
+ #
65
+ # Thanks to Christopher Jones.
66
+ #
67
+ # Ref: The Underground PHP and Oracle Manual (page 175 in vesion 1.4)
68
+ # http://www.oracle.com/technology/tech/php/pdf/underground-php-oracle-manual.pdf
69
+ #
70
+ sleep(5)
71
+ OCI8.new($dbuser, $dbpass, $dbname)
72
+ end
96
73
 
97
- module RUNIT
98
- class TestCase
99
- def drop_table(table_name)
100
- if $oracle_server_version < 1000
101
- # Oracle 8 - 9i
102
- sql = "DROP TABLE #{table_name}"
103
- else
104
- # Oracle 10g -
105
- sql = "DROP TABLE #{table_name} PURGE"
74
+ def get_dbi_connection()
75
+ DBI.connect("dbi:OCI8:#{$dbname}", $dbuser, $dbpass, 'AutoCommit' => false)
76
+ rescue DBI::DatabaseError
77
+ raise if $!.err != 12516 && $!.err != 12520
78
+ # same as get_oci8_connection()
79
+ sleep(5)
80
+ DBI.connect("dbi:OCI8:#{$dbname}", $dbuser, $dbpass, 'AutoCommit' => false)
106
81
  end
107
82
 
108
- if defined? @conn
109
- begin
110
- @conn.exec(sql)
111
- rescue OCIError
112
- raise if $!.code != 942 # table or view does not exist
113
- end
114
- elsif defined? @dbh
115
- begin
116
- @dbh.do(sql)
117
- rescue DBI::DatabaseError
118
- raise if $!.err != 942 # table or view does not exist
83
+ def drop_table(table_name)
84
+ if $oracle_server_version < OCI8::ORAVER_10_1
85
+ # Oracle 8 - 9i
86
+ sql = "DROP TABLE #{table_name}"
87
+ else
88
+ # Oracle 10g -
89
+ sql = "DROP TABLE #{table_name} PURGE"
119
90
  end
120
- elsif defined? @stmt
121
- begin
122
- @stmt.prepare(sql).execute(@svc)
123
- rescue OCIError
124
- raise if $!.code != 942 # table or view does not exist
91
+
92
+ if defined? @conn
93
+ begin
94
+ @conn.exec(sql)
95
+ rescue OCIError
96
+ raise if $!.code != 942 # table or view does not exist
97
+ end
98
+ elsif instance_variable_get(:@dbh)
99
+ begin
100
+ @dbh.do(sql)
101
+ rescue DBI::DatabaseError
102
+ raise if $!.err != 942 # table or view does not exist
103
+ end
125
104
  end
126
- end
127
- end # drop_table
105
+ end # drop_table
106
+ end
128
107
  end
129
108
  end
109
+
@@ -1,48 +1,41 @@
1
- require 'runit/testsuite'
2
- require 'runit/cui/testrunner'
3
-
4
1
  srcdir = File.dirname(__FILE__)
5
2
 
6
- # Low-level API
3
+ require 'oci8'
4
+ require 'test/unit'
5
+ require "#{srcdir}/config"
6
+
7
7
  require "#{srcdir}/test_oradate"
8
8
  require "#{srcdir}/test_oranumber"
9
- require "#{srcdir}/test_describe"
10
9
  require "#{srcdir}/test_bind_time"
11
10
  require "#{srcdir}/test_bind_raw"
12
11
  if $test_clob
13
12
  require "#{srcdir}/test_clob"
14
13
  end
15
14
 
16
- # High-level API
17
15
  require "#{srcdir}/test_break"
18
16
  require "#{srcdir}/test_oci8"
17
+ require "#{srcdir}/test_datetime"
19
18
  require "#{srcdir}/test_connstr"
20
19
  require "#{srcdir}/test_metadata"
20
+ require "#{srcdir}/test_array_dml"
21
21
  require "#{srcdir}/test_rowid"
22
+ require "#{srcdir}/test_oracle_version"
22
23
 
23
24
  # Ruby/DBI
24
25
  begin
25
26
  require 'dbi'
27
+ is_dbi_loaded = true
26
28
  rescue LoadError
27
- begin
28
- require 'rubygems'
29
- require 'dbi'
30
- rescue LoadError
31
- dbi_not_found = false
32
- end
29
+ is_dbi_loaded = false
33
30
  end
34
- unless dbi_not_found
31
+ if is_dbi_loaded
35
32
  require "#{srcdir}/test_dbi"
36
33
  if $test_clob
37
34
  require "#{srcdir}/test_dbi_clob"
38
35
  end
39
36
  end
40
37
 
41
- suite = RUNIT::TestSuite.new
42
- ObjectSpace.each_object(Class) { |klass|
43
- if klass.ancestors.include?(RUNIT::TestCase)
44
- suite.add_test(klass.suite)
45
- end
46
- }
47
- #RUNIT::CUI::TestRunner.quiet_mode = true
48
- RUNIT::CUI::TestRunner.run(suite)
38
+ #Test::Unit::AutoRunner.run(true, true)
39
+ if defined? Test::Unit::AutoRunner
40
+ Test::Unit::AutoRunner.run()
41
+ end