ruby-oci8 2.2.4.1 → 2.2.11
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/ChangeLog +311 -1
- data/NEWS +278 -46
- data/README.md +5 -2
- data/dist-files +8 -4
- data/docs/bind-array-to-in_cond.md +1 -1
- data/docs/install-instant-client.md +2 -1
- data/docs/install-on-osx.md +29 -116
- data/docs/ldap-auth-and-function-interposition.md +123 -0
- data/docs/number-type-mapping.md +79 -0
- data/ext/oci8/apiwrap.c.tmpl +2 -5
- data/ext/oci8/apiwrap.rb +6 -1
- data/ext/oci8/apiwrap.yml +34 -22
- data/ext/oci8/attr.c +4 -2
- data/ext/oci8/bind.c +366 -6
- data/ext/oci8/connection_pool.c +3 -3
- data/ext/oci8/error.c +18 -33
- data/ext/oci8/extconf.rb +7 -4
- data/ext/oci8/hook_funcs.c +128 -51
- data/ext/oci8/lob.c +31 -75
- data/ext/oci8/metadata.c +2 -2
- data/ext/oci8/object.c +72 -27
- data/ext/oci8/oci8.c +27 -119
- data/ext/oci8/oci8.h +21 -3
- data/ext/oci8/oci8lib.c +50 -37
- data/ext/oci8/ocihandle.c +2 -2
- data/ext/oci8/ocinumber.c +22 -16
- data/ext/oci8/oraconf.rb +130 -257
- data/ext/oci8/oradate.c +1 -1
- data/ext/oci8/plthook_elf.c +384 -300
- data/ext/oci8/plthook_osx.c +10 -10
- data/ext/oci8/stmt.c +51 -16
- data/ext/oci8/win32.c +4 -22
- data/lib/oci8/bindtype.rb +1 -15
- data/lib/oci8/check_load_error.rb +57 -10
- data/lib/oci8/cursor.rb +48 -17
- data/lib/oci8/metadata.rb +9 -1
- data/lib/oci8/object.rb +10 -0
- data/lib/oci8/oci8.rb +26 -25
- data/lib/oci8/oracle_version.rb +11 -1
- data/lib/oci8/version.rb +1 -1
- data/lib/oci8.rb +11 -4
- data/lib/ruby-oci8.rb +0 -3
- data/ruby-oci8.gemspec +2 -3
- data/setup.rb +11 -2
- data/test/README.md +37 -0
- data/test/config.rb +1 -1
- data/test/setup_test_object.sql +21 -13
- data/test/setup_test_package.sql +59 -0
- data/test/test_all.rb +1 -0
- data/test/test_bind_boolean.rb +99 -0
- data/test/test_break.rb +11 -9
- data/test/test_clob.rb +4 -16
- data/test/test_datetime.rb +8 -3
- data/test/test_object.rb +33 -9
- data/test/test_oci8.rb +169 -45
- data/test/test_oranumber.rb +12 -6
- data/test/test_package_type.rb +15 -3
- data/test/test_properties.rb +17 -0
- metadata +40 -57
- data/docs/osx-install-dev-tools.png +0 -0
- data/test/README +0 -42
data/ext/oci8/hook_funcs.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* hook.c
|
4
4
|
*
|
5
|
-
* Copyright (C) 2015 Kubo Takehiro <kubo@jiubao.org>
|
5
|
+
* Copyright (C) 2015-2018 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*/
|
7
7
|
#if defined(_WIN32) || defined(__CYGWIN__)
|
8
8
|
#define WINDOWS
|
@@ -12,15 +12,19 @@
|
|
12
12
|
#include "plthook.h"
|
13
13
|
#ifdef __CYGWIN__
|
14
14
|
#undef boolean /* boolean defined in oratypes.h coflicts with that in windows.h */
|
15
|
+
#define stricmp strcasecmp
|
16
|
+
#define strnicmp strncasecmp
|
15
17
|
#endif
|
16
18
|
#ifdef WINDOWS
|
17
19
|
#include <windows.h>
|
18
20
|
#include <mstcpip.h>
|
21
|
+
#include <tlhelp32.h>
|
19
22
|
#else
|
20
23
|
#include <unistd.h>
|
21
24
|
#include <sys/socket.h>
|
22
25
|
#include <netinet/in.h>
|
23
26
|
#include <netinet/tcp.h>
|
27
|
+
#include <dlfcn.h>
|
24
28
|
#endif
|
25
29
|
|
26
30
|
#ifdef WINDOWS
|
@@ -59,6 +63,7 @@ static int WSAAPI hook_setsockopt(SOCKET sockfd, int level, int optname, const v
|
|
59
63
|
int oci8_tcp_keepalive_time = -1;
|
60
64
|
#endif
|
61
65
|
|
66
|
+
static char hook_errmsg[512];
|
62
67
|
|
63
68
|
typedef struct {
|
64
69
|
const char *func_name;
|
@@ -95,35 +100,35 @@ static void socket_entry_clear(socket_entry_t *entry)
|
|
95
100
|
UNLOCK(&lock);
|
96
101
|
}
|
97
102
|
|
98
|
-
static int replace_functions(
|
103
|
+
static int replace_functions(void *addr, const char *file, hook_func_entry_t *functions)
|
99
104
|
{
|
105
|
+
plthook_t *ph;
|
100
106
|
int i;
|
107
|
+
int rv = 0;
|
101
108
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
plthook_close(ph);
|
119
|
-
rb_raise(rb_eRuntimeError, "Could not replace function %s in %s", function->func_name, file);
|
120
|
-
}
|
109
|
+
if (plthook_open_by_address(&ph, addr) != 0) {
|
110
|
+
strncpy(hook_errmsg, plthook_error(), sizeof(hook_errmsg) - 1);
|
111
|
+
hook_errmsg[sizeof(hook_errmsg) - 1] = '\0';
|
112
|
+
return -1;
|
113
|
+
}
|
114
|
+
|
115
|
+
/* install hooks */
|
116
|
+
for (i = 0; functions[i].func_name != NULL ; i++) {
|
117
|
+
hook_func_entry_t *function = &functions[i];
|
118
|
+
rv = plthook_replace(ph, function->func_name, function->func_addr, &function->old_func_addr);
|
119
|
+
if (rv != 0) {
|
120
|
+
strncpy(hook_errmsg, plthook_error(), sizeof(hook_errmsg) - 1);
|
121
|
+
hook_errmsg[sizeof(hook_errmsg) - 1] = '\0';
|
122
|
+
while (--i >= 0) {
|
123
|
+
/*restore hooked fuction address */
|
124
|
+
plthook_replace(ph, functions[i].func_name, functions[i].old_func_addr, NULL);
|
121
125
|
}
|
122
|
-
|
123
|
-
|
126
|
+
snprintf(hook_errmsg, sizeof(hook_errmsg), "Could not replace function %s in %s", function->func_name, file);
|
127
|
+
break;
|
124
128
|
}
|
125
129
|
}
|
126
|
-
|
130
|
+
plthook_close(ph);
|
131
|
+
return rv;
|
127
132
|
}
|
128
133
|
|
129
134
|
#ifdef WINDOWS
|
@@ -142,23 +147,6 @@ static int locK_is_initialized;
|
|
142
147
|
|
143
148
|
static int WSAAPI hook_WSARecv(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount, LPDWORD lpNumberOfBytesRecvd, LPDWORD lpFlags, LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
|
144
149
|
|
145
|
-
static const char * const tcp_func_files[] = {
|
146
|
-
/* full client */
|
147
|
-
"orantcp12.dll",
|
148
|
-
"orantcp11.dll",
|
149
|
-
"orantcp10.dll",
|
150
|
-
"orantcp9.dll",
|
151
|
-
/* instant client basic */
|
152
|
-
"oraociei12.dll",
|
153
|
-
"oraociei11.dll",
|
154
|
-
"oraociei10.dll",
|
155
|
-
/* instant client basic lite */
|
156
|
-
"oraociicus12.dll",
|
157
|
-
"oraociicus11.dll",
|
158
|
-
"oraociicus10.dll",
|
159
|
-
NULL,
|
160
|
-
};
|
161
|
-
|
162
150
|
static hook_func_entry_t tcp_functions[] = {
|
163
151
|
{"WSARecv", (void*)hook_WSARecv, NULL},
|
164
152
|
{"setsockopt", (void*)hook_setsockopt, NULL},
|
@@ -182,6 +170,38 @@ static int WSAAPI hook_WSARecv(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount
|
|
182
170
|
return rv;
|
183
171
|
}
|
184
172
|
|
173
|
+
static int is_target_dll(MODULEENTRY32 *me)
|
174
|
+
{
|
175
|
+
static const char *basenames[] = {
|
176
|
+
"orantcp", // ORACLE_HOME-based client
|
177
|
+
"oraociei", // instant client basic
|
178
|
+
"oraociicus", // instant client basic lite
|
179
|
+
NULL,
|
180
|
+
};
|
181
|
+
const char **basename = basenames;
|
182
|
+
while (*basename != NULL) {
|
183
|
+
if (strnicmp(me->szModule, *basename, strlen(*basename)) == 0) {
|
184
|
+
break;
|
185
|
+
}
|
186
|
+
basename++;
|
187
|
+
}
|
188
|
+
if (*basename == NULL) {
|
189
|
+
return 0;
|
190
|
+
}
|
191
|
+
// basename{zero_or_more_digits}.dll
|
192
|
+
const char *p = me->szModule + strlen(*basename);
|
193
|
+
while ('0' <= *p && *p <= '9') {
|
194
|
+
p++;
|
195
|
+
}
|
196
|
+
if (stricmp(p, ".dll") != 0) {
|
197
|
+
return 0;
|
198
|
+
}
|
199
|
+
if (GetProcAddress((HMODULE)me->modBaseAddr, "nttini") == NULL) {
|
200
|
+
return 0;
|
201
|
+
}
|
202
|
+
return 1;
|
203
|
+
}
|
204
|
+
|
185
205
|
void oci8_install_hook_functions()
|
186
206
|
{
|
187
207
|
static int hook_functions_installed = 0;
|
@@ -190,6 +210,9 @@ void oci8_install_hook_functions()
|
|
190
210
|
DWORD data;
|
191
211
|
DWORD cbData = sizeof(data);
|
192
212
|
const char *reg_key = "SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Parameters";
|
213
|
+
HANDLE hSnapshot;
|
214
|
+
MODULEENTRY32 me;
|
215
|
+
BOOL module_found = FALSE;
|
193
216
|
|
194
217
|
if (hook_functions_installed) {
|
195
218
|
return;
|
@@ -222,7 +245,21 @@ void oci8_install_hook_functions()
|
|
222
245
|
}
|
223
246
|
RegCloseKey(hKey);
|
224
247
|
|
225
|
-
|
248
|
+
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
|
249
|
+
me.dwSize = sizeof(me);
|
250
|
+
if (Module32First(hSnapshot, &me)) {
|
251
|
+
do {
|
252
|
+
if (is_target_dll(&me)) {
|
253
|
+
module_found = TRUE;
|
254
|
+
if (replace_functions(me.modBaseAddr, me.szExePath, tcp_functions) != 0) {
|
255
|
+
CloseHandle(hSnapshot);
|
256
|
+
rb_raise(rb_eRuntimeError, "Hook error: %s", hook_errmsg);
|
257
|
+
}
|
258
|
+
}
|
259
|
+
} while (Module32Next(hSnapshot, &me));
|
260
|
+
}
|
261
|
+
CloseHandle(hSnapshot);
|
262
|
+
if (!module_found) {
|
226
263
|
rb_raise(rb_eRuntimeError, "No DLL is found to hook.");
|
227
264
|
}
|
228
265
|
hook_functions_installed = 1;
|
@@ -247,14 +284,6 @@ static ssize_t hook_read(int fd, void *buf, size_t count);
|
|
247
284
|
#define SO_EXT "so"
|
248
285
|
#endif
|
249
286
|
|
250
|
-
static const char * const files[] = {
|
251
|
-
"libclntsh." SO_EXT ".12.1",
|
252
|
-
"libclntsh." SO_EXT ".11.1",
|
253
|
-
"libclntsh." SO_EXT ".10.1",
|
254
|
-
"libclntsh." SO_EXT ".9.0",
|
255
|
-
NULL,
|
256
|
-
};
|
257
|
-
|
258
287
|
static hook_func_entry_t functions[] = {
|
259
288
|
{"read", (void*)hook_read, NULL},
|
260
289
|
#ifdef SUPPORT_TCP_KEEPALIVE_TIME
|
@@ -279,16 +308,64 @@ static ssize_t hook_read(int fd, void *buf, size_t count)
|
|
279
308
|
return rv;
|
280
309
|
}
|
281
310
|
|
311
|
+
static void *ocifunc_addr(void *dlsym_handle, const char **file)
|
312
|
+
{
|
313
|
+
void *addr = dlsym(dlsym_handle, "OCIEnvCreate");
|
314
|
+
Dl_info dli;
|
315
|
+
|
316
|
+
if (addr == NULL) {
|
317
|
+
return NULL;
|
318
|
+
}
|
319
|
+
if (dladdr(addr, &dli) == 0) {
|
320
|
+
return NULL;
|
321
|
+
}
|
322
|
+
if (strstr(dli.dli_fname, "/libclntsh." SO_EXT) == NULL) {
|
323
|
+
return NULL;
|
324
|
+
}
|
325
|
+
*file = dli.dli_fname;
|
326
|
+
return addr;
|
327
|
+
}
|
328
|
+
|
329
|
+
#ifdef __linux__
|
330
|
+
#include <link.h>
|
331
|
+
static void *ocifunc_addr_linux(const char **file)
|
332
|
+
{
|
333
|
+
struct link_map *lm;
|
334
|
+
for (lm = _r_debug.r_map; lm != NULL; lm = lm->l_next) {
|
335
|
+
if (strstr(lm->l_name, "/libclntsh." SO_EXT) != NULL) {
|
336
|
+
*file = lm->l_name;
|
337
|
+
return (void*)lm->l_addr;
|
338
|
+
}
|
339
|
+
}
|
340
|
+
return NULL;
|
341
|
+
}
|
342
|
+
#endif
|
343
|
+
|
282
344
|
void oci8_install_hook_functions(void)
|
283
345
|
{
|
284
346
|
static int hook_functions_installed = 0;
|
347
|
+
void *addr;
|
348
|
+
const char *file;
|
285
349
|
|
286
350
|
if (hook_functions_installed) {
|
287
351
|
return;
|
288
352
|
}
|
289
|
-
|
353
|
+
addr = ocifunc_addr(RTLD_DEFAULT, &file);
|
354
|
+
if (addr == NULL) {
|
355
|
+
/* OCI symbols may be hooked by LD_PRELOAD. */
|
356
|
+
addr = ocifunc_addr(RTLD_NEXT, &file);
|
357
|
+
}
|
358
|
+
#ifdef __linux__
|
359
|
+
if (addr == NULL) {
|
360
|
+
addr = ocifunc_addr_linux(&file);
|
361
|
+
}
|
362
|
+
#endif
|
363
|
+
if (addr == NULL) {
|
290
364
|
rb_raise(rb_eRuntimeError, "No shared library is found to hook.");
|
291
365
|
}
|
366
|
+
if (replace_functions(addr, file, functions) != 0) {
|
367
|
+
rb_raise(rb_eRuntimeError, "Hook error: %s", hook_errmsg);
|
368
|
+
}
|
292
369
|
hook_functions_installed = 1;
|
293
370
|
}
|
294
371
|
|
data/ext/oci8/lob.c
CHANGED
@@ -26,8 +26,6 @@ static VALUE seek_end;
|
|
26
26
|
|
27
27
|
enum state {
|
28
28
|
S_NO_OPEN_CLOSE,
|
29
|
-
S_OPEN,
|
30
|
-
S_CLOSE,
|
31
29
|
S_BFILE_CLOSE,
|
32
30
|
S_BFILE_OPEN,
|
33
31
|
};
|
@@ -266,28 +264,6 @@ static ub8 oci8_lob_get_length(oci8_lob_t *lob)
|
|
266
264
|
return len;
|
267
265
|
}
|
268
266
|
|
269
|
-
static void lob_open(oci8_lob_t *lob)
|
270
|
-
{
|
271
|
-
if (lob->state == S_CLOSE) {
|
272
|
-
oci8_svcctx_t *svcctx = check_svcctx(lob);
|
273
|
-
|
274
|
-
chker2(OCILobOpen_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, lob->base.hp.lob, OCI_DEFAULT),
|
275
|
-
&svcctx->base);
|
276
|
-
lob->state = S_OPEN;
|
277
|
-
}
|
278
|
-
}
|
279
|
-
|
280
|
-
static void lob_close(oci8_lob_t *lob)
|
281
|
-
{
|
282
|
-
if (lob->state == S_OPEN) {
|
283
|
-
oci8_svcctx_t *svcctx = check_svcctx(lob);
|
284
|
-
|
285
|
-
chker2(OCILobClose_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, lob->base.hp.lob),
|
286
|
-
&svcctx->base);
|
287
|
-
lob->state = S_CLOSE;
|
288
|
-
}
|
289
|
-
}
|
290
|
-
|
291
267
|
static void bfile_close(oci8_lob_t *lob)
|
292
268
|
{
|
293
269
|
if (lob->state == S_BFILE_OPEN) {
|
@@ -368,7 +344,6 @@ static void bfile_close(oci8_lob_t *lob)
|
|
368
344
|
static VALUE oci8_lob_close(VALUE self)
|
369
345
|
{
|
370
346
|
oci8_lob_t *lob = TO_LOB(self);
|
371
|
-
lob_close(lob);
|
372
347
|
oci8_base_free(&lob->base);
|
373
348
|
return self;
|
374
349
|
}
|
@@ -591,7 +566,6 @@ static VALUE oci8_lob_truncate(VALUE self, VALUE len)
|
|
591
566
|
oci8_lob_t *lob = TO_LOB(self);
|
592
567
|
oci8_svcctx_t *svcctx = check_svcctx(lob);
|
593
568
|
|
594
|
-
lob_open(lob);
|
595
569
|
chker2(OCILobTrim2_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, lob->base.hp.lob, NUM2ULL(len)),
|
596
570
|
&svcctx->base);
|
597
571
|
return self;
|
@@ -665,10 +639,9 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
665
639
|
{
|
666
640
|
oci8_lob_t *lob = TO_LOB(self);
|
667
641
|
oci8_svcctx_t *svcctx = check_svcctx(lob);
|
668
|
-
ub8 lob_length;
|
669
|
-
ub8 read_len;
|
670
642
|
ub8 pos = lob->pos;
|
671
|
-
long strbufsiz;
|
643
|
+
long strbufsiz = 512;
|
644
|
+
ub8 sz;
|
672
645
|
ub8 byte_amt;
|
673
646
|
ub8 char_amt;
|
674
647
|
sword rv;
|
@@ -678,36 +651,21 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
678
651
|
ub1 piece = OCI_FIRST_PIECE;
|
679
652
|
|
680
653
|
rb_scan_args(argc, argv, "01", &size);
|
681
|
-
lob_length = oci8_lob_get_length(lob);
|
682
|
-
if (lob_length == 0 && NIL_P(size)) {
|
683
|
-
return rb_usascii_str_new("", 0);
|
684
|
-
}
|
685
|
-
if (lob_length <= pos) /* EOF */
|
686
|
-
return Qnil;
|
687
654
|
if (NIL_P(size)) {
|
688
|
-
|
655
|
+
sz = UB4MAXVAL;
|
689
656
|
} else {
|
690
|
-
|
691
|
-
|
657
|
+
sz = NUM2ULL(size);
|
658
|
+
}
|
659
|
+
if (lob->state == S_BFILE_CLOSE) {
|
660
|
+
open_bfile(svcctx, lob, errhp);
|
692
661
|
}
|
662
|
+
read_more_data:
|
693
663
|
if (lob->lobtype == OCI_TEMP_CLOB) {
|
694
664
|
byte_amt = 0;
|
695
|
-
char_amt =
|
696
|
-
if (oci8_nls_ratio == 1) {
|
697
|
-
strbufsiz = MIN(read_len, ULONG_MAX);
|
698
|
-
} else {
|
699
|
-
strbufsiz = MIN(read_len + read_len / 8, ULONG_MAX);
|
700
|
-
}
|
701
|
-
if (strbufsiz <= 10) {
|
702
|
-
strbufsiz = 10;
|
703
|
-
}
|
665
|
+
char_amt = sz;
|
704
666
|
} else {
|
705
|
-
byte_amt =
|
667
|
+
byte_amt = sz;
|
706
668
|
char_amt = 0;
|
707
|
-
strbufsiz = MIN(read_len, ULONG_MAX);
|
708
|
-
}
|
709
|
-
if (lob->state == S_BFILE_CLOSE) {
|
710
|
-
open_bfile(svcctx, lob, errhp);
|
711
669
|
}
|
712
670
|
do {
|
713
671
|
VALUE strbuf = rb_str_buf_new(strbufsiz);
|
@@ -737,23 +695,30 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
737
695
|
}
|
738
696
|
rb_str_set_len(strbuf, byte_amt);
|
739
697
|
rb_ary_push(v, strbuf);
|
698
|
+
if (strbufsiz < 128 * 1024 * 1024) {
|
699
|
+
strbufsiz *= 2;
|
700
|
+
}
|
740
701
|
} while (rv == OCI_NEED_DATA);
|
741
702
|
|
742
|
-
if (pos
|
743
|
-
|
744
|
-
|
703
|
+
if (NIL_P(size) && pos - lob->pos == sz) {
|
704
|
+
lob->pos = pos;
|
705
|
+
piece = OCI_FIRST_PIECE;
|
706
|
+
goto read_more_data;
|
745
707
|
}
|
746
708
|
lob->pos = pos;
|
747
709
|
switch (RARRAY_LEN(v)) {
|
748
710
|
case 0:
|
749
|
-
|
711
|
+
if (NIL_P(size) && pos == 0) {
|
712
|
+
return rb_usascii_str_new("", 0);
|
713
|
+
} else {
|
714
|
+
return Qnil;
|
715
|
+
}
|
750
716
|
case 1:
|
751
717
|
v = RARRAY_AREF(v, 0);
|
752
718
|
break;
|
753
719
|
default:
|
754
720
|
v = rb_ary_join(v, Qnil);
|
755
721
|
}
|
756
|
-
OBJ_TAINT(v);
|
757
722
|
if (lob->lobtype == OCI_TEMP_CLOB) {
|
758
723
|
/* set encoding */
|
759
724
|
rb_enc_associate(v, oci8_encoding);
|
@@ -781,7 +746,6 @@ static VALUE oci8_lob_write(VALUE self, VALUE data)
|
|
781
746
|
ub8 byte_amt;
|
782
747
|
ub8 char_amt;
|
783
748
|
|
784
|
-
lob_open(lob);
|
785
749
|
if (TYPE(data) != T_STRING) {
|
786
750
|
str = rb_obj_as_string(data);
|
787
751
|
} else {
|
@@ -801,48 +765,40 @@ static VALUE oci8_lob_write(VALUE self, VALUE data)
|
|
801
765
|
RB_GC_GUARD(str);
|
802
766
|
if (lob->lobtype == OCI_TEMP_CLOB) {
|
803
767
|
lob->pos += char_amt;
|
804
|
-
return
|
768
|
+
return ULL2NUM(char_amt);
|
805
769
|
} else {
|
806
770
|
lob->pos += byte_amt;
|
807
|
-
return
|
771
|
+
return ULL2NUM(byte_amt);
|
808
772
|
}
|
809
773
|
}
|
810
774
|
|
811
775
|
/*
|
812
|
-
* @deprecated
|
776
|
+
* @deprecated LOB#sync had not worked by mistake. Do nothing now.
|
813
777
|
* @private
|
814
778
|
*/
|
815
779
|
static VALUE oci8_lob_get_sync(VALUE self)
|
816
780
|
{
|
817
|
-
|
818
|
-
return
|
781
|
+
rb_warning("LOB#sync had not worked by mistake. Do nothing now.");
|
782
|
+
return Qfalse;
|
819
783
|
}
|
820
784
|
|
821
785
|
/*
|
822
|
-
* @deprecated
|
786
|
+
* @deprecated LOB#sync had not worked by mistake. Do nothing now.
|
823
787
|
* @private
|
824
788
|
*/
|
825
789
|
static VALUE oci8_lob_set_sync(VALUE self, VALUE b)
|
826
790
|
{
|
827
|
-
|
828
|
-
if (RTEST(b)) {
|
829
|
-
lob_close(lob);
|
830
|
-
lob->state = S_NO_OPEN_CLOSE;
|
831
|
-
} else {
|
832
|
-
if (lob->state == S_NO_OPEN_CLOSE)
|
833
|
-
lob->state = S_CLOSE;
|
834
|
-
}
|
791
|
+
rb_warning("LOB#sync had not worked by mistake. Do nothing now.");
|
835
792
|
return b;
|
836
793
|
}
|
837
794
|
|
838
795
|
/*
|
839
|
-
* @deprecated
|
796
|
+
* @deprecated LOB#flush had not worked by mistake. Do nothing now.
|
840
797
|
* @private
|
841
798
|
*/
|
842
799
|
static VALUE oci8_lob_flush(VALUE self)
|
843
800
|
{
|
844
|
-
|
845
|
-
lob_close(lob);
|
801
|
+
rb_warning("LOB#flush had not worked by mistake. Do nothing now.");
|
846
802
|
return self;
|
847
803
|
}
|
848
804
|
|
data/ext/oci8/metadata.c
CHANGED
@@ -195,7 +195,7 @@ VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype, VALUE
|
|
195
195
|
static VALUE oci8_describe(VALUE self, VALUE name, VALUE klass, VALUE check_public)
|
196
196
|
{
|
197
197
|
char *str;
|
198
|
-
|
198
|
+
int idx, len;
|
199
199
|
VALUE metadata;
|
200
200
|
VALUE obj_link = Qnil;
|
201
201
|
|
@@ -204,7 +204,7 @@ static VALUE oci8_describe(VALUE self, VALUE name, VALUE klass, VALUE check_publ
|
|
204
204
|
rb_raise(rb_eArgError, "empty string is set.");
|
205
205
|
}
|
206
206
|
str = RSTRING_PTR(name);
|
207
|
-
len =
|
207
|
+
len = RSTRING_LENINT(name);
|
208
208
|
for (idx = 0; idx < len; idx++) {
|
209
209
|
if (str[idx] == '@') {
|
210
210
|
obj_link = rb_enc_str_new(str + idx + 1, len - idx - 1, oci8_encoding);
|