ruby-oci8 1.0.2 → 1.0.3
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.
- data/ChangeLog +35 -0
- data/NEWS +26 -0
- data/VERSION +1 -1
- data/ext/oci8/lob.c +19 -6
- data/ext/oci8/oraconf.rb +31 -20
- data/lib/oci8.rb.in +30 -2
- data/ruby-oci8.spec +1 -1
- metadata +41 -34
data/ChangeLog
CHANGED
@@ -1,3 +1,38 @@
|
|
1
|
+
2008-08-10 KUBO Takehiro <kubo@jiubao.org>
|
2
|
+
* NEWS: add changes between 1.0.2 and 1.0.3.
|
3
|
+
* VERSION: change version to 1.0.3.
|
4
|
+
* ext/oci8/lob.c: add workaround code for a losing character problem
|
5
|
+
when reading CLOB. The problem is happened at the following condition.
|
6
|
+
1. Oracle client version is 10.2.0.4 or 11.1.0.6.
|
7
|
+
(It doesn't depend on Oracle server version.)
|
8
|
+
2. The character set is a variable-length one (e.g. AL32UTF8).
|
9
|
+
(This probmem was reported by Efren Yevale and Thomas Witt and
|
10
|
+
fixed with Thomas Witt's help.)
|
11
|
+
|
12
|
+
2008-08-09 KUBO Takehiro <kubo@jiubao.org>
|
13
|
+
* ext/oci8/lob.c: fix OCILobLocator#getLength for a lob over 1GB,
|
14
|
+
which affect OCI8::LOB#size and OCI8::LOB#read. fix
|
15
|
+
OCILobLocator#read and OCILobLocator#write to set offset over 2BG,
|
16
|
+
which affect OCI8::LOB#read and OCI8::LOB#write.
|
17
|
+
(This probmem was reported by Jonathan Hadders.)
|
18
|
+
|
19
|
+
2008-07-12 KUBO Takehiro <kubo@jiubao.org>
|
20
|
+
* lib/oci8.rb.in: (1) add #to_json to OraDate too.
|
21
|
+
(2) fix a bug when using Oracle 8i and dbd. OCI_ATTR_FSPRECISION
|
22
|
+
is for TIMESTAMP data type which is new in Oracle 9i.
|
23
|
+
(This probmem was reported by Glauco Magnelli.)
|
24
|
+
|
25
|
+
2008-07-07 KUBO Takehiro <kubo@jiubao.org>
|
26
|
+
* lib/oci8.rb.in: fix the problem that OraNumber#to_json returns
|
27
|
+
"{}" when using Rails. (This issue is reported by Alex Moore)
|
28
|
+
Object#to_json is added by active_support. But active_support
|
29
|
+
doesn't know what OraNumber is.
|
30
|
+
* ext/oci8/oraconf.rb: merge chages in ruby-oci8 trunk.
|
31
|
+
|
32
|
+
2008-07-05 KUBO Takehiro <kubo@jiubao.org>
|
33
|
+
* ext/oci8/oraconf.rb: prints more information on checking
|
34
|
+
LD_LIBRARY_PATH.
|
35
|
+
|
1
36
|
2008-06-26 KUBO Takehiro <kubo@jiubao.org>
|
2
37
|
* NEWS: add changes between 1.0.1 and 1.0.2.
|
3
38
|
* VERSION: change version to 1.0.2.
|
data/NEWS
CHANGED
@@ -1,3 +1,29 @@
|
|
1
|
+
1.0.3:
|
2
|
+
|
3
|
+
1. add workaround code for a losing character problem when reading CLOB.
|
4
|
+
(reported by Efren Yevale and Thomas Witt and fixed with Thomas Witt's help.)
|
5
|
+
|
6
|
+
The problem is happened at the following condition.
|
7
|
+
|
8
|
+
(a) Oracle client version is 10.2.0.4 or 11.1.0.6.
|
9
|
+
It doesn't happend when using 10.2.0.3 client or lower.
|
10
|
+
It doesn't depend on Oracle server version.
|
11
|
+
|
12
|
+
(b) The character set is a variable-length one.
|
13
|
+
e.g. AL32UTF8
|
14
|
+
|
15
|
+
2. fix a problem when reading BLOB/CLOB over 1GB.
|
16
|
+
(reported by Jonathan Hadders.)
|
17
|
+
|
18
|
+
3. [rails] fix a problem that OraNumber#to_json returns "{}" when using Rails.
|
19
|
+
(reported by Alex Moore)
|
20
|
+
|
21
|
+
Rails add to_json method. But it doesn't know what OraNumber is.
|
22
|
+
OraNumber#to_json is added for Rails.
|
23
|
+
|
24
|
+
4. [dbi] fix a problem when using Oracle 8i and ruby-dbi.
|
25
|
+
(reported by Glauco MagnelliRemi Gagnon.)
|
26
|
+
|
1
27
|
1.0.2:
|
2
28
|
|
3
29
|
1. add a gemspec file.
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.0.
|
1
|
+
1.0.3
|
data/ext/oci8/lob.c
CHANGED
@@ -55,7 +55,7 @@ static VALUE oci8_lob_get_length(VALUE self, VALUE vsvc)
|
|
55
55
|
rv = OCILobGetLength(svch->hp, h->errhp, h->hp, &len);
|
56
56
|
if (rv != OCI_SUCCESS)
|
57
57
|
oci8_raise(h->errhp, rv, NULL);
|
58
|
-
return
|
58
|
+
return UINT2NUM(len);
|
59
59
|
}
|
60
60
|
|
61
61
|
#ifdef HAVE_OCILOBGETCHUNKSIZE
|
@@ -72,7 +72,7 @@ static VALUE oci8_lob_get_chunk_size(VALUE self, VALUE vsvc)
|
|
72
72
|
rv = OCILobGetChunkSize(svch->hp, h->errhp, h->hp, &len);
|
73
73
|
if (rv != OCI_SUCCESS)
|
74
74
|
oci8_raise(h->errhp, rv, NULL);
|
75
|
-
return
|
75
|
+
return UINT2NUM(len);
|
76
76
|
}
|
77
77
|
#endif
|
78
78
|
|
@@ -101,7 +101,7 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
101
101
|
ub1 csfrm;
|
102
102
|
ub4 amt;
|
103
103
|
sword rv;
|
104
|
-
char buf[
|
104
|
+
char buf[8192]; /* 8192 is chunk size in a platform. */
|
105
105
|
#ifndef OCI8_USE_CALLBACK_LOB_READ
|
106
106
|
size_t buf_size_in_char;
|
107
107
|
#endif
|
@@ -110,8 +110,8 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
110
110
|
rb_scan_args(argc, argv, "32", &vsvc, &voffset, &vamt, &vcsid, &vcsfrm);
|
111
111
|
Get_Handle(self, h); /* 0 */
|
112
112
|
Check_Handle(vsvc, OCISvcCtx, svch); /* 1 */
|
113
|
-
offset =
|
114
|
-
amt =
|
113
|
+
offset = NUM2UINT(voffset); /* 2 */
|
114
|
+
amt = NUM2UINT(vamt); /* 3 */
|
115
115
|
csid = NIL_P(vcsid) ? 0 : NUM2INT(vcsid); /* 4 */
|
116
116
|
csfrm = NIL_P(vcsfrm) ? SQLCS_IMPLICIT : NUM2INT(vcsfrm); /* 5 */
|
117
117
|
|
@@ -137,9 +137,22 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
137
137
|
*/
|
138
138
|
buf_size_in_char = sizeof(buf) / h->u.lob_locator.char_width;
|
139
139
|
do {
|
140
|
+
/* initialize buf in zeros everytime to check a nul characters. */
|
141
|
+
memset(buf, 0, sizeof(buf));
|
140
142
|
rv = OCILobRead(svch->hp, h->errhp, h->hp, &amt, offset, buf, sizeof(buf), NULL, NULL, csid, csfrm);
|
141
143
|
if (rv != OCI_SUCCESS && rv != OCI_NEED_DATA)
|
142
144
|
oci8_raise(h->errhp, rv, NULL);
|
145
|
+
|
146
|
+
/* Workaround when using Oracle 10.2.0.4 or 11.1.0.6 client and
|
147
|
+
* variable-length character set (e.g. AL32UTF8).
|
148
|
+
*
|
149
|
+
* When the above mentioned condition, amt may be shorter. So
|
150
|
+
* amt is increaded until a nul character to know the actually
|
151
|
+
* read size.
|
152
|
+
*/
|
153
|
+
while (amt < sizeof(buf) && buf[amt] != '\0') {
|
154
|
+
amt++;
|
155
|
+
}
|
143
156
|
if (amt == 0)
|
144
157
|
break;
|
145
158
|
/* for fixed size charset, amt is the number of characters stored in buf. */
|
@@ -170,7 +183,7 @@ static VALUE oci8_lob_write(int argc, VALUE *argv, VALUE self)
|
|
170
183
|
rb_scan_args(argc, argv, "32", &vsvc, &voffset, &vbuf, &vcsid, &vcsfrm);
|
171
184
|
Get_Handle(self, h); /* 0 */
|
172
185
|
Check_Handle(vsvc, OCISvcCtx, svch); /* 1 */
|
173
|
-
offset =
|
186
|
+
offset = NUM2UINT(voffset); /* 2 */
|
174
187
|
Get_String(vbuf, buf); /* 3 */
|
175
188
|
csid = NIL_P(vcsid) ? 0 : NUM2INT(vcsid); /* 4 */
|
176
189
|
csfrm = NIL_P(vcsfrm) ? SQLCS_IMPLICIT : NUM2INT(vcsfrm); /* 5 */
|
data/ext/oci8/oraconf.rb
CHANGED
@@ -247,7 +247,7 @@ EOS
|
|
247
247
|
print <<EOS
|
248
248
|
---------------------------------------------------
|
249
249
|
error messages:
|
250
|
-
#{$!.
|
250
|
+
#{$!.to_s}
|
251
251
|
---------------------------------------------------
|
252
252
|
See:
|
253
253
|
* http://ruby-oci8.rubyforge.org/#{lang}/HowToInstall.html
|
@@ -270,7 +270,7 @@ EOS
|
|
270
270
|
private
|
271
271
|
|
272
272
|
def self.check_ic_dir
|
273
|
-
|
273
|
+
puts "checking for load library path... "
|
274
274
|
STDOUT.flush
|
275
275
|
|
276
276
|
# get library load path names
|
@@ -340,24 +340,34 @@ EOS
|
|
340
340
|
glob_name = "#{oci_basename}.#{so_ext}#{oci_glob_postfix}"
|
341
341
|
ld_path = nil
|
342
342
|
file = nil
|
343
|
-
@@ld_envs.
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
343
|
+
@@ld_envs.each do |env|
|
344
|
+
if ENV[env].nil?
|
345
|
+
puts " #{env} is not set."
|
346
|
+
next
|
347
|
+
end
|
348
|
+
puts " #{env}... "
|
349
|
+
ENV[env].split(File::PATH_SEPARATOR).each do |path|
|
350
|
+
next if path.nil? or path == ''
|
351
|
+
print " checking #{path}... "
|
352
|
+
path.gsub!(/\\/, '/') if /mswin32|cygwin|mingw32|bccwin32/ =~ RUBY_PLATFORM
|
353
|
+
files = Dir.glob(File.join(path, glob_name))
|
354
|
+
if files.empty?
|
355
|
+
puts "no"
|
356
|
+
next
|
357
|
+
end
|
358
|
+
STDOUT.flush
|
359
|
+
next if (check_proc && !check_proc.call(files[0]))
|
360
|
+
file = files[0]
|
361
|
+
ld_path = path
|
362
|
+
puts "yes"
|
363
|
+
break
|
364
|
+
end
|
355
365
|
break
|
356
366
|
end
|
357
367
|
|
358
368
|
if ld_path.nil? and RUBY_PLATFORM =~ /linux/
|
359
369
|
open("|/sbin/ldconfig -p") do |f|
|
360
|
-
print "
|
370
|
+
print " checking ld.so.conf... "
|
361
371
|
STDOUT.flush
|
362
372
|
while line = f.gets
|
363
373
|
if line =~ /libclntsh\.so\..* => (\/.*)\/libclntsh\.so\.(.*)/
|
@@ -365,22 +375,22 @@ EOS
|
|
365
375
|
path = $1
|
366
376
|
next if (check_proc && !check_proc.call(file))
|
367
377
|
ld_path = path
|
378
|
+
puts "yes"
|
368
379
|
break
|
369
380
|
end
|
370
381
|
end
|
382
|
+
puts "no"
|
371
383
|
end
|
372
384
|
end
|
373
385
|
|
374
386
|
if ld_path
|
375
387
|
ocidata_basename.each do |basename|
|
376
388
|
if File.exist?(File.join(ld_path, "#{basename}.#{so_ext}"))
|
377
|
-
puts "
|
389
|
+
puts " #{file} looks like an instant client."
|
378
390
|
return ld_path
|
379
391
|
end
|
380
392
|
end
|
381
|
-
puts "
|
382
|
-
else
|
383
|
-
puts " not found"
|
393
|
+
puts " #{file} looks like a full client."
|
384
394
|
end
|
385
395
|
nil
|
386
396
|
end
|
@@ -433,7 +443,8 @@ EOS
|
|
433
443
|
def check_ruby_header
|
434
444
|
print "checking for ruby header... "
|
435
445
|
STDOUT.flush
|
436
|
-
|
446
|
+
rubyhdrdir = Config::CONFIG["rubyhdrdir"] || Config::CONFIG['archdir']
|
447
|
+
unless File.exist?(rubyhdrdir + '/ruby.h')
|
437
448
|
puts "ng"
|
438
449
|
if RUBY_PLATFORM =~ /darwin/ and File.exist?("#{Config::CONFIG['archdir']}/../universal-darwin8.0/ruby.h")
|
439
450
|
raise <<EOS
|
data/lib/oci8.rb.in
CHANGED
@@ -1293,6 +1293,10 @@ class OraDate
|
|
1293
1293
|
out.scalar(taguri, self.to_s, :plain)
|
1294
1294
|
end
|
1295
1295
|
end
|
1296
|
+
|
1297
|
+
def to_json(options=nil) # :nodoc:
|
1298
|
+
to_datetime.to_json(options)
|
1299
|
+
end
|
1296
1300
|
end
|
1297
1301
|
|
1298
1302
|
class OraNumber
|
@@ -1305,6 +1309,10 @@ class OraNumber
|
|
1305
1309
|
out.scalar(taguri, self.to_s, :plain)
|
1306
1310
|
end
|
1307
1311
|
end
|
1312
|
+
|
1313
|
+
def to_json(options=nil) # :nodoc:
|
1314
|
+
to_s
|
1315
|
+
end
|
1308
1316
|
end
|
1309
1317
|
|
1310
1318
|
|
@@ -1564,6 +1572,12 @@ class OCI8
|
|
1564
1572
|
attr_reader :scale
|
1565
1573
|
|
1566
1574
|
# interval
|
1575
|
+
if defined? OCI_ATTR_FSPRECISION and defined? OCI_ATTR_LFPRECISION
|
1576
|
+
# Oracle 8i or upper has OCI_ATTR_FSPRECISION and OCI_ATTR_LFPRECISION
|
1577
|
+
@@is_fsprecision_available = true
|
1578
|
+
else
|
1579
|
+
@@is_fsprecision_available = false
|
1580
|
+
end
|
1567
1581
|
attr_reader :fsprecision
|
1568
1582
|
attr_reader :lfprecision
|
1569
1583
|
|
@@ -1588,8 +1602,22 @@ class OCI8
|
|
1588
1602
|
when 5; :lit_null
|
1589
1603
|
else raise "unknown charset_form #{param.attrGet(OCI_ATTR_CHARSET_FORM)}"
|
1590
1604
|
end
|
1591
|
-
|
1592
|
-
@
|
1605
|
+
|
1606
|
+
@fsprecision = nil
|
1607
|
+
@lfprecision = nil
|
1608
|
+
if @@is_fsprecision_available
|
1609
|
+
begin
|
1610
|
+
@fsprecision = param.attrGet(OCI_ATTR_FSPRECISION)
|
1611
|
+
@lfprecision = param.attrGet(OCI_ATTR_LFPRECISION)
|
1612
|
+
rescue OCIError
|
1613
|
+
raise if $!.code != 24316 # ORA-24316: illegal handle type
|
1614
|
+
# Oracle 8i could not use OCI_ATTR_FSPRECISION and
|
1615
|
+
# OCI_ATTR_LFPRECISION even though it defines these
|
1616
|
+
# constants in oci.h.
|
1617
|
+
@@is_fsprecision_available = false
|
1618
|
+
end
|
1619
|
+
end
|
1620
|
+
|
1593
1621
|
@type_string = __type_string(param)
|
1594
1622
|
end
|
1595
1623
|
|
data/ruby-oci8.spec
CHANGED
metadata
CHANGED
@@ -1,33 +1,26 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.4
|
3
|
-
specification_version: 1
|
4
2
|
name: ruby-oci8
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
date: 2008-06-26 00:00:00 +09:00
|
8
|
-
summary: Ruby interface for Oracle using OCI8 API
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: kubo@jiubao.org
|
12
|
-
homepage: http://ruby-oci8.rubyforge.org
|
13
|
-
rubyforge_project: ruby-oci8
|
14
|
-
description: ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8, Oracle8i, Oracle9i, Oracle10g and Oracle Instant Client.
|
15
|
-
autorequire: oci8
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ~>
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 1.8.0
|
24
|
-
version:
|
4
|
+
version: 1.0.3
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
7
|
- KUBO Takehiro
|
8
|
+
autorequire: oci8
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
|
12
|
+
date: 2008-08-10 00:00:00 +09:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
15
|
+
|
16
|
+
description: ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8, Oracle8i, Oracle9i, Oracle10g and Oracle Instant Client.
|
17
|
+
email: kubo@jiubao.org
|
18
|
+
executables: []
|
19
|
+
|
20
|
+
extensions:
|
21
|
+
- ext/oci8/extconf.rb
|
22
|
+
extra_rdoc_files:
|
23
|
+
- README
|
31
24
|
files:
|
32
25
|
- NEWS
|
33
26
|
- ChangeLog
|
@@ -99,20 +92,34 @@ files:
|
|
99
92
|
- test/test_oradate.rb
|
100
93
|
- test/test_oranumber.rb
|
101
94
|
- test/test_metadata.rb
|
102
|
-
|
103
|
-
-
|
95
|
+
has_rdoc: true
|
96
|
+
homepage: http://ruby-oci8.rubyforge.org
|
97
|
+
post_install_message:
|
104
98
|
rdoc_options:
|
105
99
|
- --main
|
106
100
|
- README
|
107
101
|
- --exclude
|
108
102
|
- ext/*
|
109
|
-
|
110
|
-
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
-
|
103
|
+
require_paths:
|
104
|
+
- lib
|
105
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: 1.8.0
|
110
|
+
version:
|
111
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
|
+
requirements:
|
113
|
+
- - ">="
|
114
|
+
- !ruby/object:Gem::Version
|
115
|
+
version: "0"
|
116
|
+
version:
|
115
117
|
requirements: []
|
116
118
|
|
117
|
-
|
118
|
-
|
119
|
+
rubyforge_project: ruby-oci8
|
120
|
+
rubygems_version: 1.1.1
|
121
|
+
signing_key:
|
122
|
+
specification_version: 2
|
123
|
+
summary: Ruby interface for Oracle using OCI8 API
|
124
|
+
test_files:
|
125
|
+
- test/test_all.rb
|