ruby-oci8 1.0.5 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
data/ChangeLog CHANGED
@@ -1,3 +1,26 @@
1
+ 2009-05-17 KUBO Takehiro <kubo@jiubao.org>
2
+ * NEWS: add changes between 1.0.5 and 1.0.6.
3
+ * VERSION: change version to 1.0.6.
4
+
5
+ 2009-04-14 KUBO Takehiro <kubo@jiubao.org>
6
+ * ext/oci8/oraconf.rb: Gets ORACLE_HOME from the Windows regitry
7
+ by enumerating subkeys of \\HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE.
8
+
9
+ 2009-04-12 KUBO Takehiro <kubo@jiubao.org>
10
+ * lib/dbd/OCI8.rb: A data dictionary all_constraints doesn't have
11
+ index_name column on Oracle 8i or lower. Rewrite
12
+ DBI::DBD::OCI8::Database#column by using all_cons_columns.
13
+ (backport from ruby-oci8 trunk)
14
+
15
+ 2009-04-12 KUBO Takehiro <kubo@jiubao.org>
16
+ * ext/oci8/extconf.rb, ext/oci8/oci8.h, ext/oci8/oraconf.rb:
17
+ fix a problem when compiling for Oracle 8.0.
18
+ (reported by Axel Reinhold as a ruby-oci8 2.0 issue)
19
+ * lib/dbd/OCI8.rb: fix DBI::DBD::OCI8::BindType::DBIStatementHandle
20
+ to pass a newly added sanity check in dbi 0.4.1.
21
+ (reported by Dirk Herzhauser as a ruby-oci8 2.0 issue)
22
+ * test/test_all.rb: fix to use dbi installed as a rubygem.
23
+
1
24
  2009-03-17 KUBO Takehiro <kubo@jiubao.org>
2
25
  * NEWS: add changes between 1.0.4 and 1.0.5.
3
26
  * VERSION: change version to 1.0.5.
data/NEWS CHANGED
@@ -1,3 +1,17 @@
1
+ 1.0.6:
2
+
3
+ * fix a problem when compiling for Oracle 8.0.
4
+ (reported by Axel Reinhold as a ruby-oci8 2.0 issue)
5
+
6
+ * [dbi] fix to pass a newly added sanity check in dbi 0.4.1.
7
+ (reported by Dirk Herzhauser as a ruby-oci8 2.0 issue)
8
+
9
+ * [dbi] fix dbh#columns for Oracle 8.1 or lower.
10
+ The data dictionary all_constraints doesn't have index_name
11
+ column on Oracle 8i. Rewrite DBI::DBD::OCI8::Database#columns
12
+ by using all_cons_columns.
13
+ (backport from ruby-oci8 trunk)
14
+
1
15
  1.0.5:
2
16
 
3
17
  No changes except who try to install on Mac OS X ppc.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.0.5
