ruby-oci8 2.1.8 → 2.2.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.yardopts +2 -0
- data/ChangeLog +186 -0
- data/Makefile +2 -2
- data/NEWS +64 -5
- data/README.md +10 -8
- data/dist-files +7 -2
- data/docs/install-instant-client.md +7 -5
- data/docs/install-on-osx.md +132 -0
- data/docs/osx-install-dev-tools.png +0 -0
- data/docs/report-installation-issue.md +1 -4
- data/ext/oci8/apiwrap.c.tmpl +0 -4
- data/ext/oci8/apiwrap.yml +2 -62
- data/ext/oci8/bind.c +1 -3
- data/ext/oci8/encoding.c +56 -168
- data/ext/oci8/env.c +0 -46
- data/ext/oci8/error.c +6 -32
- data/ext/oci8/extconf.rb +33 -39
- data/ext/oci8/lob.c +110 -118
- data/ext/oci8/oci8.c +19 -174
- data/ext/oci8/oci8.h +10 -121
- data/ext/oci8/oci8lib.c +26 -69
- data/ext/oci8/ocidatetime.c +4 -46
- data/ext/oci8/ocinumber.c +7 -30
- data/ext/oci8/oraconf.rb +64 -4
- data/ext/oci8/stmt.c +2 -9
- data/ext/oci8/thread_util.c +0 -4
- data/ext/oci8/thread_util.h +0 -12
- data/ext/oci8/util.c +71 -0
- data/ext/oci8/win32.c +1 -25
- data/lib/{oci8.rb.in → oci8.rb} +11 -3
- data/lib/oci8/bindtype.rb +3 -13
- data/lib/oci8/check_load_error.rb +99 -0
- data/lib/oci8/encoding-init.rb +27 -61
- data/lib/oci8/metadata.rb +27 -57
- data/lib/oci8/oci8.rb +17 -18
- data/lib/oci8/properties.rb +1 -9
- data/lib/oci8/version.rb +3 -0
- data/ruby-oci8.gemspec +15 -5
- data/test/test_oci8.rb +14 -2
- data/test/test_package_type.rb +967 -0
- metadata +28 -11
- data/VERSION +0 -1
data/ext/oci8/thread_util.h
CHANGED
@@ -4,7 +4,6 @@
|
|
4
4
|
*
|
5
5
|
* Copyright (C) 2011 KUBO Takehiro <kubo@jiubao.org>
|
6
6
|
*/
|
7
|
-
#ifdef USE_THREAD_LOCAL_ERRHP
|
8
7
|
|
9
8
|
/*
|
10
9
|
* Prepare to execute thread-related functions.
|
@@ -17,14 +16,3 @@ void Init_oci8_thread_util(void);
|
|
17
16
|
* The return value is errno.
|
18
17
|
*/
|
19
18
|
int oci8_run_native_thread(void *(*func)(void *), void *arg);
|
20
|
-
|
21
|
-
#else
|
22
|
-
|
23
|
-
/*
|
24
|
-
* For ruby 1.8 configured without --enable-pthread on Unix.
|
25
|
-
*/
|
26
|
-
|
27
|
-
#define Init_oci8_thread_util() do {} while (0)
|
28
|
-
#define oci8_run_native_thread(func, arg) ((func)(arg), 0)
|
29
|
-
|
30
|
-
#endif
|
data/ext/oci8/util.c
ADDED
@@ -0,0 +1,71 @@
|
|
1
|
+
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
util.c - part of ruby-oci8
|
4
|
+
|
5
|
+
Copyright (C) 2015 Kubo Takehiro <kubo@jiubao.org>
|
6
|
+
*/
|
7
|
+
#if defined __linux && !defined(_GNU_SOURCE)
|
8
|
+
#define _GNU_SOURCE 1
|
9
|
+
#endif
|
10
|
+
#include "oci8.h"
|
11
|
+
#ifdef HAVE_DLADDR
|
12
|
+
#include <dlfcn.h>
|
13
|
+
#endif
|
14
|
+
#ifdef __CYGWIN__
|
15
|
+
#undef boolean
|
16
|
+
#include <windows.h>
|
17
|
+
#endif
|
18
|
+
|
19
|
+
const char *oci8_dll_path(void)
|
20
|
+
{
|
21
|
+
#if defined _WIN32 || defined __CYGWIN__
|
22
|
+
HMODULE hMod = GetModuleHandleA("OCI.DLL");
|
23
|
+
static char buf[MAX_PATH];
|
24
|
+
if (hMod != NULL) {
|
25
|
+
if (GetModuleFileName(hMod, buf, sizeof(buf))) {
|
26
|
+
return buf;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
#elif defined HAVE_DLADDR && defined RTLD_DEFAULT
|
30
|
+
void *addr = dlsym(RTLD_DEFAULT, "OCIEnvCreate");
|
31
|
+
Dl_info info;
|
32
|
+
if (addr != NULL && dladdr(addr, &info)) {
|
33
|
+
return info.dli_fname;
|
34
|
+
}
|
35
|
+
#elif defined HAVE_DLMODINFO && defined HAVE_DLGETNAME && defined RTLD_DEFAULT
|
36
|
+
void *addr = dlsym(RTLD_DEFAULT, "OCIEnvCreate");
|
37
|
+
if (addr != NULL) {
|
38
|
+
struct load_module_desc desc;
|
39
|
+
if (dlmodinfo((uint64_t)addr, &desc, sizeof(desc), NULL, 0, 0) != 0) {
|
40
|
+
return dlgetname(&desc, sizeof(desc), NULL, 0, 0);
|
41
|
+
}
|
42
|
+
}
|
43
|
+
#endif
|
44
|
+
return NULL;
|
45
|
+
}
|
46
|
+
|
47
|
+
/*
|
48
|
+
* Returns the full path of Oracle client library used by the current process.
|
49
|
+
*
|
50
|
+
* @return [String]
|
51
|
+
*/
|
52
|
+
static VALUE dll_path(VALUE module)
|
53
|
+
{
|
54
|
+
const char *path = oci8_dll_path();
|
55
|
+
if (path == NULL) {
|
56
|
+
return Qnil;
|
57
|
+
}
|
58
|
+
return rb_external_str_new_with_enc(path, strlen(path), rb_filesystem_encoding());
|
59
|
+
}
|
60
|
+
|
61
|
+
void Init_oci8_util(VALUE cOCI8)
|
62
|
+
{
|
63
|
+
#if 0
|
64
|
+
/* for yard */
|
65
|
+
cOCIHandle = rb_define_class("OCIHandle", rb_cObject);
|
66
|
+
cOCI8 = rb_define_class("OCI8", cOCIHandle);
|
67
|
+
#endif
|
68
|
+
VALUE mUtil = rb_define_module_under(cOCI8, "Util");
|
69
|
+
|
70
|
+
rb_define_module_function(mUtil, "dll_path", dll_path, 0);
|
71
|
+
}
|
data/ext/oci8/win32.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
win32.c - part of ruby-oci8
|
4
4
|
|
5
|
-
Copyright (C) 2009-
|
5
|
+
Copyright (C) 2009-2015 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*/
|
7
7
|
#include "oci8.h"
|
8
8
|
#ifdef __CYGWIN__
|
@@ -41,29 +41,6 @@ static void raise_error(void)
|
|
41
41
|
rb_raise(rb_eRuntimeError, "%s", msg);
|
42
42
|
}
|
43
43
|
|
44
|
-
/*
|
45
|
-
* Returns the full path of OCI.DLL used by the current process.
|
46
|
-
*
|
47
|
-
* @return [String]
|
48
|
-
*/
|
49
|
-
static VALUE dll_path(VALUE module)
|
50
|
-
{
|
51
|
-
HMODULE hModule;
|
52
|
-
DWORD len;
|
53
|
-
char path[1024];
|
54
|
-
|
55
|
-
hModule = GetModuleHandle("OCI.DLL");
|
56
|
-
if (hModule == NULL) {
|
57
|
-
raise_error();
|
58
|
-
}
|
59
|
-
len = GetModuleFileName(hModule, path, sizeof(path));
|
60
|
-
if (len == 0) {
|
61
|
-
raise_error();
|
62
|
-
}
|
63
|
-
return rb_external_str_new_with_enc(path, len, rb_filesystem_encoding());
|
64
|
-
}
|
65
|
-
|
66
|
-
|
67
44
|
typedef struct {
|
68
45
|
HKEY hKey;
|
69
46
|
HKEY hSubKey;
|
@@ -154,6 +131,5 @@ void Init_oci8_win32(VALUE cOCI8)
|
|
154
131
|
{
|
155
132
|
VALUE mWin32Util = rb_define_module_under(cOCI8, "Win32Util");
|
156
133
|
|
157
|
-
rb_define_module_function(mWin32Util, "dll_path", dll_path, 0);
|
158
134
|
rb_define_module_function(mWin32Util, "enum_homes", enum_homes, 0);
|
159
135
|
}
|
data/lib/{oci8.rb.in → oci8.rb}
RENAMED
@@ -67,12 +67,20 @@ when 'jruby'
|
|
67
67
|
else
|
68
68
|
raise 'unsupported ruby engine: ' + RUBY_ENGINE
|
69
69
|
end
|
70
|
-
require so_basename
|
71
70
|
|
72
|
-
|
71
|
+
begin
|
72
|
+
require so_basename
|
73
|
+
rescue LoadError, OCIError
|
74
|
+
require 'oci8/check_load_error'
|
75
|
+
OCI8::Util::check_load_error($!)
|
76
|
+
raise
|
77
|
+
end
|
78
|
+
|
79
|
+
require 'oci8/version.rb'
|
80
|
+
if OCI8::VERSION != OCI8::LIB_VERSION
|
73
81
|
require 'rbconfig'
|
74
82
|
so_name = so_basename + "." + RbConfig::CONFIG['DLEXT']
|
75
|
-
raise "VERSION MISMATCH! #{so_name} version is #{OCI8::
|
83
|
+
raise "VERSION MISMATCH! #{so_name} version is #{OCI8::LIB_VERSION}, but oci8.rb version is #{OCI8::VERSION}."
|
76
84
|
end
|
77
85
|
|
78
86
|
require 'oci8/encoding-init.rb'
|
data/lib/oci8/bindtype.rb
CHANGED
@@ -115,18 +115,12 @@ class OCI8
|
|
115
115
|
param[:length] = val.size
|
116
116
|
else
|
117
117
|
# byte semantics
|
118
|
-
if OCI8.
|
118
|
+
if OCI8.encoding != val.encoding
|
119
119
|
# If the string encoding is different with NLS_LANG character set,
|
120
120
|
# convert it to get the length.
|
121
121
|
val = val.encode(OCI8.encoding)
|
122
122
|
end
|
123
|
-
|
124
|
-
# ruby 1.8.7 or upper
|
125
|
-
param[:length] = val.bytesize
|
126
|
-
else
|
127
|
-
# ruby 1.8.6 or lower
|
128
|
-
param[:length] = val.size
|
129
|
-
end
|
123
|
+
param[:length] = val.bytesize
|
130
124
|
end
|
131
125
|
else
|
132
126
|
param[:length] = @@minimum_bind_length
|
@@ -166,11 +160,7 @@ class OCI8
|
|
166
160
|
unless param[:length]
|
167
161
|
if val.respond_to? :to_str
|
168
162
|
val = val.to_str
|
169
|
-
|
170
|
-
param[:length] = val.bytesize
|
171
|
-
else
|
172
|
-
param[:length] = val.size
|
173
|
-
end
|
163
|
+
param[:length] = val.bytesize
|
174
164
|
else
|
175
165
|
param[:length] = 400
|
176
166
|
end
|
@@ -0,0 +1,99 @@
|
|
1
|
+
# This file is loaded only on LoadError.
|
2
|
+
|
3
|
+
class OCI8
|
4
|
+
module Util
|
5
|
+
|
6
|
+
case RUBY_PLATFORM
|
7
|
+
when /mswin32|cygwin|mingw32|bccwin32/
|
8
|
+
|
9
|
+
require 'Win32API'
|
10
|
+
MAX_PATH = 260
|
11
|
+
GetModuleFileNameA = Win32API.new('kernel32', 'GetModuleFileNameA', 'PPL', 'L')
|
12
|
+
GetSystemDirectoryA = Win32API.new('kernel32', 'GetSystemDirectoryA', 'PL', 'L')
|
13
|
+
GetWindowsDirectoryA = Win32API.new('kernel32', 'GetWindowsDirectoryA', 'PL', 'L')
|
14
|
+
|
15
|
+
def self.check_os_specific_load_error(exc)
|
16
|
+
case exc.message
|
17
|
+
when /^193: / # "193: %1 is not a valid Win32 application." in English
|
18
|
+
check_win32_pe_arch(exc.message.split(' - ')[1], "ruby-oci8")
|
19
|
+
dll_load_path_list.each do |path|
|
20
|
+
check_win32_pe_arch(File.join(path, '\OCI.DLL'), "Oracle client")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end # self.check_os_specific_load_error
|
24
|
+
|
25
|
+
def self.dll_load_path_list
|
26
|
+
buf = "\0" * MAX_PATH
|
27
|
+
paths = []
|
28
|
+
paths << buf[0, GetModuleFileNameA.call(nil, buf, MAX_PATH)].force_encoding("locale").gsub(/\\[^\\]*$/, '')
|
29
|
+
paths << buf[0, GetSystemDirectoryA.call(buf, MAX_PATH)].force_encoding("locale")
|
30
|
+
paths << buf[0, GetWindowsDirectoryA.call(buf, MAX_PATH)].force_encoding("locale")
|
31
|
+
paths << "."
|
32
|
+
paths + ENV['PATH'].split(';')
|
33
|
+
end # self.dll_load_path_list
|
34
|
+
|
35
|
+
def self.check_win32_pe_arch(filename, package)
|
36
|
+
open(filename, 'rb') do |f|
|
37
|
+
# DOS header.
|
38
|
+
if f.read(2) == 'MZ'
|
39
|
+
f.seek(60, IO::SEEK_SET)
|
40
|
+
pe_offset = f.read(4).unpack('V')[0]
|
41
|
+
f.seek(pe_offset)
|
42
|
+
# PE header.
|
43
|
+
if f.read(4) == "PE\000\000"
|
44
|
+
case f.read(2).unpack('v')[0]
|
45
|
+
when 0x8664
|
46
|
+
if [nil].pack('P').size == 4
|
47
|
+
raise LoadError, "\"#{filename}\" is x64 DLL. Use 32-bit #{package} instead."
|
48
|
+
end
|
49
|
+
return true
|
50
|
+
when 0x014c
|
51
|
+
if [nil].pack('P').size == 8
|
52
|
+
raise LoadError, "\"#{filename}\" is 32-bit DLL. Use x64 #{package} instead."
|
53
|
+
end
|
54
|
+
return true
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
raise LoadError, "\"#{filename}\" is not a valid Win32 application."
|
59
|
+
end
|
60
|
+
nil
|
61
|
+
rescue
|
62
|
+
nil
|
63
|
+
end # self.check_win32_pe_arch
|
64
|
+
|
65
|
+
when /linux/
|
66
|
+
|
67
|
+
def self.check_os_specific_load_error(exc)
|
68
|
+
case exc.message
|
69
|
+
when /^libaio\.so\.1:/ # "libaio.so.1: cannot open shared object file: No such file or directory" in English
|
70
|
+
install_cmd = if File.executable? '/usr/bin/apt-get'
|
71
|
+
'apt-get install libaio1'
|
72
|
+
elsif File.executable? '/usr/bin/yum'
|
73
|
+
'yum install libaio'
|
74
|
+
end
|
75
|
+
if install_cmd
|
76
|
+
raise LoadError, "You need to install libaio.so.1. Run '#{install_cmd}'."
|
77
|
+
else
|
78
|
+
raise LoadError, "You need to install libaio.so.1."
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end # self.check_os_specific_load_error
|
82
|
+
|
83
|
+
else
|
84
|
+
|
85
|
+
def self.check_os_specific_load_error(exc)
|
86
|
+
end
|
87
|
+
|
88
|
+
end # case RUBY_PLATFORM
|
89
|
+
|
90
|
+
def self.check_load_error(exc)
|
91
|
+
check_os_specific_load_error(exc)
|
92
|
+
case exc.message
|
93
|
+
when /^OCI Library Initialization Error/
|
94
|
+
# TODO
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
end # module Util
|
99
|
+
end
|
data/lib/oci8/encoding-init.rb
CHANGED
@@ -5,75 +5,41 @@
|
|
5
5
|
#
|
6
6
|
class OCI8
|
7
7
|
|
8
|
-
|
9
|
-
|
8
|
+
@@client_charset_name = charset_id2name(@@environment_handle.send(:attr_get_ub2, 31))
|
9
|
+
# 31 is OCI_ATTR_ENV_CHARSET_ID.
|
10
10
|
|
11
|
-
if
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
nls_lang = lang
|
23
|
-
break
|
11
|
+
if @@client_charset_name == 'US7ASCII'
|
12
|
+
# Check whether US7ASCII is explicitly set by NLS_LANG or not.
|
13
|
+
nls_lang = ENV['NLS_LANG']
|
14
|
+
if nls_lang.nil? and defined? OCI8::Win32Util
|
15
|
+
if OCI8::Util::dll_path =~ /\\BIN\\OCI\.DLL$/i
|
16
|
+
oracle_home = $`
|
17
|
+
OCI8::Win32Util.enum_homes do |home, lang|
|
18
|
+
if oracle_home == home.upcase
|
19
|
+
nls_lang = lang
|
20
|
+
break
|
21
|
+
end
|
24
22
|
end
|
25
23
|
end
|
26
24
|
end
|
27
|
-
|
28
|
-
|
29
|
-
# extract the charset name.
|
30
|
-
if nls_lang
|
31
|
-
if nls_lang =~ /\.([[:alnum:]]+)$/
|
32
|
-
@@client_charset_name = $1.upcase
|
33
|
-
else
|
34
|
-
raise "Invalid NLS_LANG format: #{nls_lang}"
|
25
|
+
if nls_lang.nil?
|
26
|
+
warn "Warning: NLS_LANG is not set. fallback to US7ASCII."
|
35
27
|
end
|
36
|
-
else
|
37
|
-
warn "Warning: NLS_LANG is not set. fallback to US7ASCII."
|
38
|
-
# @private
|
39
|
-
@@client_charset_name = 'US7ASCII'
|
40
28
|
end
|
41
29
|
|
42
|
-
|
43
|
-
|
44
|
-
if defined? DEFAULT_OCI8_ENCODING
|
45
|
-
enc = DEFAULT_OCI8_ENCODING
|
46
|
-
else
|
47
|
-
require 'yaml'
|
48
|
-
enc = YAML::load_file(File.dirname(__FILE__) + '/encoding.yml')[@@client_charset_name]
|
49
|
-
if enc.nil?
|
50
|
-
raise "Ruby encoding name is not found in encoding.yml for NLS_LANG #{nls_lang}."
|
51
|
-
end
|
52
|
-
if enc.is_a? Array
|
53
|
-
# Use the first available encoding in the array.
|
54
|
-
enc = enc.find do |e| Encoding.find(e) rescue false; end
|
55
|
-
end
|
56
|
-
end
|
57
|
-
OCI8.encoding = enc
|
30
|
+
if defined? DEFAULT_OCI8_ENCODING
|
31
|
+
enc = DEFAULT_OCI8_ENCODING
|
58
32
|
else
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
#
|
67
|
-
|
68
|
-
# ------------ -------- ---------
|
69
|
-
# US7ASCII 7 1
|
70
|
-
# WE8ISO8859P1 8 1
|
71
|
-
# JA16SJIS 16 2
|
72
|
-
# AL32UTF8 32 4
|
73
|
-
# ...
|
74
|
-
OCI8.nls_ratio = (($1.to_i + 7) >> 3)
|
75
|
-
else
|
76
|
-
raise "Unknown NLS character set name format: #{@@client_charset_name}"
|
33
|
+
require 'yaml'
|
34
|
+
yaml_file = File.dirname(__FILE__) + '/encoding.yml'
|
35
|
+
enc = YAML::load_file(yaml_file)[@@client_charset_name]
|
36
|
+
if enc.nil?
|
37
|
+
raise "Cannot convert Oracle charset name #{@@client_charset_name} to Ruby encoding name in #{yaml_file}."
|
38
|
+
end
|
39
|
+
if enc.is_a? Array
|
40
|
+
# Use the first available encoding in the array.
|
41
|
+
enc = enc.find do |e| Encoding.find(e) rescue false; end
|
77
42
|
end
|
78
43
|
end
|
44
|
+
OCI8.encoding = enc
|
79
45
|
end
|
data/lib/oci8/metadata.rb
CHANGED
@@ -996,20 +996,14 @@ class OCI8
|
|
996
996
|
__charset_form
|
997
997
|
end
|
998
998
|
|
999
|
-
|
1000
|
-
|
1001
|
-
|
1002
|
-
|
1003
|
-
def fsprecision
|
1004
|
-
attr_get_ub1(OCI_ATTR_FSPRECISION)
|
1005
|
-
end
|
999
|
+
# The fractional seconds precision of a datetime or interval.
|
1000
|
+
def fsprecision
|
1001
|
+
attr_get_ub1(OCI_ATTR_FSPRECISION)
|
1002
|
+
end
|
1006
1003
|
|
1007
|
-
|
1008
|
-
|
1009
|
-
|
1010
|
-
def lfprecision
|
1011
|
-
attr_get_ub1(OCI_ATTR_LFPRECISION)
|
1012
|
-
end
|
1004
|
+
# The leading field precision of an interval
|
1005
|
+
def lfprecision
|
1006
|
+
attr_get_ub1(OCI_ATTR_LFPRECISION)
|
1013
1007
|
end
|
1014
1008
|
|
1015
1009
|
# character set name if the type attribute is of a string/character type.
|
@@ -1339,30 +1333,18 @@ class OCI8
|
|
1339
1333
|
|
1340
1334
|
## Table 6-13 Attributes Belonging to Columns of Tables or Views
|
1341
1335
|
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
def char_used?
|
1349
|
-
attr_get_ub1(OCI_ATTR_CHAR_USED) != 0
|
1350
|
-
end
|
1351
|
-
|
1352
|
-
# returns the column character length which is the number of
|
1353
|
-
# characters allowed in the column. It is the counterpart of
|
1354
|
-
# OCI8::Metadata::Column#data_size which gets the byte length.
|
1355
|
-
def char_size
|
1356
|
-
attr_get_ub2(OCI_ATTR_CHAR_SIZE)
|
1357
|
-
end
|
1358
|
-
else
|
1359
|
-
def char_used?
|
1360
|
-
false
|
1361
|
-
end
|
1336
|
+
# returns the type of length semantics of the column.
|
1337
|
+
# [<tt>:byte</tt>] byte-length semantics
|
1338
|
+
# [<tt>:char</tt>] character-length semantics.
|
1339
|
+
def char_used?
|
1340
|
+
attr_get_ub1(OCI_ATTR_CHAR_USED) != 0
|
1341
|
+
end
|
1362
1342
|
|
1363
|
-
|
1364
|
-
|
1365
|
-
|
1343
|
+
# returns the column character length which is the number of
|
1344
|
+
# characters allowed in the column. It is the counterpart of
|
1345
|
+
# OCI8::Metadata::Column#data_size which gets the byte length.
|
1346
|
+
def char_size
|
1347
|
+
attr_get_ub2(OCI_ATTR_CHAR_SIZE)
|
1366
1348
|
end
|
1367
1349
|
|
1368
1350
|
# The maximum size of the column. This length is
|
@@ -1445,20 +1427,14 @@ class OCI8
|
|
1445
1427
|
## Table 6-8 Attributes Belonging to Type Attributes
|
1446
1428
|
## But Column also have these.
|
1447
1429
|
|
1448
|
-
|
1449
|
-
|
1450
|
-
|
1451
|
-
|
1452
|
-
def fsprecision
|
1453
|
-
attr_get_ub1(OCI_ATTR_FSPRECISION)
|
1454
|
-
end
|
1430
|
+
# The fractional seconds precision of a datetime or interval.
|
1431
|
+
def fsprecision
|
1432
|
+
attr_get_ub1(OCI_ATTR_FSPRECISION)
|
1433
|
+
end
|
1455
1434
|
|
1456
|
-
|
1457
|
-
|
1458
|
-
|
1459
|
-
def lfprecision
|
1460
|
-
attr_get_ub1(OCI_ATTR_LFPRECISION)
|
1461
|
-
end
|
1435
|
+
# The leading field precision of an interval
|
1436
|
+
def lfprecision
|
1437
|
+
attr_get_ub1(OCI_ATTR_LFPRECISION)
|
1462
1438
|
end
|
1463
1439
|
|
1464
1440
|
# The character set name, if the column is of a string/character type
|
@@ -1677,14 +1653,8 @@ class OCI8
|
|
1677
1653
|
|
1678
1654
|
## Table 6-15 List Attributes
|
1679
1655
|
|
1680
|
-
|
1681
|
-
|
1682
|
-
raise "This feature is unavailable on Oracle 8.0"
|
1683
|
-
end
|
1684
|
-
else
|
1685
|
-
def ltype
|
1686
|
-
attr_get_ub2(OCI_ATTR_LTYPE)
|
1687
|
-
end
|
1656
|
+
def ltype
|
1657
|
+
attr_get_ub2(OCI_ATTR_LTYPE)
|
1688
1658
|
end
|
1689
1659
|
|
1690
1660
|
# convert to array
|