ruby-oci8 2.2.3 → 2.2.4
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +100 -0
- data/NEWS +39 -0
- data/README.md +16 -8
- data/dist-files +2 -0
- data/docs/bind-array-to-in_cond.md +1 -1
- data/docs/conflicts-local-connections-and-processes.md +7 -4
- data/docs/hanging-after-inactivity.md +61 -0
- data/docs/install-binary-package.md +15 -11
- data/docs/install-full-client.md +18 -21
- data/docs/install-instant-client.md +44 -27
- data/docs/install-on-osx.md +13 -15
- data/docs/platform-specific-issues.md +17 -50
- data/docs/report-installation-issue.md +3 -0
- data/docs/timeout-parameters.md +3 -0
- data/ext/oci8/encoding.c +5 -5
- data/ext/oci8/env.c +8 -2
- data/ext/oci8/error.c +25 -2
- data/ext/oci8/hook_funcs.c +131 -6
- data/ext/oci8/oci8.c +18 -13
- data/ext/oci8/oci8.h +10 -2
- data/ext/oci8/oci8lib.c +129 -2
- data/ext/oci8/ocihandle.c +34 -34
- data/ext/oci8/oraconf.rb +26 -80
- data/ext/oci8/oradate.c +18 -18
- data/ext/oci8/plthook.h +10 -0
- data/ext/oci8/plthook_elf.c +83 -2
- data/ext/oci8/plthook_osx.c +31 -0
- data/ext/oci8/plthook_win32.c +9 -0
- data/ext/oci8/stmt.c +1 -1
- data/lib/oci8.rb +38 -1
- data/lib/oci8/cursor.rb +9 -8
- data/lib/oci8/oci8.rb +7 -3
- data/lib/oci8/properties.rb +22 -0
- data/lib/oci8/version.rb +1 -1
- data/ruby-oci8.gemspec +1 -5
- data/test/test_all.rb +1 -0
- data/test/test_bind_integer.rb +47 -0
- data/test/test_connstr.rb +29 -13
- data/test/test_oci8.rb +1 -1
- metadata +5 -3
data/ext/oci8/plthook.h
CHANGED
@@ -43,14 +43,24 @@
|
|
43
43
|
#define PLTHOOK_INVALID_ARGUMENT 4
|
44
44
|
#define PLTHOOK_OUT_OF_MEMORY 5
|
45
45
|
#define PLTHOOK_INTERNAL_ERROR 6
|
46
|
+
#define PLTHOOK_NOT_IMPLEMENTED 7
|
46
47
|
|
47
48
|
typedef struct plthook plthook_t;
|
48
49
|
|
50
|
+
#ifdef __cplusplus
|
51
|
+
extern "C" {
|
52
|
+
#endif
|
53
|
+
|
49
54
|
int plthook_open(plthook_t **plthook_out, const char *filename);
|
55
|
+
int plthook_open_by_handle(plthook_t **plthook_out, void *handle);
|
50
56
|
int plthook_open_by_address(plthook_t **plthook_out, void *address);
|
51
57
|
int plthook_enum(plthook_t *plthook, unsigned int *pos, const char **name_out, void ***addr_out);
|
52
58
|
int plthook_replace(plthook_t *plthook, const char *funcname, void *funcaddr, void **oldfunc);
|
53
59
|
void plthook_close(plthook_t *plthook);
|
54
60
|
const char *plthook_error(void);
|
55
61
|
|
62
|
+
#ifdef __cplusplus
|
63
|
+
}; /* extern "C" */
|
64
|
+
#endif
|
65
|
+
|
56
66
|
#endif
|
data/ext/oci8/plthook_elf.c
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
*
|
7
7
|
* ------------------------------------------------------
|
8
8
|
*
|
9
|
-
* Copyright 2013-
|
9
|
+
* Copyright 2013-2016 Kubo Takehiro <kubo@jiubao.org>
|
10
10
|
*
|
11
11
|
* Redistribution and use in source and binary forms, with or without modification, are
|
12
12
|
* permitted provided that the following conditions are met:
|
@@ -33,6 +33,9 @@
|
|
33
33
|
* or implied, of the authors.
|
34
34
|
*
|
35
35
|
*/
|
36
|
+
#if defined(__sun) && defined(_XOPEN_SOURCE) && !defined(__EXTENSIONS__)
|
37
|
+
#define __EXTENSIONS__
|
38
|
+
#endif
|
36
39
|
#define _GNU_SOURCE
|
37
40
|
#include <stdio.h>
|
38
41
|
#include <stdarg.h>
|
@@ -42,6 +45,7 @@
|
|
42
45
|
#include <limits.h>
|
43
46
|
#include <sys/types.h>
|
44
47
|
#include <sys/stat.h>
|
48
|
+
#include <sys/mman.h>
|
45
49
|
#include <fcntl.h>
|
46
50
|
#include <errno.h>
|
47
51
|
#include <dlfcn.h>
|
@@ -59,6 +63,7 @@
|
|
59
63
|
|
60
64
|
#if defined __linux__
|
61
65
|
#define ELF_OSABI ELFOSABI_SYSV
|
66
|
+
#define ELF_OSABI_ALT ELFOSABI_LINUX
|
62
67
|
#elif defined __sun
|
63
68
|
#define ELF_OSABI ELFOSABI_SOLARIS
|
64
69
|
#elif defined __FreeBSD__
|
@@ -146,10 +151,18 @@ struct plthook {
|
|
146
151
|
size_t dynstr_size;
|
147
152
|
const Elf_Plt_Rel *plt;
|
148
153
|
size_t plt_cnt;
|
154
|
+
#ifdef PT_GNU_RELRO
|
155
|
+
const char *relro_start;
|
156
|
+
const char *relro_end;
|
157
|
+
#endif
|
149
158
|
};
|
150
159
|
|
151
160
|
static char errmsg[512];
|
152
161
|
|
162
|
+
#ifdef PT_GNU_RELRO
|
163
|
+
static size_t page_size;
|
164
|
+
#endif
|
165
|
+
|
153
166
|
static int plthook_open_executable(plthook_t **plthook_out);
|
154
167
|
static int plthook_open_shared_library(plthook_t **plthook_out, const char *filename);
|
155
168
|
static int plthook_open_real(plthook_t **plthook_out, const char *base, const char *filename);
|
@@ -167,6 +180,24 @@ int plthook_open(plthook_t **plthook_out, const char *filename)
|
|
167
180
|
}
|
168
181
|
}
|
169
182
|
|
183
|
+
int plthook_open_by_handle(plthook_t **plthook_out, void *hndl)
|
184
|
+
{
|
185
|
+
struct link_map *lmap = NULL;
|
186
|
+
|
187
|
+
if (hndl == NULL) {
|
188
|
+
set_errmsg("NULL handle");
|
189
|
+
return PLTHOOK_FILE_NOT_FOUND;
|
190
|
+
}
|
191
|
+
if (dlinfo(hndl, RTLD_DI_LINKMAP, &lmap) != 0) {
|
192
|
+
set_errmsg("dlinfo error");
|
193
|
+
return PLTHOOK_FILE_NOT_FOUND;
|
194
|
+
}
|
195
|
+
if (lmap->l_addr == 0 && *lmap->l_name == 0) {
|
196
|
+
return plthook_open_executable(plthook_out);
|
197
|
+
}
|
198
|
+
return plthook_open_real(plthook_out, (const char*)lmap->l_addr, lmap->l_name);
|
199
|
+
}
|
200
|
+
|
170
201
|
int plthook_open_by_address(plthook_t **plthook_out, void *address)
|
171
202
|
{
|
172
203
|
Dl_info info;
|
@@ -229,7 +260,8 @@ static int plthook_open_executable(plthook_t **plthook_out)
|
|
229
260
|
#elif defined __FreeBSD__
|
230
261
|
return plthook_open_shared_library(plthook_out, NULL);
|
231
262
|
#else
|
232
|
-
|
263
|
+
set_errmsg("Opening the main program is not supported on this platform.");
|
264
|
+
return PLTHOOK_NOT_IMPLEMENTED;
|
233
265
|
#endif
|
234
266
|
}
|
235
267
|
|
@@ -260,6 +292,9 @@ static int plthook_open_real(plthook_t **plthook_out, const char *base, const ch
|
|
260
292
|
off_t offset;
|
261
293
|
plthook_t *plthook;
|
262
294
|
int rv;
|
295
|
+
#ifdef PT_GNU_RELRO
|
296
|
+
size_t idx;
|
297
|
+
#endif
|
263
298
|
|
264
299
|
if (base == NULL) {
|
265
300
|
set_errmsg("The base address is zero.");
|
@@ -330,6 +365,29 @@ static int plthook_open_real(plthook_t **plthook_out, const char *base, const ch
|
|
330
365
|
rv = PLTHOOK_INVALID_FILE_FORMAT;
|
331
366
|
goto error_exit;
|
332
367
|
}
|
368
|
+
#ifdef PT_GNU_RELRO
|
369
|
+
if (page_size == 0) {
|
370
|
+
page_size = sysconf(_SC_PAGESIZE);
|
371
|
+
}
|
372
|
+
offset = ehdr->e_phoff;
|
373
|
+
if ((rv = lseek(fd, offset, SEEK_SET)) != offset) {
|
374
|
+
set_errmsg("failed to seek to the program header table.");
|
375
|
+
rv = PLTHOOK_INVALID_FILE_FORMAT;
|
376
|
+
goto error_exit;
|
377
|
+
}
|
378
|
+
for (idx = 0; idx < ehdr->e_phnum; idx++) {
|
379
|
+
Elf_Phdr phdr;
|
380
|
+
if (read(fd, &phdr, sizeof(phdr)) != sizeof(phdr)) {
|
381
|
+
set_errmsg("failed to read the program header table.");
|
382
|
+
rv = PLTHOOK_INVALID_FILE_FORMAT;
|
383
|
+
goto error_exit;
|
384
|
+
}
|
385
|
+
if (phdr.p_type == PT_GNU_RELRO) {
|
386
|
+
plthook->relro_start = plthook->base + phdr.p_vaddr;
|
387
|
+
plthook->relro_end = plthook->relro_start + phdr.p_memsz;
|
388
|
+
}
|
389
|
+
}
|
390
|
+
#endif
|
333
391
|
close(fd);
|
334
392
|
fd = -1;
|
335
393
|
|
@@ -428,10 +486,26 @@ int plthook_replace(plthook_t *plthook, const char *funcname, void *funcaddr, vo
|
|
428
486
|
while ((rv = plthook_enum(plthook, &pos, &name, &addr)) == 0) {
|
429
487
|
if (strncmp(name, funcname, funcnamelen) == 0) {
|
430
488
|
if (name[funcnamelen] == '\0' || name[funcnamelen] == '@') {
|
489
|
+
#ifdef PT_GNU_RELRO
|
490
|
+
void *maddr = NULL;
|
491
|
+
if (plthook->relro_start <= (char*)addr && (char*)addr < plthook->relro_end) {
|
492
|
+
maddr = (void*)((size_t)addr & ~(page_size - 1));
|
493
|
+
if (mprotect(maddr, page_size, PROT_READ | PROT_WRITE) != 0) {
|
494
|
+
set_errmsg("Could not change the process memory protection at %p: %s",
|
495
|
+
maddr, strerror(errno));
|
496
|
+
return PLTHOOK_INTERNAL_ERROR;
|
497
|
+
}
|
498
|
+
}
|
499
|
+
#endif
|
431
500
|
if (oldfunc) {
|
432
501
|
*oldfunc = *addr;
|
433
502
|
}
|
434
503
|
*addr = funcaddr;
|
504
|
+
#ifdef PT_GNU_RELRO
|
505
|
+
if (maddr != NULL) {
|
506
|
+
mprotect(maddr, page_size, PROT_READ);
|
507
|
+
}
|
508
|
+
#endif
|
435
509
|
return 0;
|
436
510
|
}
|
437
511
|
}
|
@@ -477,8 +551,15 @@ static int check_elf_header(const Elf_Ehdr *ehdr)
|
|
477
551
|
return PLTHOOK_INVALID_FILE_FORMAT;
|
478
552
|
}
|
479
553
|
if (ehdr->e_ident[EI_OSABI] != ELF_OSABI) {
|
554
|
+
#ifdef ELF_OSABI_ALT
|
555
|
+
if (ehdr->e_ident[EI_OSABI] != ELF_OSABI_ALT) {
|
556
|
+
set_errmsg("invalid OS ABI: 0x%02x", ehdr->e_ident[EI_OSABI]);
|
557
|
+
return PLTHOOK_INVALID_FILE_FORMAT;
|
558
|
+
}
|
559
|
+
#else
|
480
560
|
set_errmsg("invalid OS ABI: 0x%02x", ehdr->e_ident[EI_OSABI]);
|
481
561
|
return PLTHOOK_INVALID_FILE_FORMAT;
|
562
|
+
#endif
|
482
563
|
}
|
483
564
|
if (ehdr->e_type != ET_EXEC && ehdr->e_type != ET_DYN) {
|
484
565
|
set_errmsg("invalid file type: 0x%04x", ehdr->e_type);
|
data/ext/oci8/plthook_osx.c
CHANGED
@@ -142,6 +142,37 @@ int plthook_open(plthook_t **plthook_out, const char *filename)
|
|
142
142
|
return plthook_open_real(plthook_out, _dyld_get_image_header(idx));
|
143
143
|
}
|
144
144
|
|
145
|
+
int plthook_open_by_handle(plthook_t **plthook_out, void *hndl)
|
146
|
+
{
|
147
|
+
int flags[] = {
|
148
|
+
RTLD_LAZY | RTLD_NOLOAD,
|
149
|
+
RTLD_LAZY | RTLD_NOLOAD | RTLD_FIRST,
|
150
|
+
};
|
151
|
+
int flag_idx;
|
152
|
+
#define NUM_FLAGS (sizeof(flags) / sizeof(flags[0]))
|
153
|
+
|
154
|
+
if (hndl == NULL) {
|
155
|
+
set_errmsg("NULL handle");
|
156
|
+
return PLTHOOK_FILE_NOT_FOUND;
|
157
|
+
}
|
158
|
+
for (flag_idx = 0; flag_idx < NUM_FLAGS; flag_idx++) {
|
159
|
+
const char *image_name = NULL;
|
160
|
+
uint32_t idx = 0;
|
161
|
+
|
162
|
+
do {
|
163
|
+
void *handle = dlopen(image_name, flags[flag_idx]);
|
164
|
+
if (handle != NULL) {
|
165
|
+
dlclose(handle);
|
166
|
+
if (handle == hndl) {
|
167
|
+
return plthook_open_real(plthook_out, _dyld_get_image_header(idx));
|
168
|
+
}
|
169
|
+
}
|
170
|
+
} while ((image_name = _dyld_get_image_name(++idx)) != NULL);
|
171
|
+
}
|
172
|
+
set_errmsg("Cannot find the image correspond to handle %p", hndl);
|
173
|
+
return PLTHOOK_FILE_NOT_FOUND;
|
174
|
+
}
|
175
|
+
|
145
176
|
int plthook_open_by_address(plthook_t **plthook_out, void *address)
|
146
177
|
{
|
147
178
|
Dl_info dlinfo;
|
data/ext/oci8/plthook_win32.c
CHANGED
@@ -93,6 +93,15 @@ int plthook_open(plthook_t **plthook_out, const char *filename)
|
|
93
93
|
return plthook_open_real(plthook_out, hMod);
|
94
94
|
}
|
95
95
|
|
96
|
+
int plthook_open_by_handle(plthook_t **plthook_out, void *hndl)
|
97
|
+
{
|
98
|
+
if (hndl == NULL) {
|
99
|
+
set_errmsg("NULL handle");
|
100
|
+
return PLTHOOK_FILE_NOT_FOUND;
|
101
|
+
}
|
102
|
+
return plthook_open_real(plthook_out, (HMODULE)hndl);
|
103
|
+
}
|
104
|
+
|
96
105
|
int plthook_open_by_address(plthook_t **plthook_out, void *address)
|
97
106
|
{
|
98
107
|
HMODULE hMod;
|
data/ext/oci8/stmt.c
CHANGED
@@ -288,7 +288,7 @@ static VALUE oci8_stmt_fetch(VALUE self, VALUE svc)
|
|
288
288
|
*
|
289
289
|
* Returns the definition of column specified by <i>pos</i>
|
290
290
|
*
|
291
|
-
* @param [
|
291
|
+
* @param [Integer] pos Column position which starts from one
|
292
292
|
* @return [OCI8::Metadata::Base]
|
293
293
|
*
|
294
294
|
* @private
|
data/lib/oci8.rb
CHANGED
@@ -1,4 +1,3 @@
|
|
1
|
-
|
2
1
|
# --*- ruby -*--
|
3
2
|
# This is based on yoshidam's oracle.rb.
|
4
3
|
#
|
@@ -68,12 +67,50 @@ else
|
|
68
67
|
raise 'unsupported ruby engine: ' + RUBY_ENGINE
|
69
68
|
end
|
70
69
|
|
70
|
+
dll_dir = nil
|
71
|
+
begin
|
72
|
+
require 'ruby_installer/runtime' # RubyInstaller2 for Windows
|
73
|
+
|
74
|
+
dll_arch = proc do |file|
|
75
|
+
begin
|
76
|
+
File.open(file, 'rb') do |f|
|
77
|
+
if f.read(2) == 'MZ' # IMAGE_DOS_HEADER.e_magic
|
78
|
+
f.seek(60, IO::SEEK_SET)
|
79
|
+
pe_offset = f.read(4).unpack('V')[0] # IMAGE_DOS_HEADER.e_lfanew
|
80
|
+
f.seek(pe_offset)
|
81
|
+
if f.read(4) == "PE\000\000" # IMAGE_NT_HEADERS.Signature
|
82
|
+
case f.read(2).unpack('v')[0] # IMAGE_FILE_HEADER.Machine
|
83
|
+
when 0x014c # IMAGE_FILE_MACHINE_I386
|
84
|
+
:x86
|
85
|
+
when 0x8664 # IMAGE_FILE_MACHINE_AMD64
|
86
|
+
:x64
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
91
|
+
rescue
|
92
|
+
nil
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
ruby_arch = [nil].pack('P').size == 8 ? :x64 : :x86
|
97
|
+
ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
|
98
|
+
if dll_arch.call(File.join(path, 'OCI.DLL')) == ruby_arch
|
99
|
+
dll_dir = RubyInstaller::Runtime.add_dll_directory(path)
|
100
|
+
break
|
101
|
+
end
|
102
|
+
end
|
103
|
+
rescue LoadError
|
104
|
+
end
|
105
|
+
|
71
106
|
begin
|
72
107
|
require so_basename
|
73
108
|
rescue LoadError, OCIError
|
74
109
|
require 'oci8/check_load_error'
|
75
110
|
OCI8::Util::check_load_error($!)
|
76
111
|
raise
|
112
|
+
ensure
|
113
|
+
dll_dir.remove if dll_dir
|
77
114
|
end
|
78
115
|
|
79
116
|
require 'oci8/version.rb'
|
data/lib/oci8/cursor.rb
CHANGED
@@ -58,15 +58,16 @@ class OCI8
|
|
58
58
|
# # ...or...
|
59
59
|
# cursor.bind_param(':ename', 'SMITH') # bind by name
|
60
60
|
#
|
61
|
-
# To bind as number,
|
62
|
-
#
|
63
|
-
# +type+ and Fixnum or Float to +val+.
|
61
|
+
# To bind as number, set the number intself to +val+. If its initial value
|
62
|
+
# is NULL, please set nil to +type+ and Integer, Float or OraNumber to +val+.
|
64
63
|
#
|
65
64
|
# example:
|
66
|
-
# cursor.bind_param(1, 1234) # bind as
|
65
|
+
# cursor.bind_param(1, 1234) # bind as Integer, Initial value is 1234.
|
67
66
|
# cursor.bind_param(1, 1234.0) # bind as Float, Initial value is 1234.0.
|
68
|
-
# cursor.bind_param(1, nil,
|
67
|
+
# cursor.bind_param(1, nil, Integer) # bind as Integer, Initial value is NULL.
|
69
68
|
# cursor.bind_param(1, nil, Float) # bind as Float, Initial value is NULL.
|
69
|
+
# cursor.bind_param(1, OraNumber(1234)) # bind as OraNumber, Initial value is 1234.
|
70
|
+
# cursor.bind_param(1, nil, OraNumber) # bind as OraNumber, Initial value is NULL.
|
70
71
|
#
|
71
72
|
# In case of binding a string, set the string itself to
|
72
73
|
# +val+. When the bind variable is used as output, set the
|
@@ -379,7 +380,7 @@ class OCI8
|
|
379
380
|
#
|
380
381
|
# FYI: Rails oracle adaptor uses 100 by default.
|
381
382
|
#
|
382
|
-
# @param [
|
383
|
+
# @param [Integer] rows The number of rows to be prefetched
|
383
384
|
def prefetch_rows=(rows)
|
384
385
|
attr_set_ub4(11, rows) # OCI_ATTR_PREFETCH_ROWS(11)
|
385
386
|
end
|
@@ -430,12 +431,12 @@ class OCI8
|
|
430
431
|
# * OCI8::STMT_ALTER
|
431
432
|
# * OCI8::STMT_BEGIN (PL/SQL block which starts with a BEGIN keyword)
|
432
433
|
# * OCI8::STMT_DECLARE (PL/SQL block which starts with a DECLARE keyword)
|
433
|
-
# * Other
|
434
|
+
# * Other Integer value undocumented in Oracle manuals.
|
434
435
|
#
|
435
436
|
# <em>Changes between ruby-oci8 1.0 and 2.0.</em>
|
436
437
|
#
|
437
438
|
# [ruby-oci8 2.0] OCI8::STMT_* are Symbols. (:select_stmt, :update_stmt, etc.)
|
438
|
-
# [ruby-oci8 1.0] OCI8::STMT_* are
|
439
|
+
# [ruby-oci8 1.0] OCI8::STMT_* are Integers. (1, 2, 3, etc.)
|
439
440
|
#
|
440
441
|
def type
|
441
442
|
# http://docs.oracle.com/cd/E11882_01/appdev.112/e10646/ociaahan.htm#sthref5506
|
data/lib/oci8/oci8.rb
CHANGED
@@ -117,8 +117,9 @@ class OCI8
|
|
117
117
|
else
|
118
118
|
tcp_connect_timeout = OCI8::properties[:tcp_connect_timeout]
|
119
119
|
connect_timeout = OCI8::properties[:connect_timeout]
|
120
|
-
|
121
|
-
|
120
|
+
tcp_keepalive = OCI8::properties[:tcp_keepalive]
|
121
|
+
if tcp_connect_timeout || connect_timeout || tcp_keepalive
|
122
|
+
dbname = to_connect_descriptor(dbname, tcp_connect_timeout, connect_timeout, tcp_keepalive)
|
122
123
|
end
|
123
124
|
end
|
124
125
|
if stmt_cache_size
|
@@ -558,7 +559,7 @@ class OCI8
|
|
558
559
|
# and add TRANSPORT_CONNECT_TIMEOUT or CONNECT_TIMEOUT.
|
559
560
|
#
|
560
561
|
# @private
|
561
|
-
def to_connect_descriptor(database, tcp_connect_timeout, connect_timeout)
|
562
|
+
def to_connect_descriptor(database, tcp_connect_timeout, connect_timeout, tcp_keepalive)
|
562
563
|
if @@easy_connect_naming_regex =~ database && ($1 || $2 || $4 || $5 || $6 || $7)
|
563
564
|
connect_data = []
|
564
565
|
connect_data << "(SERVICE_NAME=#$5)"
|
@@ -573,6 +574,9 @@ class OCI8
|
|
573
574
|
if connect_timeout
|
574
575
|
desc << "(CONNECT_TIMEOUT=#{connect_timeout})"
|
575
576
|
end
|
577
|
+
if tcp_keepalive
|
578
|
+
desc << "(ENABLE=BROKEN)"
|
579
|
+
end
|
576
580
|
"(DESCRIPTION=#{desc.join})"
|
577
581
|
else
|
578
582
|
database
|
data/lib/oci8/properties.rb
CHANGED
@@ -17,6 +17,8 @@ class OCI8
|
|
17
17
|
:connect_timeout => nil,
|
18
18
|
:send_timeout => nil,
|
19
19
|
:recv_timeout => nil,
|
20
|
+
:tcp_keepalive => false,
|
21
|
+
:tcp_keepalive_time => nil,
|
20
22
|
}
|
21
23
|
|
22
24
|
# @private
|
@@ -62,6 +64,14 @@ class OCI8
|
|
62
64
|
val = val.to_i
|
63
65
|
raise ArgumentError, "The property value for :#{name} must be nil or a positive integer." if val <= 0
|
64
66
|
end
|
67
|
+
when :tcp_keepalive
|
68
|
+
val = val ? true : false
|
69
|
+
when :tcp_keepalive_time
|
70
|
+
if !val.nil?
|
71
|
+
val = val.to_i
|
72
|
+
raise ArgumentError, "The property value for :#{name} must be nil or a positive integer." if val <= 0
|
73
|
+
end
|
74
|
+
OCI8.__set_prop(4, val)
|
65
75
|
end
|
66
76
|
super(name, val)
|
67
77
|
end
|
@@ -165,6 +175,18 @@ class OCI8
|
|
165
175
|
#
|
166
176
|
# *Since:* 2.2.2
|
167
177
|
#
|
178
|
+
# [:tcp_keepalive]
|
179
|
+
#
|
180
|
+
# See {file:docs/hanging-after-inactivity.md.md}
|
181
|
+
#
|
182
|
+
# *Since:* 2.2.4
|
183
|
+
#
|
184
|
+
# [:tcp_keepalive_time]
|
185
|
+
#
|
186
|
+
# See {file:docs/hanging-after-inactivity.md.md}
|
187
|
+
#
|
188
|
+
# *Since:* 2.2.4
|
189
|
+
#
|
168
190
|
# @return [a customized Hash]
|
169
191
|
# @since 2.0.5
|
170
192
|
#
|
data/lib/oci8/version.rb
CHANGED
data/ruby-oci8.gemspec
CHANGED
@@ -64,11 +64,7 @@ EOS
|
|
64
64
|
raise "No compiled binary are found. Run make in advance."
|
65
65
|
when 1
|
66
66
|
puts "Binary gem for ruby #{so_vers.first}"
|
67
|
-
|
68
|
-
s.required_ruby_version = "~> #{so_vermin}"
|
69
|
-
else
|
70
|
-
s.required_ruby_version = "~> #{so_vermin}.0"
|
71
|
-
end
|
67
|
+
s.required_ruby_version = "~> #{so_vermin}"
|
72
68
|
else
|
73
69
|
puts "Binary gem for ruby #{so_vers.join(', ')}"
|
74
70
|
s.required_ruby_version = ">= #{so_vermin}"
|