ruby-oci8 2.1.5 → 2.1.6
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 +102 -0
- data/NEWS +41 -0
- data/VERSION +1 -1
- data/ext/oci8/apiwrap.yml +1 -1
- data/ext/oci8/error.c +42 -5
- data/ext/oci8/extconf.rb +7 -14
- data/ext/oci8/lob.c +4 -4
- data/ext/oci8/metadata.c +1 -0
- data/ext/oci8/object.c +5 -5
- data/ext/oci8/oci8.h +13 -1
- data/ext/oci8/oci8lib.c +53 -33
- data/ext/oci8/ocihandle.c +12 -7
- data/ext/oci8/oraconf.rb +8 -6
- data/ext/oci8/stmt.c +2 -2
- data/lib/oci8.rb.in +4 -14
- data/lib/oci8/cursor.rb +2 -0
- data/lib/oci8/metadata.rb +70 -9
- data/lib/oci8/object.rb +23 -0
- data/ruby-oci8.gemspec +1 -1
- data/test/config.rb +76 -66
- data/test/test_all.rb +4 -6
- data/test/test_appinfo.rb +2 -3
- data/test/test_array_dml.rb +6 -7
- data/test/test_bind_raw.rb +1 -2
- data/test/test_bind_string.rb +1 -2
- data/test/test_bind_time.rb +1 -2
- data/test/test_break.rb +2 -3
- data/test/test_clob.rb +1 -2
- data/test/test_connection_pool.rb +2 -3
- data/test/test_connstr.rb +1 -4
- data/test/test_datetime.rb +2 -3
- data/test/test_dbi.rb +1 -2
- data/test/test_dbi_clob.rb +6 -6
- data/test/test_encoding.rb +1 -2
- data/test/test_error.rb +1 -2
- data/test/test_metadata.rb +2086 -898
- data/test/test_object.rb +8 -11
- data/test/test_oci8.rb +1 -2
- data/test/test_oracle_version.rb +1 -3
- data/test/test_oradate.rb +1 -2
- data/test/test_oranumber.rb +5 -6
- data/test/test_rowid.rb +1 -2
- metadata +41 -26
data/ChangeLog
CHANGED
@@ -1,3 +1,105 @@
|
|
1
|
+
2013-12-29 KUBO Takehiro <kubo@jiubao.org>
|
2
|
+
* NEWS: add changes between 2.1.6 and 2.1.5.
|
3
|
+
* VERSION: change the version to 2.1.6.
|
4
|
+
|
5
|
+
2013-12-28 KUBO Takehiro <kubo@jiubao.org>
|
6
|
+
* ext/oci8/oraconf.rb: fix for Windows x64. OCI.lib for MSVC doesn't
|
7
|
+
work with mingw64 compilers. fix URL in the error message.
|
8
|
+
|
9
|
+
2013-12-14 KUBO Takehiro <kubo@jiubao.org>
|
10
|
+
* lib/oci8/metadata.rb, test/test_metadata.rb: fix
|
11
|
+
OCI8::Metadata::Synonym#schema_name and #translated_name
|
12
|
+
for synonyms with a database link and without schema_name.
|
13
|
+
|
14
|
+
2013-12-14 KUBO Takehiro <kubo@jiubao.org>
|
15
|
+
* test/*.rb: suppress warnings "MiniTest::Unit::TestCase is now Minitest::Test"
|
16
|
+
when minitest gem is installed.
|
17
|
+
|
18
|
+
2013-12-14 KUBO Takehiro <kubo@jiubao.org>
|
19
|
+
* test/test_metadata.rb: fix tests in an environment where
|
20
|
+
the data size of "CAST('1' AS CHAR(1 char))" is wrong.
|
21
|
+
|
22
|
+
2013-11-18 KUBO Takehiro <kubo@jiubao.org>
|
23
|
+
* ext/oci8/oraconf.rb: support cygwin x86_64.
|
24
|
+
|
25
|
+
2013-11-10 KUBO Takehiro <kubo@jiubao.org>
|
26
|
+
* ext/oci8/error.c, ext/oci8/lob.c, ext/oci8/object.c, ext/oci8/oci8.h,
|
27
|
+
ext/oci8/oci8lib.c, ext/oci8/ocihandle.c, ext/oci8/stmt.c:
|
28
|
+
use rb_class_new_instance() instead of rb_funcall() with rb_intern("new").
|
29
|
+
|
30
|
+
2013-11-09 KUBO Takehiro <kubo@jiubao.org>
|
31
|
+
* ext/oci8/error.c, ext/oci8/extconf.rb, ext/oci8/oci8.h:
|
32
|
+
append the full path of the Oracle client library when OCIEnvCreate
|
33
|
+
is failed such as "OCI Library Initialization Error - /path/to/libclntsh.so.12.1".
|
34
|
+
|
35
|
+
2013-11-09 KUBO Takehiro <kubo@jiubao.org>
|
36
|
+
* ext/oci8/extconf.rb, lib/oci8.rb.in: support rubinius 2.x whose
|
37
|
+
RUBY_VERSION is 2.1.0.
|
38
|
+
* ext/oci8/oraconf.rb: reduce the size of libOCI.a created for cygwin.
|
39
|
+
|
40
|
+
2013-11-09 KUBO Takehiro <kubo@jiubao.org>
|
41
|
+
* ext/oci8/extconf.rb, lib/oci8.rb.in: support ruby 2.1.0-preview1.
|
42
|
+
(requested by Yasuo Honda)
|
43
|
+
|
44
|
+
2013-08-24 KUBO Takehiro <kubo@jiubao.org>
|
45
|
+
* ext/oci8/oraconf.rb: Use Dir.glob to find the Oracle instant client
|
46
|
+
NLS data file. Its name depends on the Oracle major version on
|
47
|
+
Windows.
|
48
|
+
|
49
|
+
2013-08-03 KUBO Takehiro <kubo@jiubao.org>
|
50
|
+
* lib/oci8/metadata.rb: fix undefined method 'char_used?' when
|
51
|
+
OCI8::Metadata::Argument#inspect is called.
|
52
|
+
* test/test_metadata.rb: refactor and add tests for #inspect methods.
|
53
|
+
* test/test_package_type.rb: add some test data.
|
54
|
+
|
55
|
+
2013-07-30 KUBO Takehiro <kubo@jiubao.org>
|
56
|
+
* ext/oci8/metadata.c, ext/oci8/ocihandle.c, test/test_metadata.rb:
|
57
|
+
Fix segmentation fault when metadata are accessed after the
|
58
|
+
session is disconnected.
|
59
|
+
|
60
|
+
2013-07-24 KUBO Takehiro <kubo@jiubao.org>
|
61
|
+
* lib/oci8/metadata.rb, test/test_package_type.rb:
|
62
|
+
Add OCI8::Metadata::Type#package_name and
|
63
|
+
OCI8::Metadata::ArgBase#has_default?.
|
64
|
+
|
65
|
+
2013-07-22 KUBO Takehiro <kubo@jiubao.org>
|
66
|
+
* ext/oci8/oci8lib.c, lib/oci8.rb.in, lib/oci8/metadata.rb: Add
|
67
|
+
OCI8::Metadata::Package:types to support package type
|
68
|
+
description. It is a new feature of Oracle 12c.
|
69
|
+
* test/setup_test_package.sql, test/test_all.rb,
|
70
|
+
test/test_package_type.rb: Add tests for package type description.
|
71
|
+
|
72
|
+
2013-07-15 KUBO Takehiro <kubo@jiubao.org>
|
73
|
+
* test/*.rb: Use MiniTest instead of Test::Unit.
|
74
|
+
|
75
|
+
2013-06-23 KUBO Takehiro <kubo@jiubao.org>
|
76
|
+
* lib/oci8/cursor.rb, lib/oci8/object.rb: fix to bind object types by
|
77
|
+
name as OCI8::Cursor#bind_param(pos, val, :named_type, typename).
|
78
|
+
* test/test_object.rb: fix to test OCI8::Cursor#bind_param(pos, val,
|
79
|
+
:named_type, typename).
|
80
|
+
|
81
|
+
2013-06-23 KUBO Takehiro <kubo@jiubao.org>
|
82
|
+
* lib/oci8/metadata.rb: OCI8#describe_synonym and OCI8#describe_any
|
83
|
+
accept 'PUBLIC.XXX' as a public synonym name.
|
84
|
+
* test/test_metadata.rb: add tests for OCI8#describe_synonym.
|
85
|
+
|
86
|
+
2013-06-11 KUBO Takehiro <kubo@jiubao.org>
|
87
|
+
* ruby-oci8.gemspec: fix ruby version checking in binary gem.
|
88
|
+
Gem::ruby_version of ruby 2.0.0p195 is 2.0.0.195, which
|
89
|
+
doesn't match '= 2.0.0'.
|
90
|
+
(github issue #36 reported by sodonnel)
|
91
|
+
|
92
|
+
2013-03-30 KUBO Takehiro <kubo@jiubao.org>
|
93
|
+
* ext/oci8/oci8lib.c: fix potential SEGV when one connection
|
94
|
+
is used by more than two threads and temporary lobs are
|
95
|
+
freed by GC.
|
96
|
+
|
97
|
+
2013-03-16 KUBO Takehiro <kubo@jiubao.org>
|
98
|
+
* ext/oci8/apiwrap.yml, ext/oci8/stmt.c: call OCIStmtPrepare2()
|
99
|
+
without GVL to prevent OCI8#parse from blocking ruby itself
|
100
|
+
while the connection is used by another thread even though
|
101
|
+
non-blocking mode is set.
|
102
|
+
|
1
103
|
2013-03-09 KUBO Takehiro <kubo@jiubao.org>
|
2
104
|
* ruby-oci8.gemspec: revert the previous commit because old
|
3
105
|
rubygems doesn't support:
|
data/NEWS
CHANGED
@@ -1,5 +1,46 @@
|
|
1
1
|
# @markup markdown
|
2
2
|
|
3
|
+
2.1.6
|
4
|
+
=====
|
5
|
+
|
6
|
+
New Features
|
7
|
+
------------
|
8
|
+
|
9
|
+
### Support ruby 2.1.0
|
10
|
+
|
11
|
+
### Support cygwin x86_64
|
12
|
+
|
13
|
+
### OCI8#describe_synonym and OCI8#describe_any accept 'PUBLIC.XXX' as a public synonym name.
|
14
|
+
|
15
|
+
Fixed Issues
|
16
|
+
------------
|
17
|
+
|
18
|
+
- fix wrong return valus of OCI8::Metadata::Synonym#schema_name
|
19
|
+
and #translated_name for synonyms with a database link but
|
20
|
+
without schema_name.
|
21
|
+
|
22
|
+
- fix ruby version checking in binary gem. Gem::ruby_version of
|
23
|
+
ruby 2.0.0p195 is 2.0.0.195, which doesn't match '= 2.0.0'.
|
24
|
+
|
25
|
+
(github issue #36 reported by sodonnel)
|
26
|
+
|
27
|
+
- fix SEGV when metadata are accessed after the session is disconnected.
|
28
|
+
|
29
|
+
- fix undefined method 'char_used?' when OCI8::Metadata::Argument#inspect is called.
|
30
|
+
|
31
|
+
- fix tests in an environment where the data size of "CAST('1' AS CHAR(1 char))"
|
32
|
+
is wrong.
|
33
|
+
|
34
|
+
- suppress warnings "MiniTest::Unit::TestCase is now Minitest::Test"
|
35
|
+
when minitest gem is installed.
|
36
|
+
|
37
|
+
- fix SEGV when oci8lib.so is compiled by mingw64 without runtime-check option.
|
38
|
+
Note that binary gems are compiled with runtime-check to check available Oracle
|
39
|
+
client features at runtime.
|
40
|
+
|
41
|
+
- fix SEGV when one connection is used by more than two threads and temporary
|
42
|
+
lobs are freed by GC.
|
43
|
+
|
3
44
|
2.1.5
|
4
45
|
=====
|
5
46
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.1.
|
1
|
+
2.1.6
|
data/ext/oci8/apiwrap.yml
CHANGED
data/ext/oci8/error.c
CHANGED
@@ -5,7 +5,17 @@
|
|
5
5
|
Copyright (C) 2002-2012 KUBO Takehiro <kubo@jiubao.org>
|
6
6
|
|
7
7
|
*/
|
8
|
+
#if defined __linux && !defined(_GNU_SOURCE)
|
9
|
+
#define _GNU_SOURCE 1
|
10
|
+
#endif
|
8
11
|
#include "oci8.h"
|
12
|
+
#ifdef HAVE_DLADDR
|
13
|
+
#include <dlfcn.h>
|
14
|
+
#endif
|
15
|
+
#ifdef __CYGWIN__
|
16
|
+
#undef boolean
|
17
|
+
#include <windows.h>
|
18
|
+
#endif
|
9
19
|
|
10
20
|
#ifndef DLEXT
|
11
21
|
#define DLEXT ".so"
|
@@ -84,6 +94,7 @@ static VALUE oci8_make_exc(dvoid *errhp, sword status, ub4 type, OCIStmt *stmthp
|
|
84
94
|
VALUE parse_error_offset = Qnil;
|
85
95
|
VALUE sql = Qnil;
|
86
96
|
int rv;
|
97
|
+
VALUE args[4];
|
87
98
|
int numarg = 1;
|
88
99
|
|
89
100
|
switch (status) {
|
@@ -137,7 +148,11 @@ static VALUE oci8_make_exc(dvoid *errhp, sword status, ub4 type, OCIStmt *stmthp
|
|
137
148
|
sql = rb_external_str_new_with_enc(TO_CHARPTR(text), size, oci8_encoding);
|
138
149
|
}
|
139
150
|
}
|
140
|
-
|
151
|
+
args[0] = msg;
|
152
|
+
args[1] = INT2FIX(errcode);
|
153
|
+
args[2] = sql;
|
154
|
+
args[3] = parse_error_offset;
|
155
|
+
exc = rb_class_new_instance(numarg, args, exc);
|
141
156
|
return set_backtrace(exc, file, line);
|
142
157
|
}
|
143
158
|
|
@@ -211,8 +226,28 @@ void oci8_do_env_raise(OCIEnv *envhp, sword status, const char *file, int line)
|
|
211
226
|
void oci8_do_raise_init_error(const char *file, int line)
|
212
227
|
{
|
213
228
|
VALUE msg = rb_usascii_str_new_cstr("OCI Library Initialization Error");
|
214
|
-
VALUE exc
|
215
|
-
|
229
|
+
VALUE exc;
|
230
|
+
const char *dll_path = NULL;
|
231
|
+
#if defined _WIN32 || defined __CYGWIN__
|
232
|
+
HMODULE hMod = GetModuleHandleA("OCI.DLL");
|
233
|
+
char buf[MAX_PATH];
|
234
|
+
if (hMod != NULL) {
|
235
|
+
if (GetModuleFileName(hMod, buf, sizeof(buf))) {
|
236
|
+
dll_path = buf;
|
237
|
+
}
|
238
|
+
}
|
239
|
+
#elif defined HAVE_DLADDR
|
240
|
+
void *addr = dlsym(RTLD_DEFAULT, "OCIEnvCreate");
|
241
|
+
Dl_info info;
|
242
|
+
if (addr != NULL && dladdr(addr, &info)) {
|
243
|
+
dll_path = info.dli_fname;
|
244
|
+
}
|
245
|
+
#endif
|
246
|
+
if (dll_path != NULL) {
|
247
|
+
msg = rb_str_buf_cat_ascii(msg, " - ");
|
248
|
+
msg = rb_enc_str_buf_cat(msg, dll_path, strlen(dll_path), rb_filesystem_encoding());
|
249
|
+
}
|
250
|
+
exc = rb_class_new_instance(1, &msg, eOCIError);
|
216
251
|
rb_exc_raise(set_backtrace(exc, file, line));
|
217
252
|
}
|
218
253
|
|
@@ -246,9 +281,11 @@ VALUE oci8_get_error_message(ub4 msgno, const char *default_msg)
|
|
246
281
|
void oci8_do_raise_by_msgno(ub4 msgno, const char *default_msg, const char *file, int line)
|
247
282
|
{
|
248
283
|
VALUE msg = oci8_get_error_message(msgno, default_msg);
|
249
|
-
VALUE
|
284
|
+
VALUE args[2];
|
285
|
+
args[0] = msg;
|
286
|
+
args[1] = INT2FIX(-1);
|
250
287
|
|
251
|
-
rb_exc_raise(set_backtrace(
|
288
|
+
rb_exc_raise(set_backtrace(rb_class_new_instance(2, args, eOCIError), file, line));
|
252
289
|
}
|
253
290
|
|
254
291
|
void oci8_check_error_(sword status, oci8_base_t *base, OCIStmt *stmthp, const char *file, int line)
|
data/ext/oci8/extconf.rb
CHANGED
@@ -103,6 +103,7 @@ if oraconf.cc_is_gcc
|
|
103
103
|
end
|
104
104
|
|
105
105
|
have_func("localtime_r")
|
106
|
+
have_func("dladdr")
|
106
107
|
|
107
108
|
# ruby 1.8 headers
|
108
109
|
have_header("intern.h")
|
@@ -121,6 +122,10 @@ have_func("rb_set_end_proc", "ruby.h")
|
|
121
122
|
have_func("rb_class_superclass", "ruby.h")
|
122
123
|
have_func("rb_thread_blocking_region", "ruby.h")
|
123
124
|
have_func("rb_thread_call_without_gvl", "ruby/thread.h")
|
125
|
+
if (defined? RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
126
|
+
have_func("rb_str_buf_cat_ascii", "ruby.h")
|
127
|
+
have_func("rb_enc_str_buf_cat", "ruby.h")
|
128
|
+
end
|
124
129
|
|
125
130
|
# replace files
|
126
131
|
replace = {
|
@@ -158,8 +163,6 @@ when 'ruby'
|
|
158
163
|
# if it wasn't explicitly changed by the configure option --with-ruby-version.
|
159
164
|
#
|
160
165
|
case RUBY_VERSION
|
161
|
-
when /^2\.0/
|
162
|
-
so_basename += RUBY_VERSION.gsub(/\W/, '')
|
163
166
|
when /^1\.9\.0/
|
164
167
|
raise 'unsupported ruby version: 1.9.0'
|
165
168
|
when /^1\.9/
|
@@ -167,20 +170,10 @@ when 'ruby'
|
|
167
170
|
when /^1\.8/
|
168
171
|
so_basename += '18'
|
169
172
|
else
|
170
|
-
|
173
|
+
so_basename += RUBY_VERSION.gsub(/\W/, '')
|
171
174
|
end
|
172
175
|
when 'rbx'
|
173
|
-
|
174
|
-
case RUBY_VERSION
|
175
|
-
when /^2\.0/
|
176
|
-
so_basename += 'rbx20'
|
177
|
-
when /^1\.9/
|
178
|
-
so_basename += 'rbx19'
|
179
|
-
when /^1\.8/
|
180
|
-
so_basename += 'rbx18'
|
181
|
-
else
|
182
|
-
raise 'unsupported language mode: ' + RUBY_VERSION
|
183
|
-
end
|
176
|
+
so_basename += 'rbx'
|
184
177
|
when 'jruby'
|
185
178
|
raise "Ruby-oci8 doesn't support jruby because its C extension support is in development in jruby 1.6 and deprecated in jruby 1.7."
|
186
179
|
else
|
data/ext/oci8/lob.c
CHANGED
@@ -52,7 +52,7 @@ static VALUE oci8_make_lob(VALUE klass, oci8_svcctx_t *svcctx, OCILobLocator *s)
|
|
52
52
|
boolean is_temp;
|
53
53
|
VALUE lob_obj;
|
54
54
|
|
55
|
-
lob_obj =
|
55
|
+
lob_obj = rb_class_new_instance(1, &svcctx->base.self, klass);
|
56
56
|
lob = DATA_PTR(lob_obj);
|
57
57
|
/* If 's' is a temporary lob, use OCILobLocatorAssign instead. */
|
58
58
|
chker2(OCILobIsTemporary(oci8_envhp, oci8_errhp, s, &is_temp), &svcctx->base);
|
@@ -719,10 +719,10 @@ static VALUE oci8_lob_clone(VALUE self)
|
|
719
719
|
{
|
720
720
|
oci8_lob_t *lob = DATA_PTR(self);
|
721
721
|
oci8_lob_t *newlob;
|
722
|
-
VALUE newobj;
|
722
|
+
VALUE newobj = lob->svcctx ? lob->svcctx->base.self : Qnil;
|
723
723
|
boolean is_temporary;
|
724
724
|
|
725
|
-
newobj =
|
725
|
+
newobj = rb_class_new_instance(1, &newobj, CLASS_OF(self));
|
726
726
|
newlob = DATA_PTR(newobj);
|
727
727
|
if (OCILobIsTemporary(oci8_envhp, oci8_errhp, lob->base.hp.lob, &is_temporary) == OCI_SUCCESS
|
728
728
|
&& is_temporary) {
|
@@ -992,7 +992,7 @@ static void bind_lob_init_elem(oci8_bind_t *obind, VALUE svc)
|
|
992
992
|
ub4 idx = 0;
|
993
993
|
|
994
994
|
do {
|
995
|
-
oho[idx].obj =
|
995
|
+
oho[idx].obj = rb_class_new_instance(1, &svc, *vptr->klass);
|
996
996
|
h = DATA_PTR(oho[idx].obj);
|
997
997
|
oho[idx].hp = h->hp.ptr;
|
998
998
|
} while (++idx < obind->maxar_sz);
|
data/ext/oci8/metadata.c
CHANGED
@@ -154,6 +154,7 @@ static VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype,
|
|
154
154
|
chker2(OCIDescribeAny_nb(svcctx, svcctx->base.hp.svc, oci8_errhp, objptr, objlen,
|
155
155
|
objtype, OCI_DEFAULT, (ub1)FIX2INT(type), desc->hp.dschp),
|
156
156
|
&svcctx->base);
|
157
|
+
oci8_link_to_parent(desc, &svcctx->base);
|
157
158
|
chker2(OCIAttrGet(desc->hp.dschp, OCI_HTYPE_DESCRIBE, &parmhp, 0, OCI_ATTR_PARAM, oci8_errhp),
|
158
159
|
&svcctx->base);
|
159
160
|
return oci8_metadata_create(parmhp, self, obj);
|
data/ext/oci8/object.c
CHANGED
@@ -183,7 +183,7 @@ static VALUE get_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *dat
|
|
183
183
|
case ATTR_NAMED_TYPE:
|
184
184
|
Check_Object(typeinfo, cOCI8TDO);
|
185
185
|
/* Be carefull. Don't use *tmp_obj* out of this function. */
|
186
|
-
tmp_obj =
|
186
|
+
tmp_obj = rb_class_new_instance(0, NULL, cOCI8NamedType);
|
187
187
|
obj = DATA_PTR(tmp_obj);
|
188
188
|
obj->tdo = typeinfo;
|
189
189
|
obj->instancep = (char**)&data;
|
@@ -195,7 +195,7 @@ static VALUE get_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *dat
|
|
195
195
|
case ATTR_NAMED_COLLECTION:
|
196
196
|
Check_Object(typeinfo, cOCI8TDO);
|
197
197
|
/* Be carefull. Don't use *tmp_obj* out of this function. */
|
198
|
-
tmp_obj =
|
198
|
+
tmp_obj = rb_class_new_instance(0, NULL, cOCI8NamedCollection);
|
199
199
|
obj = DATA_PTR(tmp_obj);
|
200
200
|
obj->tdo = typeinfo;
|
201
201
|
obj->instancep = (char**)data;
|
@@ -506,7 +506,7 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
|
|
506
506
|
case ATTR_NAMED_TYPE:
|
507
507
|
Check_Object(typeinfo, cOCI8TDO);
|
508
508
|
/* Be carefull. Don't use *tmp_obj* out of this function. */
|
509
|
-
tmp_obj =
|
509
|
+
tmp_obj = rb_class_new_instance(0, NULL, cOCI8NamedType);
|
510
510
|
obj = DATA_PTR(tmp_obj);
|
511
511
|
obj->tdo = typeinfo;
|
512
512
|
obj->instancep = (char**)&data;
|
@@ -518,7 +518,7 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
|
|
518
518
|
case ATTR_NAMED_COLLECTION:
|
519
519
|
Check_Object(typeinfo, cOCI8TDO);
|
520
520
|
/* Be carefull. Don't use *tmp_obj* out of this function. */
|
521
|
-
tmp_obj =
|
521
|
+
tmp_obj = rb_class_new_instance(0, NULL, cOCI8NamedCollection);
|
522
522
|
obj = DATA_PTR(tmp_obj);
|
523
523
|
obj->tdo = typeinfo;
|
524
524
|
obj->instancep = (char**)data;
|
@@ -626,7 +626,7 @@ static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
|
|
626
626
|
}
|
627
627
|
svcctx = oci8_get_svcctx(svc);
|
628
628
|
do {
|
629
|
-
oho[idx].obj =
|
629
|
+
oho[idx].obj = rb_class_new_instance(0, NULL, klass);
|
630
630
|
obj = DATA_PTR(oho[idx].obj);
|
631
631
|
obj->tdo = obind->tdo;
|
632
632
|
obj->instancep = (char**)&oho[idx].hp;
|
data/ext/oci8/oci8.h
CHANGED
@@ -150,13 +150,26 @@ static inline volatile VALUE *rb_gc_guarded_ptr(volatile VALUE *ptr) {return ptr
|
|
150
150
|
#endif
|
151
151
|
|
152
152
|
#ifndef HAVE_TYPE_RB_ENCODING
|
153
|
+
/* ruby 1.8, rubinuis 1.2 */
|
153
154
|
#define rb_enc_associate(str, enc) do {} while(0)
|
155
|
+
#define rb_enc_str_buf_cat(str, ptr, len, enc) rb_str_buf_cat((str), (ptr), (len))
|
154
156
|
#define rb_external_str_new_with_enc(ptr, len, enc) rb_tainted_str_new((ptr), (len))
|
155
157
|
#define rb_locale_str_new_cstr(ptr) rb_str_new2(ptr)
|
158
|
+
#define rb_str_buf_cat_ascii(str, ptr) rb_str_buf_cat2((str), (ptr))
|
156
159
|
#define rb_str_conv_enc(str, from, to) (str)
|
157
160
|
#define rb_str_export_to_enc(str, enc) (str)
|
158
161
|
#define rb_usascii_str_new(ptr, len) rb_str_new((ptr), (len))
|
159
162
|
#define rb_usascii_str_new_cstr(ptr) rb_str_new2(ptr)
|
163
|
+
#elif defined RBX_CAPI_RUBY_H
|
164
|
+
/* rubinius 2.0 */
|
165
|
+
#ifndef HAVE_RB_ENC_STR_BUF_CAT
|
166
|
+
#define rb_enc_str_buf_cat(str, ptr, len, enc) \
|
167
|
+
rb_str_concat((str), rb_enc_str_new((ptr), (len), (enc)))
|
168
|
+
#endif
|
169
|
+
#ifndef HAVE_RB_STR_BUF_CAT_ASCII
|
170
|
+
#define rb_str_buf_cat_ascii(str, ptr) \
|
171
|
+
rb_str_concat((str), rb_usascii_str_new_cstr(ptr))
|
172
|
+
#endif
|
160
173
|
#endif
|
161
174
|
|
162
175
|
/* a new function in ruby 1.9.3.
|
@@ -446,7 +459,6 @@ void Init_oci8_env(void);
|
|
446
459
|
|
447
460
|
/* oci8lib.c */
|
448
461
|
extern ID oci8_id_at_last_error;
|
449
|
-
extern ID oci8_id_new;
|
450
462
|
extern ID oci8_id_get;
|
451
463
|
extern ID oci8_id_set;
|
452
464
|
extern ID oci8_id_oci8_vtable;
|
data/ext/oci8/oci8lib.c
CHANGED
@@ -9,7 +9,6 @@
|
|
9
9
|
#endif
|
10
10
|
|
11
11
|
ID oci8_id_at_last_error;
|
12
|
-
ID oci8_id_new;
|
13
12
|
ID oci8_id_get;
|
14
13
|
ID oci8_id_set;
|
15
14
|
ID oci8_id_oci8_vtable;
|
@@ -87,7 +86,6 @@ Init_oci8lib()
|
|
87
86
|
#endif
|
88
87
|
|
89
88
|
oci8_id_at_last_error = rb_intern("@last_error");
|
90
|
-
oci8_id_new = rb_intern("new");
|
91
89
|
oci8_id_get = rb_intern("get");
|
92
90
|
oci8_id_set = rb_intern("set");
|
93
91
|
oci8_id_oci8_vtable = rb_intern("__oci8_vtable__");
|
@@ -234,64 +232,83 @@ static void *free_temp_lob(void *user_data)
|
|
234
232
|
return (void*)(VALUE)rv;
|
235
233
|
}
|
236
234
|
|
235
|
+
typedef struct protected_call_arg {
|
236
|
+
void *(*func)(void *);
|
237
|
+
void *data;
|
238
|
+
oci8_svcctx_t *svcctx;
|
239
|
+
} protected_call_arg_t;
|
240
|
+
|
241
|
+
static VALUE protected_call(VALUE data)
|
242
|
+
{
|
243
|
+
struct protected_call_arg *parg = (struct protected_call_arg*)data;
|
244
|
+
VALUE rv;
|
245
|
+
|
246
|
+
if (!NIL_P(parg->svcctx->executing_thread)) {
|
247
|
+
rb_raise(rb_eRuntimeError, "executing in another thread");
|
248
|
+
}
|
249
|
+
parg->svcctx->executing_thread = rb_thread_current();
|
250
|
+
#ifdef HAVE_RB_THREAD_CALL_WITHOUT_GVL
|
251
|
+
rv = (VALUE)rb_thread_call_without_gvl(parg->func, parg->data, oci8_unblock_func, parg->svcctx);
|
252
|
+
#else
|
253
|
+
rv = rb_thread_blocking_region((VALUE(*)(void*))parg->func, parg->data, oci8_unblock_func, parg->svcctx);
|
254
|
+
#endif
|
255
|
+
if ((sword)rv == OCI_ERROR) {
|
256
|
+
if (oci8_get_error_code(oci8_errhp) == 1013) {
|
257
|
+
rb_raise(eOCIBreak, "Canceled by user request.");
|
258
|
+
}
|
259
|
+
}
|
260
|
+
return rv;
|
261
|
+
}
|
262
|
+
|
237
263
|
/* ruby 1.9 */
|
238
264
|
sword oci8_call_without_gvl(oci8_svcctx_t *svcctx, void *(*func)(void *), void *data)
|
239
265
|
{
|
240
266
|
OCIError *errhp = oci8_errhp;
|
267
|
+
protected_call_arg_t parg;
|
268
|
+
sword rv;
|
269
|
+
int state;
|
241
270
|
|
242
271
|
if (!NIL_P(svcctx->executing_thread)) {
|
243
|
-
rb_raise(rb_eRuntimeError
|
272
|
+
rb_raise(rb_eRuntimeError, "executing in another thread");
|
244
273
|
}
|
245
|
-
|
246
274
|
if (!svcctx->suppress_free_temp_lobs) {
|
247
|
-
oci8_temp_lob_t *lob
|
248
|
-
while (lob != NULL) {
|
249
|
-
|
275
|
+
oci8_temp_lob_t *lob;
|
276
|
+
while ((lob = svcctx->temp_lobs) != NULL) {
|
277
|
+
svcctx->temp_lobs = lob->next;
|
250
278
|
|
251
279
|
if (svcctx->non_blocking) {
|
252
280
|
free_temp_lob_arg_t arg;
|
253
|
-
sword rv;
|
254
281
|
|
255
282
|
arg.svcctx = svcctx;
|
256
283
|
arg.svchp = svcctx->base.hp.svc;
|
257
284
|
arg.errhp = errhp;
|
258
285
|
arg.lob = lob->lob;
|
259
286
|
|
260
|
-
svcctx
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
}
|
287
|
+
parg.svcctx = svcctx;
|
288
|
+
parg.func = free_temp_lob;
|
289
|
+
parg.data = &arg;
|
290
|
+
|
291
|
+
rb_protect(protected_call, (VALUE)&parg, &state);
|
292
|
+
if (state) {
|
293
|
+
lob->next = svcctx->temp_lobs;
|
294
|
+
svcctx->temp_lobs = lob;
|
295
|
+
rb_jump_tag(state);
|
270
296
|
}
|
271
297
|
} else {
|
272
298
|
OCILobFreeTemporary(svcctx->base.hp.svc, errhp, lob->lob);
|
273
299
|
}
|
274
300
|
OCIDescriptorFree(lob->lob, OCI_DTYPE_LOB);
|
275
|
-
|
276
301
|
xfree(lob);
|
277
|
-
svcctx->temp_lobs = lob = lob_next;
|
278
302
|
}
|
279
303
|
}
|
280
304
|
|
281
305
|
if (svcctx->non_blocking) {
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
#else
|
289
|
-
rv = (sword)rb_thread_blocking_region((VALUE(*)(void*))func, data, oci8_unblock_func, svcctx);
|
290
|
-
#endif
|
291
|
-
if (rv == OCI_ERROR) {
|
292
|
-
if (oci8_get_error_code(errhp) == 1013) {
|
293
|
-
rb_raise(eOCIBreak, "Canceled by user request.");
|
294
|
-
}
|
306
|
+
parg.svcctx = svcctx;
|
307
|
+
parg.func = func;
|
308
|
+
parg.data = data;
|
309
|
+
rv = (sword)rb_protect(protected_call, (VALUE)&parg, &state);
|
310
|
+
if (state) {
|
311
|
+
rb_jump_tag(state);
|
295
312
|
}
|
296
313
|
return rv;
|
297
314
|
} else {
|
@@ -489,16 +506,19 @@ void *oci8_find_symbol(const char *symbol_name)
|
|
489
506
|
"libclntsh.a(shr.o)",
|
490
507
|
#elif defined(__hppa)
|
491
508
|
/* HP-UX(PA-RISC) */
|
509
|
+
"libclntsh.sl.12.1",
|
492
510
|
"libclntsh.sl.11.1",
|
493
511
|
"libclntsh.sl.10.1",
|
494
512
|
"libclntsh.sl.9.0",
|
495
513
|
"libclntsh.sl.8.0",
|
496
514
|
#elif defined(__APPLE__)
|
497
515
|
/* Mac OS X */
|
516
|
+
"libclntsh.dylib.12.1",
|
498
517
|
"libclntsh.dylib.11.1",
|
499
518
|
"libclntsh.dylib.10.1",
|
500
519
|
#else
|
501
520
|
/* Linux, Solaris and HP-UX(IA64) */
|
521
|
+
"libclntsh.so.12.1",
|
502
522
|
"libclntsh.so.11.1",
|
503
523
|
"libclntsh.so.10.1",
|
504
524
|
"libclntsh.so.9.0",
|