ruby-oci8 2.2.6.1 → 2.2.10
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.
- checksums.yaml +7 -0
- data/ChangeLog +167 -3
- data/NEWS +162 -54
- data/README.md +1 -1
- data/dist-files +1 -2
- data/docs/install-instant-client.md +2 -1
- data/docs/install-on-osx.md +29 -116
- data/ext/oci8/apiwrap.c.tmpl +2 -5
- data/ext/oci8/apiwrap.yml +20 -0
- 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/extconf.rb +5 -2
- data/ext/oci8/hook_funcs.c +21 -1
- data/ext/oci8/lob.c +24 -32
- data/ext/oci8/metadata.c +2 -2
- data/ext/oci8/object.c +42 -27
- data/ext/oci8/oci8.c +14 -16
- data/ext/oci8/oci8.h +1 -0
- data/ext/oci8/oci8lib.c +10 -7
- data/ext/oci8/ocihandle.c +2 -2
- data/ext/oci8/ocinumber.c +11 -9
- data/ext/oci8/oraconf.rb +130 -257
- data/ext/oci8/oradate.c +1 -1
- data/ext/oci8/plthook_osx.c +10 -10
- data/ext/oci8/stmt.c +51 -16
- data/ext/oci8/win32.c +4 -2
- data/lib/oci8/bindtype.rb +0 -14
- data/lib/oci8/check_load_error.rb +51 -16
- data/lib/oci8/cursor.rb +46 -13
- data/lib/oci8/oci8.rb +1 -1
- data/lib/oci8/version.rb +1 -1
- data/lib/oci8.rb +9 -4
- 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/test_break.rb +9 -9
- data/test/test_datetime.rb +8 -3
- data/test/test_oci8.rb +154 -43
- data/test/test_oranumber.rb +7 -1
- metadata +33 -55
- data/docs/osx-install-dev-tools.png +0 -0
- data/test/README +0 -42
data/ext/oci8/connection_pool.c
CHANGED
@@ -144,13 +144,13 @@ static VALUE oci8_cpool_initialize(int argc, VALUE *argv, VALUE self)
|
|
144
144
|
chker2(OCIConnectionPoolCreate(oci8_envhp, oci8_errhp, cpool->base.hp.poolhp,
|
145
145
|
&pool_name, &pool_name_len,
|
146
146
|
NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname),
|
147
|
-
NIL_P(dbname) ? 0 :
|
147
|
+
NIL_P(dbname) ? 0 : RSTRING_LENINT(dbname),
|
148
148
|
FIX2UINT(conn_min), FIX2UINT(conn_max),
|
149
149
|
FIX2UINT(conn_incr),
|
150
150
|
NIL_P(username) ? NULL : RSTRING_ORATEXT(username),
|
151
|
-
NIL_P(username) ? 0 :
|
151
|
+
NIL_P(username) ? 0 : RSTRING_LENINT(username),
|
152
152
|
NIL_P(password) ? NULL : RSTRING_ORATEXT(password),
|
153
|
-
NIL_P(password) ? 0 :
|
153
|
+
NIL_P(password) ? 0 : RSTRING_LENINT(password),
|
154
154
|
OCI_DEFAULT),
|
155
155
|
&cpool->base);
|
156
156
|
RB_OBJ_WRITE(cpool->base.self, &cpool->pool_name, rb_str_new(TO_CHARPTR(pool_name), pool_name_len));
|
data/ext/oci8/extconf.rb
CHANGED
@@ -139,6 +139,8 @@ when 'rbx'
|
|
139
139
|
so_basename += 'rbx'
|
140
140
|
when 'jruby'
|
141
141
|
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."
|
142
|
+
when 'truffleruby'
|
143
|
+
so_basename += 'truffleruby'
|
142
144
|
else
|
143
145
|
raise 'unsupported ruby engine: ' + RUBY_ENGINE
|
144
146
|
end
|
@@ -153,8 +155,9 @@ when /darwin/
|
|
153
155
|
else
|
154
156
|
plthook_src = "plthook_elf.c"
|
155
157
|
end
|
156
|
-
|
157
|
-
|
158
|
+
FileUtils.copy(File.dirname(__FILE__) + "/" + plthook_src, CONFTEST_C)
|
159
|
+
if xsystem(cc_command(""))
|
160
|
+
FileUtils.rm_f("#{CONFTEST}.#{$OBJEXT}")
|
158
161
|
puts plthook_src
|
159
162
|
$objs << plthook_src.gsub(/\.c$/, '.o')
|
160
163
|
$objs << "hook_funcs.o"
|
data/ext/oci8/hook_funcs.c
CHANGED
@@ -298,13 +298,28 @@ static void *ocifunc_addr(void *dlsym_handle, const char **file)
|
|
298
298
|
if (dladdr(addr, &dli) == 0) {
|
299
299
|
return NULL;
|
300
300
|
}
|
301
|
-
if (strstr(dli.dli_fname, "/libclntsh." SO_EXT) ==
|
301
|
+
if (strstr(dli.dli_fname, "/libclntsh." SO_EXT) == NULL) {
|
302
302
|
return NULL;
|
303
303
|
}
|
304
304
|
*file = dli.dli_fname;
|
305
305
|
return addr;
|
306
306
|
}
|
307
307
|
|
308
|
+
#ifdef __linux__
|
309
|
+
#include <link.h>
|
310
|
+
static void *ocifunc_addr_linux(const char **file)
|
311
|
+
{
|
312
|
+
struct link_map *lm;
|
313
|
+
for (lm = _r_debug.r_map; lm != NULL; lm = lm->l_next) {
|
314
|
+
if (strstr(lm->l_name, "/libclntsh." SO_EXT) != NULL) {
|
315
|
+
*file = lm->l_name;
|
316
|
+
return (void*)lm->l_addr;
|
317
|
+
}
|
318
|
+
}
|
319
|
+
return NULL;
|
320
|
+
}
|
321
|
+
#endif
|
322
|
+
|
308
323
|
void oci8_install_hook_functions(void)
|
309
324
|
{
|
310
325
|
static int hook_functions_installed = 0;
|
@@ -319,6 +334,11 @@ void oci8_install_hook_functions(void)
|
|
319
334
|
/* OCI symbols may be hooked by LD_PRELOAD. */
|
320
335
|
addr = ocifunc_addr(RTLD_NEXT, &file);
|
321
336
|
}
|
337
|
+
#ifdef __linux__
|
338
|
+
if (addr == NULL) {
|
339
|
+
addr = ocifunc_addr_linux(&file);
|
340
|
+
}
|
341
|
+
#endif
|
322
342
|
if (addr == NULL) {
|
323
343
|
rb_raise(rb_eRuntimeError, "No shared library is found to hook.");
|
324
344
|
}
|
data/ext/oci8/lob.c
CHANGED
@@ -639,10 +639,9 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
639
639
|
{
|
640
640
|
oci8_lob_t *lob = TO_LOB(self);
|
641
641
|
oci8_svcctx_t *svcctx = check_svcctx(lob);
|
642
|
-
ub8 lob_length;
|
643
|
-
ub8 read_len;
|
644
642
|
ub8 pos = lob->pos;
|
645
|
-
long strbufsiz;
|
643
|
+
long strbufsiz = 512;
|
644
|
+
ub8 sz;
|
646
645
|
ub8 byte_amt;
|
647
646
|
ub8 char_amt;
|
648
647
|
sword rv;
|
@@ -652,36 +651,21 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
652
651
|
ub1 piece = OCI_FIRST_PIECE;
|
653
652
|
|
654
653
|
rb_scan_args(argc, argv, "01", &size);
|
655
|
-
lob_length = oci8_lob_get_length(lob);
|
656
|
-
if (lob_length == 0 && NIL_P(size)) {
|
657
|
-
return rb_usascii_str_new("", 0);
|
658
|
-
}
|
659
|
-
if (lob_length <= pos) /* EOF */
|
660
|
-
return Qnil;
|
661
654
|
if (NIL_P(size)) {
|
662
|
-
|
655
|
+
sz = UB4MAXVAL;
|
663
656
|
} else {
|
664
|
-
|
665
|
-
|
657
|
+
sz = NUM2ULL(size);
|
658
|
+
}
|
659
|
+
if (lob->state == S_BFILE_CLOSE) {
|
660
|
+
open_bfile(svcctx, lob, errhp);
|
666
661
|
}
|
662
|
+
read_more_data:
|
667
663
|
if (lob->lobtype == OCI_TEMP_CLOB) {
|
668
664
|
byte_amt = 0;
|
669
|
-
char_amt =
|
670
|
-
if (oci8_nls_ratio == 1) {
|
671
|
-
strbufsiz = MIN(read_len, ULONG_MAX);
|
672
|
-
} else {
|
673
|
-
strbufsiz = MIN(read_len + read_len / 8, ULONG_MAX);
|
674
|
-
}
|
675
|
-
if (strbufsiz <= 10) {
|
676
|
-
strbufsiz = 10;
|
677
|
-
}
|
665
|
+
char_amt = sz;
|
678
666
|
} else {
|
679
|
-
byte_amt =
|
667
|
+
byte_amt = sz;
|
680
668
|
char_amt = 0;
|
681
|
-
strbufsiz = MIN(read_len, ULONG_MAX);
|
682
|
-
}
|
683
|
-
if (lob->state == S_BFILE_CLOSE) {
|
684
|
-
open_bfile(svcctx, lob, errhp);
|
685
669
|
}
|
686
670
|
do {
|
687
671
|
VALUE strbuf = rb_str_buf_new(strbufsiz);
|
@@ -711,22 +695,30 @@ static VALUE oci8_lob_read(int argc, VALUE *argv, VALUE self)
|
|
711
695
|
}
|
712
696
|
rb_str_set_len(strbuf, byte_amt);
|
713
697
|
rb_ary_push(v, strbuf);
|
698
|
+
if (strbufsiz < 128 * 1024 * 1024) {
|
699
|
+
strbufsiz *= 2;
|
700
|
+
}
|
714
701
|
} while (rv == OCI_NEED_DATA);
|
715
702
|
|
716
|
-
if (pos
|
717
|
-
|
703
|
+
if (NIL_P(size) && pos - lob->pos == sz) {
|
704
|
+
lob->pos = pos;
|
705
|
+
piece = OCI_FIRST_PIECE;
|
706
|
+
goto read_more_data;
|
718
707
|
}
|
719
708
|
lob->pos = pos;
|
720
709
|
switch (RARRAY_LEN(v)) {
|
721
710
|
case 0:
|
722
|
-
|
711
|
+
if (NIL_P(size) && pos == 0) {
|
712
|
+
return rb_usascii_str_new("", 0);
|
713
|
+
} else {
|
714
|
+
return Qnil;
|
715
|
+
}
|
723
716
|
case 1:
|
724
717
|
v = RARRAY_AREF(v, 0);
|
725
718
|
break;
|
726
719
|
default:
|
727
720
|
v = rb_ary_join(v, Qnil);
|
728
721
|
}
|
729
|
-
OBJ_TAINT(v);
|
730
722
|
if (lob->lobtype == OCI_TEMP_CLOB) {
|
731
723
|
/* set encoding */
|
732
724
|
rb_enc_associate(v, oci8_encoding);
|
@@ -773,10 +765,10 @@ static VALUE oci8_lob_write(VALUE self, VALUE data)
|
|
773
765
|
RB_GC_GUARD(str);
|
774
766
|
if (lob->lobtype == OCI_TEMP_CLOB) {
|
775
767
|
lob->pos += char_amt;
|
776
|
-
return
|
768
|
+
return ULL2NUM(char_amt);
|
777
769
|
} else {
|
778
770
|
lob->pos += byte_amt;
|
779
|
-
return
|
771
|
+
return ULL2NUM(byte_amt);
|
780
772
|
}
|
781
773
|
}
|
782
774
|
|
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);
|
data/ext/oci8/object.c
CHANGED
@@ -485,7 +485,7 @@ static VALUE set_coll_element_func(set_coll_element_cb_data_t *cb_data)
|
|
485
485
|
|
486
486
|
chkerr(OCICollSize(oci8_envhp, oci8_errhp, coll, &size));
|
487
487
|
if (RARRAY_LEN(val) < size) {
|
488
|
-
chkerr(OCICollTrim(oci8_envhp, oci8_errhp, size - RARRAY_LEN(val), coll));
|
488
|
+
chkerr(OCICollTrim(oci8_envhp, oci8_errhp, (sb4)(size - RARRAY_LEN(val)), coll));
|
489
489
|
}
|
490
490
|
for (idx = 0; idx < RARRAY_LEN(val); idx++) {
|
491
491
|
switch (FIX2INT(datatype)) {
|
@@ -559,13 +559,13 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
|
|
559
559
|
case ATTR_STRING:
|
560
560
|
OCI8StringValue(val);
|
561
561
|
chkerr(OCIStringAssignText(oci8_envhp, oci8_errhp,
|
562
|
-
RSTRING_ORATEXT(val),
|
562
|
+
RSTRING_ORATEXT(val), RSTRING_LENINT(val),
|
563
563
|
(OCIString **)data));
|
564
564
|
break;
|
565
565
|
case ATTR_RAW:
|
566
566
|
StringValue(val);
|
567
567
|
chkerr(OCIRawAssignBytes(oci8_envhp, oci8_errhp,
|
568
|
-
RSTRING_ORATEXT(val),
|
568
|
+
RSTRING_ORATEXT(val), RSTRING_LENINT(val),
|
569
569
|
(OCIRaw **)data));
|
570
570
|
break;
|
571
571
|
case ATTR_OCINUMBER:
|
@@ -680,45 +680,57 @@ static VALUE oci8_named_collection_alloc(VALUE klass)
|
|
680
680
|
return oci8_allocate_typeddata(klass, &oci8_named_collection_data_type);
|
681
681
|
}
|
682
682
|
|
683
|
+
typedef struct {
|
684
|
+
oci8_bind_t bind;
|
685
|
+
VALUE *obj;
|
686
|
+
} bind_named_type_t;
|
687
|
+
|
683
688
|
static void bind_named_type_mark(oci8_base_t *base)
|
684
689
|
{
|
685
|
-
|
686
|
-
oci8_hp_obj_t *oho = (oci8_hp_obj_t *)obind->valuep;
|
690
|
+
bind_named_type_t *bnt = (bind_named_type_t *)base;
|
687
691
|
|
688
|
-
if (
|
692
|
+
if (bnt->obj != NULL) {
|
689
693
|
ub4 idx = 0;
|
690
694
|
|
691
695
|
do {
|
692
|
-
rb_gc_mark(
|
693
|
-
} while (++idx <
|
696
|
+
rb_gc_mark(bnt->obj[idx]);
|
697
|
+
} while (++idx < bnt->bind.maxar_sz);
|
694
698
|
}
|
695
|
-
rb_gc_mark(
|
699
|
+
rb_gc_mark(bnt->bind.tdo);
|
696
700
|
}
|
697
701
|
|
698
702
|
static void bind_named_type_free(oci8_base_t *base)
|
699
703
|
{
|
700
|
-
|
701
|
-
|
704
|
+
bind_named_type_t *bnt = (bind_named_type_t *)base;
|
705
|
+
void **hp = (void **)bnt->bind.valuep;
|
702
706
|
|
703
|
-
if (
|
707
|
+
if (hp != NULL) {
|
704
708
|
ub4 idx = 0;
|
705
709
|
|
706
710
|
do {
|
707
|
-
if (
|
708
|
-
OCIObjectFree(oci8_envhp, oci8_errhp,
|
709
|
-
|
711
|
+
if (hp[idx] != NULL) {
|
712
|
+
OCIObjectFree(oci8_envhp, oci8_errhp, hp[idx], OCI_DEFAULT);
|
713
|
+
hp[idx] = NULL;
|
710
714
|
}
|
711
|
-
} while (++idx <
|
715
|
+
} while (++idx < bnt->bind.maxar_sz);
|
716
|
+
}
|
717
|
+
if (bnt->obj != NULL) {
|
718
|
+
xfree(bnt->obj);
|
719
|
+
bnt->obj = NULL;
|
712
720
|
}
|
713
721
|
oci8_bind_free(base);
|
714
722
|
}
|
715
723
|
|
716
724
|
static VALUE bind_named_type_get(oci8_bind_t *obind, void *data, void *null_struct)
|
717
725
|
{
|
718
|
-
|
719
|
-
|
726
|
+
bind_named_type_t *bnt = (bind_named_type_t *)obind;
|
727
|
+
ub4 idx = obind->curar_idx;
|
728
|
+
|
729
|
+
return bnt->obj[idx];
|
720
730
|
}
|
721
731
|
|
732
|
+
NORETURN(static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val));
|
733
|
+
|
722
734
|
static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
|
723
735
|
{
|
724
736
|
rb_raise(rb_eRuntimeError, "not supported");
|
@@ -726,10 +738,12 @@ static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_stru
|
|
726
738
|
|
727
739
|
static void bind_named_type_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
|
728
740
|
{
|
741
|
+
bind_named_type_t *bnt = (bind_named_type_t *)obind;
|
729
742
|
VALUE tdo_obj = length;
|
730
743
|
|
731
744
|
obind->value_sz = sizeof(void*);
|
732
|
-
obind->alloc_sz = sizeof(
|
745
|
+
obind->alloc_sz = sizeof(void*);
|
746
|
+
bnt->obj = xcalloc(sizeof(VALUE), obind->maxar_sz ? obind->maxar_sz : 1);
|
733
747
|
|
734
748
|
CHECK_TDO(tdo_obj);
|
735
749
|
RB_OBJ_WRITE(obind->base.self, &obind->tdo, tdo_obj);
|
@@ -737,7 +751,8 @@ static void bind_named_type_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE
|
|
737
751
|
|
738
752
|
static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
|
739
753
|
{
|
740
|
-
|
754
|
+
bind_named_type_t *bnt = (bind_named_type_t *)obind;
|
755
|
+
void **hp = (void **)obind->valuep;
|
741
756
|
oci8_base_t *tdo = DATA_PTR(obind->tdo);
|
742
757
|
OCITypeCode tc = OCITypeTypeCode(oci8_envhp, oci8_errhp, tdo->hp.tdo);
|
743
758
|
VALUE klass = Qnil;
|
@@ -755,14 +770,14 @@ static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
|
|
755
770
|
}
|
756
771
|
svcctx = oci8_get_svcctx(svc);
|
757
772
|
do {
|
758
|
-
|
759
|
-
RB_OBJ_WRITTEN(obind->base.self, Qundef,
|
760
|
-
obj = DATA_PTR(
|
761
|
-
RB_OBJ_WRITE(
|
762
|
-
obj->instancep = (char**)&
|
773
|
+
bnt->obj[idx] = rb_class_new_instance(0, NULL, klass);
|
774
|
+
RB_OBJ_WRITTEN(obind->base.self, Qundef, bnt->obj[idx]);
|
775
|
+
obj = DATA_PTR(bnt->obj[idx]);
|
776
|
+
RB_OBJ_WRITE(bnt->obj[idx], &obj->tdo, obind->tdo);
|
777
|
+
obj->instancep = (char**)&hp[idx];
|
763
778
|
obj->null_structp = (char**)&obind->u.null_structs[idx];
|
764
779
|
oci8_link_to_parent(&obj->base, &obind->base);
|
765
|
-
RB_OBJ_WRITTEN(
|
780
|
+
RB_OBJ_WRITTEN(bnt->obj[idx], Qundef, obind->base.self);
|
766
781
|
|
767
782
|
chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->base.hp.svc, tc, tdo->hp.tdo, NULL, OCI_DURATION_SESSION, TRUE, (dvoid**)obj->instancep),
|
768
783
|
&svcctx->base);
|
@@ -804,7 +819,7 @@ static const oci8_bind_data_type_t bind_named_type_data_type = {
|
|
804
819
|
#endif
|
805
820
|
},
|
806
821
|
bind_named_type_free,
|
807
|
-
sizeof(
|
822
|
+
sizeof(bind_named_type_t)
|
808
823
|
},
|
809
824
|
bind_named_type_get,
|
810
825
|
bind_named_type_set,
|
data/ext/oci8/oci8.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* oci8.c - part of ruby-oci8
|
4
4
|
*
|
5
|
-
* Copyright (C) 2002-
|
5
|
+
* Copyright (C) 2002-2019 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*
|
7
7
|
*/
|
8
8
|
#include "oci8.h"
|
@@ -556,7 +556,7 @@ static VALUE oci8_server_attach(VALUE self, VALUE dbname, VALUE attach_mode)
|
|
556
556
|
/* attach to the server */
|
557
557
|
chker2(OCIServerAttach_nb(svcctx, svcctx->srvhp, oci8_errhp,
|
558
558
|
NIL_P(dbname) ? NULL : RSTRING_ORATEXT(dbname),
|
559
|
-
NIL_P(dbname) ? 0 :
|
559
|
+
NIL_P(dbname) ? 0 : RSTRING_LENINT(dbname),
|
560
560
|
mode),
|
561
561
|
&svcctx->base);
|
562
562
|
chker2(OCIAttrSet(svcctx->base.hp.ptr, OCI_HTYPE_SVCCTX,
|
@@ -734,14 +734,9 @@ static VALUE oci8_set_autocommit(VALUE self, VALUE val)
|
|
734
734
|
/*
|
735
735
|
* @overload long_read_len
|
736
736
|
*
|
737
|
-
*
|
738
|
-
*
|
739
|
-
*
|
740
|
-
* If the actual data length is longer than long_read_len,
|
741
|
-
* the fetched valud is truncated and the value of {OCI8#last_error}
|
742
|
-
* become {OCISuccessWithInfo} whose message is "ORA-01406: fetched column value was truncated".
|
743
|
-
*
|
744
|
-
* Note: long_read_len is also used for maximum length of XMLTYPE data type.
|
737
|
+
* @deprecated This has no effect since ruby-oci8 2.2.7.
|
738
|
+
* LONG, LONG RAW and XMLTYPE columns are fetched up to 4 gigabytes
|
739
|
+
* without this parameter.
|
745
740
|
*
|
746
741
|
* @return [Integer]
|
747
742
|
* @see #long_read_len=
|
@@ -749,14 +744,16 @@ static VALUE oci8_set_autocommit(VALUE self, VALUE val)
|
|
749
744
|
static VALUE oci8_long_read_len(VALUE self)
|
750
745
|
{
|
751
746
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
747
|
+
rb_warning("OCI8.long_read_len has no effect since ruby-oci8 2.2.7");
|
752
748
|
return svcctx->long_read_len;
|
753
749
|
}
|
754
750
|
|
755
751
|
/*
|
756
752
|
* @overload long_read_len=(length)
|
757
753
|
*
|
758
|
-
*
|
759
|
-
*
|
754
|
+
* @deprecated This has no effect since ruby-oci8 2.2.7.
|
755
|
+
* LONG, LONG RAW and XMLTYPE columns are fetched up to 4 gigabytes
|
756
|
+
* without this parameter.
|
760
757
|
*
|
761
758
|
* @param [Integer] length
|
762
759
|
* @see #long_read_len
|
@@ -766,6 +763,7 @@ static VALUE oci8_set_long_read_len(VALUE self, VALUE val)
|
|
766
763
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
767
764
|
Check_Type(val, T_FIXNUM);
|
768
765
|
RB_OBJ_WRITE(self, &svcctx->long_read_len, val);
|
766
|
+
rb_warning("OCI8.long_read_len= has no effect since ruby-oci8 2.2.7");
|
769
767
|
return val;
|
770
768
|
}
|
771
769
|
|
@@ -866,7 +864,7 @@ static VALUE oci8_set_client_identifier(VALUE self, VALUE val)
|
|
866
864
|
if (!NIL_P(val)) {
|
867
865
|
OCI8SafeStringValue(val);
|
868
866
|
ptr = RSTRING_PTR(val);
|
869
|
-
size =
|
867
|
+
size = RSTRING_LENINT(val);
|
870
868
|
} else {
|
871
869
|
ptr = "";
|
872
870
|
size = 0;
|
@@ -901,7 +899,7 @@ static VALUE oci8_set_module(VALUE self, VALUE val)
|
|
901
899
|
if (!NIL_P(val)) {
|
902
900
|
OCI8SafeStringValue(val);
|
903
901
|
ptr = RSTRING_PTR(val);
|
904
|
-
size =
|
902
|
+
size = RSTRING_LENINT(val);
|
905
903
|
} else {
|
906
904
|
ptr = "";
|
907
905
|
size = 0;
|
@@ -935,7 +933,7 @@ static VALUE oci8_set_action(VALUE self, VALUE val)
|
|
935
933
|
if (!NIL_P(val)) {
|
936
934
|
OCI8SafeStringValue(val);
|
937
935
|
ptr = RSTRING_PTR(val);
|
938
|
-
size =
|
936
|
+
size = RSTRING_LENINT(val);
|
939
937
|
} else {
|
940
938
|
ptr = "";
|
941
939
|
size = 0;
|
@@ -966,7 +964,7 @@ static VALUE oci8_set_client_info(VALUE self, VALUE val)
|
|
966
964
|
if (!NIL_P(val)) {
|
967
965
|
OCI8SafeStringValue(val);
|
968
966
|
ptr = RSTRING_PTR(val);
|
969
|
-
size =
|
967
|
+
size = RSTRING_LENINT(val);
|
970
968
|
} else {
|
971
969
|
ptr = "";
|
972
970
|
size = 0;
|
data/ext/oci8/oci8.h
CHANGED
@@ -424,6 +424,7 @@ void *oci8_check_typeddata(VALUE obj, const oci8_handle_data_type_t *data_type,
|
|
424
424
|
extern VALUE eOCIException;
|
425
425
|
extern VALUE eOCIBreak;
|
426
426
|
void Init_oci8_error(void);
|
427
|
+
NORETURN(void oci8_do_raise(OCIError *errhp, sword status, OCIStmt *stmthp, const char *file, int line));
|
427
428
|
NORETURN(void oci8_do_env_raise(OCIEnv *envhp, sword status, int free_envhp, const char *file, int line));
|
428
429
|
NORETURN(void oci8_do_raise_init_error(const char *file, int line));
|
429
430
|
sb4 oci8_get_error_code(OCIError *errhp);
|
data/ext/oci8/oci8lib.c
CHANGED
@@ -71,7 +71,7 @@ static VALUE bind_base_alloc(VALUE klass)
|
|
71
71
|
rb_raise(rb_eNameError, "private method `new' called for %s:Class", rb_class2name(klass));
|
72
72
|
}
|
73
73
|
|
74
|
-
#if defined(HAVE_PLTHOOK) && !defined(WIN32) && !defined(__CYGWIN__)
|
74
|
+
#if defined(HAVE_PLTHOOK) && !defined(WIN32) && !defined(__CYGWIN__) && !defined(TRUFFLERUBY)
|
75
75
|
static const char *find_libclntsh(void *handle)
|
76
76
|
{
|
77
77
|
void *symaddr = dlsym(handle, "OCIEnvCreate");
|
@@ -226,7 +226,7 @@ Init_oci8lib()
|
|
226
226
|
oracle_client_version = ORAVERNUM(major, minor, update, patch, port_update);
|
227
227
|
}
|
228
228
|
#endif
|
229
|
-
#if defined(HAVE_PLTHOOK) && !defined(WIN32) && !defined(__CYGWIN__)
|
229
|
+
#if defined(HAVE_PLTHOOK) && !defined(WIN32) && !defined(__CYGWIN__) && !defined(TRUFFLERUBY)
|
230
230
|
rebind_internal_symbols();
|
231
231
|
#endif
|
232
232
|
|
@@ -461,6 +461,7 @@ sword oci8_call_without_gvl(oci8_svcctx_t *svcctx, void *(*func)(void *), void *
|
|
461
461
|
parg.func = func;
|
462
462
|
parg.data = data;
|
463
463
|
rv = (sword)rb_protect(protected_call, (VALUE)&parg, &state);
|
464
|
+
RB_OBJ_WRITE(svcctx->base.self, &svcctx->executing_thread, Qnil);
|
464
465
|
if (state) {
|
465
466
|
rb_jump_tag(state);
|
466
467
|
}
|
@@ -481,8 +482,8 @@ typedef struct {
|
|
481
482
|
OCIStmt *stmtp;
|
482
483
|
} cb_arg_t;
|
483
484
|
|
484
|
-
static VALUE exec_sql(
|
485
|
-
static VALUE ensure_func(
|
485
|
+
static VALUE exec_sql(VALUE varg);
|
486
|
+
static VALUE ensure_func(VALUE varg);
|
486
487
|
|
487
488
|
/*
|
488
489
|
* utility function to execute a single SQL statement
|
@@ -503,13 +504,14 @@ sword oci8_exec_sql(oci8_svcctx_t *svcctx, const char *sql_text, ub4 num_define_
|
|
503
504
|
return (sword)rb_ensure(exec_sql, (VALUE)&arg, ensure_func, (VALUE)&arg);
|
504
505
|
}
|
505
506
|
|
506
|
-
static VALUE exec_sql(
|
507
|
+
static VALUE exec_sql(VALUE varg)
|
507
508
|
{
|
509
|
+
cb_arg_t *arg = (cb_arg_t *)varg;
|
508
510
|
ub4 pos;
|
509
511
|
sword rv;
|
510
512
|
|
511
513
|
chker2(OCIStmtPrepare2(arg->svcctx->base.hp.svc, &arg->stmtp, oci8_errhp,
|
512
|
-
(text*)arg->sql_text, strlen(arg->sql_text), NULL, 0,
|
514
|
+
(text*)arg->sql_text, (ub4)strlen(arg->sql_text), NULL, 0,
|
513
515
|
OCI_NTV_SYNTAX, OCI_DEFAULT),
|
514
516
|
&arg->svcctx->base);
|
515
517
|
for (pos = 0; pos < arg->num_define_vars; pos++) {
|
@@ -546,8 +548,9 @@ static VALUE exec_sql(cb_arg_t *arg)
|
|
546
548
|
return (VALUE)rv;
|
547
549
|
}
|
548
550
|
|
549
|
-
static VALUE ensure_func(
|
551
|
+
static VALUE ensure_func(VALUE varg)
|
550
552
|
{
|
553
|
+
cb_arg_t *arg = (cb_arg_t *)varg;
|
551
554
|
if (arg->stmtp != NULL) {
|
552
555
|
OCIStmtRelease(arg->stmtp, oci8_errhp, NULL, 0, OCI_DEFAULT);
|
553
556
|
}
|
data/ext/oci8/ocihandle.c
CHANGED
@@ -752,7 +752,7 @@ static VALUE attr_set_string(VALUE self, VALUE attr_type, VALUE val)
|
|
752
752
|
Check_Type(attr_type, T_FIXNUM);
|
753
753
|
OCI8SafeStringValue(val);
|
754
754
|
/* set attribute */
|
755
|
-
chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val),
|
755
|
+
chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val), RSTRING_LENINT(val), FIX2INT(attr_type), oci8_errhp), base);
|
756
756
|
return self;
|
757
757
|
}
|
758
758
|
|
@@ -776,7 +776,7 @@ static VALUE attr_set_binary(VALUE self, VALUE attr_type, VALUE val)
|
|
776
776
|
Check_Type(attr_type, T_FIXNUM);
|
777
777
|
SafeStringValue(val);
|
778
778
|
/* set attribute */
|
779
|
-
chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val),
|
779
|
+
chker2(OCIAttrSet(base->hp.ptr, base->type, RSTRING_PTR(val), RSTRING_LENINT(val), FIX2INT(attr_type), oci8_errhp), base);
|
780
780
|
return self;
|
781
781
|
}
|
782
782
|
|
data/ext/oci8/ocinumber.c
CHANGED
@@ -154,7 +154,7 @@ static void set_oci_number_from_str(OCINumber *result, VALUE str, VALUE fmt, VAL
|
|
154
154
|
StringValue(str);
|
155
155
|
/* set from string. */
|
156
156
|
if (NIL_P(fmt)) {
|
157
|
-
int rv = oranumber_from_str(result, RSTRING_PTR(str),
|
157
|
+
int rv = oranumber_from_str(result, RSTRING_PTR(str), RSTRING_LENINT(str));
|
158
158
|
if (rv == ORANUMBER_SUCCESS) {
|
159
159
|
return; /* success */
|
160
160
|
} else {
|
@@ -172,17 +172,17 @@ static void set_oci_number_from_str(OCINumber *result, VALUE str, VALUE fmt, VAL
|
|
172
172
|
}
|
173
173
|
StringValue(fmt);
|
174
174
|
fmt_ptr = RSTRING_ORATEXT(fmt);
|
175
|
-
fmt_len =
|
175
|
+
fmt_len = RSTRING_LENINT(fmt);
|
176
176
|
if (NIL_P(nls_params)) {
|
177
177
|
nls_params_ptr = NULL;
|
178
178
|
nls_params_len = 0;
|
179
179
|
} else {
|
180
180
|
StringValue(nls_params);
|
181
181
|
nls_params_ptr = RSTRING_ORATEXT(nls_params);
|
182
|
-
nls_params_len =
|
182
|
+
nls_params_len = RSTRING_LENINT(nls_params);
|
183
183
|
}
|
184
184
|
chkerr(OCINumberFromText(errhp,
|
185
|
-
RSTRING_ORATEXT(str),
|
185
|
+
RSTRING_ORATEXT(str), RSTRING_LENINT(str),
|
186
186
|
fmt_ptr, fmt_len, nls_params_ptr, nls_params_len,
|
187
187
|
result));
|
188
188
|
}
|
@@ -216,6 +216,8 @@ static int set_oci_number_from_num(OCINumber *result, VALUE num, int force, OCIE
|
|
216
216
|
num = rb_big2str(num, 10);
|
217
217
|
set_oci_number_from_str(result, num, Qnil, Qnil, errhp);
|
218
218
|
return 1;
|
219
|
+
default:
|
220
|
+
break;
|
219
221
|
}
|
220
222
|
if (RTEST(rb_obj_is_instance_of(num, cOCINumber))) {
|
221
223
|
/* OCI::Number */
|
@@ -247,7 +249,7 @@ static int set_oci_number_from_num(OCINumber *result, VALUE num, int force, OCIE
|
|
247
249
|
if (TYPE(ary[1]) != T_STRING) {
|
248
250
|
goto is_not_big_decimal;
|
249
251
|
}
|
250
|
-
digits_len =
|
252
|
+
digits_len = RSTRING_LENINT(ary[1]);
|
251
253
|
set_oci_number_from_str(&digits, ary[1], Qnil, Qnil, errhp);
|
252
254
|
/* check base */
|
253
255
|
if (TYPE(ary[2]) != T_FIXNUM || FIX2LONG(ary[2]) != 10) {
|
@@ -363,7 +365,7 @@ OCINumber *oci8_dbl_to_onum(OCINumber *result, double dbl, OCIError *errhp)
|
|
363
365
|
sword rv;
|
364
366
|
|
365
367
|
str = rb_obj_as_string(rb_float_new(dbl));
|
366
|
-
rv = oranumber_from_str(result, RSTRING_PTR(str),
|
368
|
+
rv = oranumber_from_str(result, RSTRING_PTR(str), RSTRING_LENINT(str));
|
367
369
|
if (rv != 0) {
|
368
370
|
oci8_raise_by_msgno(rv, NULL);
|
369
371
|
}
|
@@ -1307,14 +1309,14 @@ static VALUE onum_to_char(int argc, VALUE *argv, VALUE self)
|
|
1307
1309
|
}
|
1308
1310
|
StringValue(fmt);
|
1309
1311
|
fmt_ptr = RSTRING_ORATEXT(fmt);
|
1310
|
-
fmt_len =
|
1312
|
+
fmt_len = RSTRING_LENINT(fmt);
|
1311
1313
|
if (NIL_P(nls_params)) {
|
1312
1314
|
nls_params_ptr = NULL;
|
1313
1315
|
nls_params_len = 0;
|
1314
1316
|
} else {
|
1315
1317
|
StringValue(nls_params);
|
1316
1318
|
nls_params_ptr = RSTRING_ORATEXT(nls_params);
|
1317
|
-
nls_params_len =
|
1319
|
+
nls_params_len = RSTRING_LENINT(nls_params);
|
1318
1320
|
}
|
1319
1321
|
rv = OCINumberToText(errhp, _NUMBER(self),
|
1320
1322
|
fmt_ptr, fmt_len, nls_params_ptr, nls_params_len,
|
@@ -1435,7 +1437,7 @@ static VALUE onum_to_d_real(OCINumber *num, OCIError *errhp)
|
|
1435
1437
|
rb_require("bigdecimal");
|
1436
1438
|
cBigDecimal = rb_const_get(rb_cObject, id_BigDecimal);
|
1437
1439
|
}
|
1438
|
-
chkerr(OCINumberToText(errhp, num, (const oratext *)fmt, strlen(fmt),
|
1440
|
+
chkerr(OCINumberToText(errhp, num, (const oratext *)fmt, (ub4)strlen(fmt),
|
1439
1441
|
NULL, 0, &buf_size, TO_ORATEXT(buf)));
|
1440
1442
|
return rb_funcall(rb_cObject, id_BigDecimal, 1, rb_usascii_str_new(buf, buf_size));
|
1441
1443
|
}
|