1
+ 1.0.6
data/ext/oci8/extconf.rb CHANGED
@@ -44,6 +44,8 @@ $objs = ["oci8.o", "handle.o", "const.o", "env.o", "error.o", "svcctx.o",
44
44
  $CFLAGS += oraconf.cflags
45
45
  $libs += oraconf.libs
46
46
 
47
+ have_type('oratext', 'ociap.h')
48
+
47
49
  # OCIEnvCreate
48
50
  # 8.0.5 - NG
49
51
  # 9.0.1 - OK
data/ext/oci8/oci8.h CHANGED
@@ -52,6 +52,10 @@ extern "C" {
52
52
  #define RARRAY_LEN(obj) RARRAY(obj)->len
53
53
  #endif
54
54
 
55
+ #ifndef HAVE_TYPE_ORATEXT
56
+ typedef unsigned char oratext;
57
+ #endif
58
+
55
59
  #define IS_OCI_ERROR(v) (((v) != OCI_SUCCESS) && ((v) != OCI_SUCCESS_WITH_INFO))
56
60
 
57
61
  #if defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
data/ext/oci8/oraconf.rb CHANGED
@@ -48,48 +48,69 @@ module MiniRegistry
48
48
  # copy the minimum code and reorganize it.
49
49
  ERROR_SUCCESS = 0
50
50
  ERROR_FILE_NOT_FOUND = 2
51
+ ERROR_NO_MORE_ITEMS = 259
51
52
 
52
53
  HKEY_LOCAL_MACHINE = 0x80000002
54
+ KEY_ENUMERATE_SUB_KEYS = 0x0008
55
+ KEY_QUERY_VALUE = 0x0001
53
56
  RegOpenKeyExA = Win32API.new('advapi32', 'RegOpenKeyExA', 'LPLLP', 'L')
57
+ RegEnumKeyExA = Win32API.new('advapi32', 'RegEnumKeyExA', 'LLPPPPPP', 'L')
54
58
  RegQueryValueExA = Win32API.new('advapi32','RegQueryValueExA','LPPPPP','L')
55
59
  RegCloseKey = Win32API.new('advapi32', 'RegCloseKey', 'L', 'L')
56
60
 
57
- def get_reg_value(root, subkey, name)
58
- result = [0].pack('L')
59
- code = RegOpenKeyExA.call(root, subkey, 0, 0x20019, result)
61
+ def self.get_str_value(hKey, name)
62
+ lpcbData = [0].pack('L')
63
+ code = RegQueryValueExA.call(hKey, name, nil, nil, nil, lpcbData)
64
+ if code == ERROR_FILE_NOT_FOUND
65
+ return nil
66
+ elsif code != ERROR_SUCCESS
67
+ raise MiniRegistryError.new("Win32::RegQueryValueExA",code)
68
+ end
69
+ len = lpcbData.unpack('L')[0]
70
+ lpType = [0].pack('L')
71
+ lpData = "\0"*len
72
+ lpcbData = [len].pack('L')
73
+ code = RegQueryValueExA.call(hKey, name, nil, lpType, lpData, lpcbData)
74
+ if code != ERROR_SUCCESS
75
+ raise MiniRegistryError.new("Win32::RegQueryValueExA",code)
76
+ end
77
+ lpData.unpack('Z*')[0]
78
+ end
79
+
80
+ def self.enum_homes
81
+ phkResult = [0].pack('L')
82
+ code = RegOpenKeyExA.call(HKEY_LOCAL_MACHINE, 'SOFTWARE\ORACLE', 0, 0x20019, phkResult)
60
83
  if code != ERROR_SUCCESS
61
84
  raise MiniRegistryError.new("Win32::RegOpenKeyExA", code)
62
85
  end
63
- hkey = result.unpack('L')[0]
64
- begin
65
- lpcbData = [0].pack('L')
66
- code = RegQueryValueExA.call(hkey, name, nil, nil, nil, lpcbData)
67
- if code == ERROR_FILE_NOT_FOUND
68
- return nil
69
- elsif code != ERROR_SUCCESS
70
- raise MiniRegistryError.new("Win32::RegQueryValueExA",code)
86
+ hKey = phkResult.unpack('L')[0]
87
+ idx = 0
88
+ maxkeylen = 256
89
+ loop do
90
+ lpName = "\0" * maxkeylen
91
+ lpcName = [maxkeylen].pack('L')
92
+ code = RegEnumKeyExA.call(hKey, idx, lpName, lpcName, nil, nil, nil, nil);
93
+ break if code == ERROR_NO_MORE_ITEMS
94
+ if code != ERROR_SUCCESS
95
+ RegCloseKey.call(hKey)
96
+ raise MiniRegistryError.new("Win32::RegEnumKeyEx", code)
71
97
  end
72
- len = lpcbData.unpack('L')[0]
73
- lpType = "\0\0\0\0"
74
- lpData = "\0"*len
75
- lpcbData = [len].pack('L')
76
- code = RegQueryValueExA.call(hkey, name, nil, lpType, lpData, lpcbData)
98
+ code = RegOpenKeyExA.call(hKey, lpName, 0, KEY_QUERY_VALUE, phkResult)
77
99
  if code != ERROR_SUCCESS
78
- raise MiniRegistryError.new("Win32::RegQueryValueExA",code)
100
+ RegCloseKey.call(hKey)
101
+ raise MiniRegistryError.new("Win32::RegEnumKeyEx", code)
79
102
  end
80
- lpData.unpack('Z*')[0]
81
- ensure
82
- RegCloseKey.call(hkey)
103
+ hSubkey = phkResult.unpack('L')[0]
104
+
105
+ name = get_str_value(hSubkey, 'ORACLE_HOME_NAME')
106
+ path = get_str_value(hSubkey, 'ORACLE_HOME')
107
+ yield name, path
108
+ RegCloseKey.call(hSubkey)
109
+ idx += 1
83
110
  end
111
+ RegCloseKey.call(hKey)
84
112
  end
85
- def get_local_registry(subkey, name)
86
- get_reg_value(HKEY_LOCAL_MACHINE, subkey, name)
87
- end
88
- else
89
- # UNIX
90
- def get_local_registry(subkey, name)
91
- nil
92
- end
113
+
93
114
  end
94
115
  end # module MiniRegistry
95
116
 
@@ -293,8 +314,6 @@ class MiniSOReader
293
314
  end
294
315
 
295
316
  class OraConf
296
- include MiniRegistry
297
-
298
317
  attr_reader :cc_is_gcc
299
318
  attr_reader :version
300
319
  attr_reader :cflags
@@ -717,6 +736,7 @@ class OraConfFC < OraConf
717
736
  sqlplus = "sqlplus"
718
737
  end
719
738
  Logging::open do
739
+ ENV['NLS_LANG'] = 'american_america.us7ascii'
720
740
  open("|#{@oracle_home}/bin/#{sqlplus} < #{dev_null}") do |f|
721
741
  while line = f.gets
722
742
  print line
@@ -755,26 +775,10 @@ class OraConfFC < OraConf
755
775
  if oracle_home.nil?
756
776
  struct = Struct.new("OracleHome", :name, :path)
757
777
  oracle_homes = []
758
- begin
759
- last_home = get_local_registry("SOFTWARE\\ORACLE\\ALL_HOMES", 'LAST_HOME')
760
- 0.upto last_home.to_i do |id|
761
- oracle_homes << "HOME#{id}"
762
- end
763
- rescue MiniRegistryError
764
- end
765
- oracle_homes << "KEY_XE"
766
- oracle_homes << "KEY_XEClient"
767
- oracle_homes.collect! do |home|
768
- begin
769
- name = get_local_registry("SOFTWARE\\ORACLE\\#{home}", 'ORACLE_HOME_NAME')
770
- path = get_local_registry("SOFTWARE\\ORACLE\\#{home}", 'ORACLE_HOME')
771
- path.chomp!("\\")
772
- struct.new(name, path) if is_valid_home?(path)
773
- rescue MiniRegistryError
774
- nil
775
- end
778
+ MiniRegistry.enum_homes do |name, path|
779
+ path.chomp!("\\") if path
780
+ oracle_homes << struct.new(name, path) if is_valid_home?(path)
776
781
  end
777
- oracle_homes.compact!
778
782
  if oracle_homes.empty?
779
783
  raise <<EOS
780
784
  Set the environment variable ORACLE_HOME if Oracle Full Client.
@@ -944,21 +948,18 @@ EOS
944
948
  end
945
949
  end
946
950
 
947
- # remove object files from libs.
948
- objs = []
949
- libs.gsub!(/\S+\.o\b/) do |obj|
950
- objs << obj
951
- ""
952
- end
953
- # change object files to an archive file to work around.
954
- if objs.length > 0
955
- Logging::open do
956
- puts "change object files to an archive file."
957
- command = Config::CONFIG["AR"] + " cru oracle_objs.a " + objs.join(" ")
958
- puts command
959
- system(command)
960
- libs = "oracle_objs.a " + libs
951
+ # check whether object files are included.
952
+ if /\S+\.o\b/ =~ libs
953
+
954
+ # monkey patching!
955
+ Object.module_eval do
956
+ alias :orig_link_command :link_command
957
+ def link_command(ldflags, opt="", libpath=$DEFLIBPATH|$LIBPATH)
958
+ opt = "" if opt == $libs
959
+ orig_link_command(ldflags, opt, libpath)
960
+ end
961
961
  end
962
+
962
963
  end
963
964
  libs
964
965
  end # get_libs
data/lib/dbd/OCI8.rb CHANGED
@@ -245,19 +245,21 @@ class Database < DBI::BaseDatabase
245
245
 
246
246
  dbh = DBI::DatabaseHandle.new(self)
247
247
 
248
- pk_index_name = nil
248
+ primaries = {}
249
249
  dbh.select_all(<<EOS, tab.obj_schema, tab.obj_name) do |row|
250
- select index_name
251
- from all_constraints
252
- where constraint_type = 'P'
253
- and owner = :1
254
- and table_name = :2
250
+ select column_name
251
+ from all_cons_columns a, all_constraints b
252
+ where a.owner = b.owner
253
+ and a.constraint_name = b.constraint_name
254
+ and a.table_name = b.table_name
255
+ and b.constraint_type = 'P'
256
+ and b.owner = :1
257
+ and b.table_name = :2
255
258
  EOS
256
- pk_index_name = row[0]
259
+ primaries[row[0]] = true
257
260
  end
258
261
 
259
262
  indices = {}
260
- primaries = {}
261
263
  uniques = {}
262
264
  dbh.select_all(<<EOS, tab.obj_schema, tab.obj_name) do |row|
263
265
  select a.column_name, a.index_name, b.uniqueness
@@ -269,7 +271,6 @@ select a.column_name, a.index_name, b.uniqueness
269
271
  EOS
270
272
  col_name, index_name, uniqueness = row
271
273
  indices[col_name] = true
272
- primaries[col_name] = true if index_name == pk_index_name
273
274
  uniques[col_name] = true if uniqueness == 'UNIQUE'
274
275
  end
275
276
 
@@ -401,6 +402,21 @@ class Statement < DBI::BaseStatement
401
402
  end
402
403
  end
403
404
 
405
+ # DBI_STMT_NEW_ARGS is DBI::StatementHandle.new's arguments except +handle+.
406
+ #
407
+ # FYI: DBI::StatementHandle.new method signatures are follows:
408
+ # 0.2.2: handle, fetchable=false, prepared=true
409
+ # 0.4.0: handle, fetchable=false, prepared=true, convert_types=true
410
+ # 0.4.1: handle, fetchable=false, prepared=true, convert_types=true, executed=false
411
+ begin
412
+ DBI::StatementHandle.new(nil, false, true, true, true)
413
+ # dbi 0.4.1
414
+ DBI_STMT_NEW_ARGS = [true, true, true, true] # :nodoc:
415
+ rescue ArgumentError
416
+ # dbi 0.4.0 or lower
417
+ DBI_STMT_NEW_ARGS = [true] # :nodoc:
418
+ end
419
+
404
420
  if defined? ::OCI8::BindType::Base
405
421
  ##
406
422
  ## ruby-oci8 2.0 bind classes.
@@ -490,7 +506,7 @@ if defined? ::OCI8::BindType::Base
490
506
  val = super
491
507
  return nil if val.nil?
492
508
  stmt = DBI::DBD::OCI8::Statement.new(val)
493
- DBI::StatementHandle.new(stmt, true, false)
509
+ DBI::StatementHandle.new(stmt, *DBI_STMT_NEW_ARGS)
494
510
  end
495
511
  end
496
512
  end # BindType
@@ -559,7 +575,7 @@ else
559
575
  return val if val.nil?
560
576
  cur = ::OCI8::Cursor.new(@env, @svc, @ctx, val)
561
577
  stmt = DBI::DBD::OCI8::Statement.new(cur)
562
- DBI::StatementHandle.new(stmt, true, false)
578
+ DBI::StatementHandle.new(stmt, *DBI_STMT_NEW_ARGS)
563
579
  end
564
580
  end
565
581
  end
data/ruby-oci8.spec CHANGED
@@ -3,7 +3,7 @@
3
3
 
4
4
  Summary: ruby interface for Oracle using OCI8 API
5
5
  Name: ruby-oci8
6
- Version: 1.0.5
6
+ Version: 1.0.6
7
7
  Release: 1%{?dist}
8
8
  Group: Development/Libraries
9
9
  License: Ruby License
data/test/test_all.rb CHANGED
@@ -23,11 +23,15 @@ require "#{srcdir}/test_rowid"
23
23
  # Ruby/DBI
24
24
  begin
25
25
  require 'dbi'
26
- is_dbi_loaded = true
27
26
  rescue LoadError
28
- is_dbi_loaded = false
27
+ begin
28
+ require 'rubygems'
29
+ require 'dbi'
30
+ rescue LoadError
31
+ dbi_not_found = false
32
+ end
29
33
  end
30
- if is_dbi_loaded
34
+ unless dbi_not_found
31
35
  require "#{srcdir}/test_dbi"
32
36
  if $test_clob
33
37
  require "#{srcdir}/test_dbi_clob"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby-oci8
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.5
4
+ version: 1.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - KUBO Takehiro
@@ -9,7 +9,7 @@ autorequire: oci8
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-03-18 00:00:00 +09:00
12
+ date: 2009-05-17 00:00:00 +09:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -118,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
118
118
  requirements: []
119
119
 
120
120
  rubyforge_project: ruby-oci8
121
- rubygems_version: 1.2.0
121
+ rubygems_version: 1.3.1
122
122
  signing_key:
123
123
  specification_version: 2
124
124
  summary: Ruby interface for Oracle using OCI8 API