ruby-oci8 2.2.0.2 → 2.2.12
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/.yardopts +1 -6
- data/ChangeLog +600 -0
- data/NEWS +426 -35
- data/README.md +27 -9
- data/dist-files +13 -2
- data/docs/bind-array-to-in_cond.md +38 -0
- data/docs/conflicts-local-connections-and-processes.md +98 -0
- data/docs/hanging-after-inactivity.md +63 -0
- data/docs/install-binary-package.md +15 -11
- data/docs/install-full-client.md +18 -21
- data/docs/install-instant-client.md +45 -27
- data/docs/install-on-osx.md +31 -117
- data/docs/ldap-auth-and-function-interposition.md +123 -0
- data/docs/number-type-mapping.md +79 -0
- data/docs/platform-specific-issues.md +17 -50
- data/docs/report-installation-issue.md +11 -8
- data/docs/timeout-parameters.md +94 -0
- data/ext/oci8/apiwrap.c.tmpl +2 -5
- data/ext/oci8/apiwrap.rb +6 -1
- data/ext/oci8/apiwrap.yml +39 -143
- data/ext/oci8/attr.c +4 -2
- data/ext/oci8/bind.c +421 -9
- data/ext/oci8/connection_pool.c +3 -3
- data/ext/oci8/encoding.c +5 -5
- data/ext/oci8/env.c +8 -2
- data/ext/oci8/error.c +24 -16
- data/ext/oci8/extconf.rb +35 -63
- data/ext/oci8/hook_funcs.c +274 -61
- data/ext/oci8/lob.c +31 -75
- data/ext/oci8/metadata.c +8 -6
- data/ext/oci8/object.c +119 -29
- data/ext/oci8/oci8.c +46 -133
- data/ext/oci8/oci8.h +40 -123
- data/ext/oci8/oci8lib.c +178 -46
- data/ext/oci8/ocihandle.c +37 -37
- data/ext/oci8/ocinumber.c +24 -35
- data/ext/oci8/oraconf.rb +168 -337
- data/ext/oci8/oradate.c +19 -19
- data/ext/oci8/plthook.h +10 -0
- data/ext/oci8/plthook_elf.c +433 -268
- data/ext/oci8/plthook_osx.c +40 -9
- data/ext/oci8/plthook_win32.c +16 -1
- data/ext/oci8/stmt.c +52 -17
- data/ext/oci8/win32.c +4 -22
- data/lib/oci8/bindtype.rb +10 -17
- data/lib/oci8/check_load_error.rb +57 -10
- data/lib/oci8/compat.rb +5 -1
- data/lib/oci8/connection_pool.rb +74 -3
- data/lib/oci8/cursor.rb +70 -31
- data/lib/oci8/metadata.rb +9 -1
- data/lib/oci8/object.rb +14 -1
- data/lib/oci8/oci8.rb +184 -58
- data/lib/oci8/ocihandle.rb +0 -16
- data/lib/oci8/oracle_version.rb +11 -1
- data/lib/oci8/properties.rb +55 -0
- data/lib/oci8/version.rb +1 -1
- data/lib/oci8.rb +48 -4
- data/lib/ruby-oci8.rb +1 -0
- data/pre-distclean.rb +1 -3
- data/ruby-oci8.gemspec +4 -9
- data/setup.rb +11 -2
- data/test/README.md +37 -0
- data/test/config.rb +8 -1
- data/test/setup_test_object.sql +42 -14
- data/test/setup_test_package.sql +59 -0
- data/test/test_all.rb +4 -0
- data/test/test_bind_array.rb +70 -0
- data/test/test_bind_boolean.rb +99 -0
- data/test/test_bind_integer.rb +47 -0
- data/test/test_break.rb +11 -9
- data/test/test_clob.rb +5 -17
- data/test/test_connstr.rb +142 -0
- data/test/test_datetime.rb +8 -3
- data/test/test_metadata.rb +2 -1
- data/test/test_object.rb +99 -18
- data/test/test_oci8.rb +170 -46
- data/test/test_oranumber.rb +12 -6
- data/test/test_package_type.rb +17 -3
- data/test/test_properties.rb +17 -0
- metadata +45 -55
- data/docs/osx-install-dev-tools.png +0 -0
- data/test/README +0 -42
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
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* metadata.c
|
4
4
|
*
|
5
|
-
* Copyright (C) 2006-
|
5
|
+
* Copyright (C) 2006-2016 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*
|
7
7
|
* implement private methods of classes in OCI8::Metadata module.
|
8
8
|
*
|
@@ -145,7 +145,7 @@ static VALUE metadata_is_implicit_p(VALUE self)
|
|
145
145
|
return md->is_implicit ? Qtrue : Qfalse;
|
146
146
|
}
|
147
147
|
|
148
|
-
|
148
|
+
VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype, VALUE klass, VALUE check_public)
|
149
149
|
{
|
150
150
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
151
151
|
OCIParam *parmhp;
|
@@ -195,7 +195,7 @@ static VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype,
|
|
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);
|
@@ -259,10 +259,10 @@ void Init_oci8_metadata(VALUE cOCI8)
|
|
259
259
|
{
|
260
260
|
mOCI8Metadata = rb_define_module_under(cOCI8, "Metadata");
|
261
261
|
cOCI8MetadataBase = oci8_define_class_under(mOCI8Metadata, "Base", &oci8_metadata_base_data_type, oci8_metadata_alloc);
|
262
|
-
ptype_to_class = rb_hash_new();
|
263
|
-
class_to_ptype = rb_hash_new();
|
264
262
|
rb_global_variable(&ptype_to_class);
|
265
263
|
rb_global_variable(&class_to_ptype);
|
264
|
+
ptype_to_class = rb_hash_new();
|
265
|
+
class_to_ptype = rb_hash_new();
|
266
266
|
id_at_obj_link = rb_intern("@obj_link");
|
267
267
|
|
268
268
|
rb_define_singleton_method(cOCI8MetadataBase, "register_ptype", metadata_s_register_ptype, 1);
|
@@ -274,4 +274,6 @@ void Init_oci8_metadata(VALUE cOCI8)
|
|
274
274
|
rb_define_private_method(cOCI8, "__describe", oci8_describe, 3);
|
275
275
|
rb_define_private_method(cOCI8MetadataBase, "__type_metadata", metadata_get_type_metadata, 1);
|
276
276
|
rb_define_method(cOCI8MetadataBase, "tdo_id", metadata_get_tdo_id, 0);
|
277
|
+
|
278
|
+
rb_define_class_under(mOCI8Metadata, "Type", cOCI8MetadataBase);
|
277
279
|
}
|
data/ext/oci8/object.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2002-
|
3
|
+
* Copyright (C) 2002-2016 Kubo Takehiro <kubo@jiubao.org>
|
4
4
|
*/
|
5
5
|
|
6
6
|
/*
|
@@ -20,8 +20,11 @@ static VALUE cOCI8TDO;
|
|
20
20
|
static VALUE cOCI8NamedType;
|
21
21
|
static VALUE cOCI8NamedCollection;
|
22
22
|
static VALUE cOCI8BindNamedType;
|
23
|
+
static VALUE cOCI8MetadataType;
|
23
24
|
static ID id_to_value;
|
24
25
|
static ID id_set_attributes;
|
26
|
+
static ID id_get_tdo_by_metadata;
|
27
|
+
static ID id_at_is_final_type;
|
25
28
|
|
26
29
|
#define TO_TDO(obj) ((oci8_base_t *)oci8_check_typeddata((obj), &oci8_tdo_data_type, 1))
|
27
30
|
#define CHECK_TDO(obj) ((void)oci8_check_typeddata((obj), &oci8_tdo_data_type, 1))
|
@@ -41,6 +44,8 @@ enum {
|
|
41
44
|
ATTR_FLOAT,
|
42
45
|
ATTR_INTEGER,
|
43
46
|
ATTR_OCIDATE,
|
47
|
+
ATTR_TIMESTAMP,
|
48
|
+
ATTR_TIMESTAMP_TZ,
|
44
49
|
ATTR_BINARY_DOUBLE,
|
45
50
|
ATTR_BINARY_FLOAT,
|
46
51
|
ATTR_NAMED_TYPE,
|
@@ -137,10 +142,49 @@ static VALUE oci8_named_type_initialize(VALUE self)
|
|
137
142
|
return Qnil;
|
138
143
|
}
|
139
144
|
|
145
|
+
typedef struct get_tdo_by_instance_arg {
|
146
|
+
VALUE svc;
|
147
|
+
void *instance;
|
148
|
+
void *typeref;
|
149
|
+
} get_tdo_by_instance_arg_t;
|
150
|
+
|
151
|
+
static VALUE get_tdo_by_instance(VALUE data)
|
152
|
+
{
|
153
|
+
get_tdo_by_instance_arg_t *arg = (get_tdo_by_instance_arg_t *)data;
|
154
|
+
VALUE metadata;
|
155
|
+
|
156
|
+
chkerr(OCIObjectGetTypeRef(oci8_envhp, oci8_errhp, arg->instance, arg->typeref));
|
157
|
+
metadata = oci8_do_describe(arg->svc, arg->typeref, 0, OCI_OTYPE_REF, cOCI8MetadataType, Qfalse);
|
158
|
+
return rb_funcall(arg->svc, id_get_tdo_by_metadata, 1, metadata);
|
159
|
+
}
|
160
|
+
|
140
161
|
static VALUE oci8_named_type_tdo(VALUE self)
|
141
162
|
{
|
142
163
|
oci8_named_type_t *obj = DATA_PTR(self);
|
143
|
-
|
164
|
+
VALUE tdo = obj->tdo;
|
165
|
+
|
166
|
+
if (!RTEST(rb_ivar_get(tdo, id_at_is_final_type))) {
|
167
|
+
/* The type of the instance may be a subtype. */
|
168
|
+
oci8_base_t *svcctx;
|
169
|
+
get_tdo_by_instance_arg_t arg;
|
170
|
+
int state = 0;
|
171
|
+
|
172
|
+
/* search svcctx */
|
173
|
+
svcctx = DATA_PTR(obj->tdo);
|
174
|
+
while (svcctx->type != OCI_HTYPE_SVCCTX) {
|
175
|
+
svcctx = svcctx->parent;
|
176
|
+
}
|
177
|
+
|
178
|
+
arg.svc = svcctx->self;
|
179
|
+
arg.instance = *obj->instancep;
|
180
|
+
chkerr(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->hp.svc, OCI_TYPECODE_REF, NULL, NULL, OCI_DURATION_DEFAULT, TRUE, &arg.typeref));
|
181
|
+
tdo = rb_protect(get_tdo_by_instance, (VALUE)&arg, &state);
|
182
|
+
chkerr(OCIObjectFree(oci8_envhp, oci8_errhp, arg.typeref, OCI_OBJECTFREE_FORCE));
|
183
|
+
if (state != 0) {
|
184
|
+
rb_jump_tag(state);
|
185
|
+
}
|
186
|
+
}
|
187
|
+
return tdo;
|
144
188
|
}
|
145
189
|
|
146
190
|
static void oci8_named_type_check_offset(VALUE self, VALUE val_offset, VALUE ind_offset, size_t val_size, void **instancep, OCIInd **indp)
|
@@ -193,6 +237,10 @@ static VALUE get_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *dat
|
|
193
237
|
return oci8_make_integer((OCINumber *)data, oci8_errhp);
|
194
238
|
case ATTR_OCIDATE:
|
195
239
|
return oci8_make_ocidate((OCIDate *)data);
|
240
|
+
case ATTR_TIMESTAMP:
|
241
|
+
return oci8_make_ocitimestamp(*(OCIDateTime**)data, FALSE);
|
242
|
+
case ATTR_TIMESTAMP_TZ:
|
243
|
+
return oci8_make_ocitimestamp(*(OCIDateTime**)data, TRUE);
|
196
244
|
case ATTR_BINARY_DOUBLE:
|
197
245
|
return rb_float_new(*(double*)data);
|
198
246
|
case ATTR_BINARY_FLOAT:
|
@@ -371,6 +419,18 @@ static VALUE oci8_named_coll_set_coll_element(VALUE self, VALUE datatype, VALUE
|
|
371
419
|
case ATTR_OCIDATE:
|
372
420
|
cb_data.indp = &cb_data.ind;
|
373
421
|
break;
|
422
|
+
case ATTR_TIMESTAMP:
|
423
|
+
chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->hp.svc, OCI_TYPECODE_TIMESTAMP, NULL, NULL, OCI_DURATION_SESSION, TRUE, &cb_data.data.ptr),
|
424
|
+
svcctx);
|
425
|
+
chker2(OCIObjectGetInd(oci8_envhp, oci8_errhp, cb_data.data.ptr, (dvoid**)&cb_data.indp),
|
426
|
+
svcctx);
|
427
|
+
break;
|
428
|
+
case ATTR_TIMESTAMP_TZ:
|
429
|
+
chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->hp.svc, OCI_TYPECODE_TIMESTAMP_TZ, NULL, NULL, OCI_DURATION_SESSION, TRUE, &cb_data.data.ptr),
|
430
|
+
svcctx);
|
431
|
+
chker2(OCIObjectGetInd(oci8_envhp, oci8_errhp, cb_data.data.ptr, (dvoid**)&cb_data.indp),
|
432
|
+
svcctx);
|
433
|
+
break;
|
374
434
|
case ATTR_BINARY_DOUBLE:
|
375
435
|
cb_data.data.dbl = 0.0;
|
376
436
|
cb_data.indp = &cb_data.ind;
|
@@ -425,7 +485,7 @@ static VALUE set_coll_element_func(set_coll_element_cb_data_t *cb_data)
|
|
425
485
|
|
426
486
|
chkerr(OCICollSize(oci8_envhp, oci8_errhp, coll, &size));
|
427
487
|
if (RARRAY_LEN(val) < size) {
|
428
|
-
chkerr(OCICollTrim(oci8_envhp, oci8_errhp, size - RARRAY_LEN(val), coll));
|
488
|
+
chkerr(OCICollTrim(oci8_envhp, oci8_errhp, (sb4)(size - RARRAY_LEN(val)), coll));
|
429
489
|
}
|
430
490
|
for (idx = 0; idx < RARRAY_LEN(val); idx++) {
|
431
491
|
switch (FIX2INT(datatype)) {
|
@@ -465,6 +525,8 @@ static VALUE set_coll_element_ensure(set_coll_element_cb_data_t *cb_data)
|
|
465
525
|
switch (FIX2INT(datatype)) {
|
466
526
|
case ATTR_STRING:
|
467
527
|
case ATTR_RAW:
|
528
|
+
case ATTR_TIMESTAMP:
|
529
|
+
case ATTR_TIMESTAMP_TZ:
|
468
530
|
case ATTR_NAMED_TYPE:
|
469
531
|
case ATTR_NAMED_COLLECTION:
|
470
532
|
if (cb_data->data.ptr != NULL) {
|
@@ -497,13 +559,13 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
|
|
497
559
|
case ATTR_STRING:
|
498
560
|
OCI8StringValue(val);
|
499
561
|
chkerr(OCIStringAssignText(oci8_envhp, oci8_errhp,
|
500
|
-
RSTRING_ORATEXT(val),
|
562
|
+
RSTRING_ORATEXT(val), RSTRING_LENINT(val),
|
501
563
|
(OCIString **)data));
|
502
564
|
break;
|
503
565
|
case ATTR_RAW:
|
504
566
|
StringValue(val);
|
505
567
|
chkerr(OCIRawAssignBytes(oci8_envhp, oci8_errhp,
|
506
|
-
RSTRING_ORATEXT(val),
|
568
|
+
RSTRING_ORATEXT(val), RSTRING_LENINT(val),
|
507
569
|
(OCIRaw **)data));
|
508
570
|
break;
|
509
571
|
case ATTR_OCINUMBER:
|
@@ -516,6 +578,12 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
|
|
516
578
|
case ATTR_OCIDATE:
|
517
579
|
oci8_set_ocidate((OCIDate*)data, val);
|
518
580
|
break;
|
581
|
+
case ATTR_TIMESTAMP:
|
582
|
+
oci8_set_ocitimestamp_tz(*(OCIDateTime **)data, val, Qnil);
|
583
|
+
break;
|
584
|
+
case ATTR_TIMESTAMP_TZ:
|
585
|
+
oci8_set_ocitimestamp_tz(*(OCIDateTime **)data, val, Qnil);
|
586
|
+
break;
|
519
587
|
case ATTR_BINARY_DOUBLE:
|
520
588
|
*(double*)data = NUM2DBL(val);
|
521
589
|
break;
|
@@ -612,45 +680,57 @@ static VALUE oci8_named_collection_alloc(VALUE klass)
|
|
612
680
|
return oci8_allocate_typeddata(klass, &oci8_named_collection_data_type);
|
613
681
|
}
|
614
682
|
|
683
|
+
typedef struct {
|
684
|
+
oci8_bind_t bind;
|
685
|
+
VALUE *obj;
|
686
|
+
} bind_named_type_t;
|
687
|
+
|
615
688
|
static void bind_named_type_mark(oci8_base_t *base)
|
616
689
|
{
|
617
|
-
|
618
|
-
oci8_hp_obj_t *oho = (oci8_hp_obj_t *)obind->valuep;
|
690
|
+
bind_named_type_t *bnt = (bind_named_type_t *)base;
|
619
691
|
|
620
|
-
if (
|
692
|
+
if (bnt->obj != NULL) {
|
621
693
|
ub4 idx = 0;
|
622
694
|
|
623
695
|
do {
|
624
|
-
rb_gc_mark(
|
625
|
-
} while (++idx <
|
696
|
+
rb_gc_mark(bnt->obj[idx]);
|
697
|
+
} while (++idx < bnt->bind.maxar_sz);
|
626
698
|
}
|
627
|
-
rb_gc_mark(
|
699
|
+
rb_gc_mark(bnt->bind.tdo);
|
628
700
|
}
|
629
701
|
|
630
702
|
static void bind_named_type_free(oci8_base_t *base)
|
631
703
|
{
|
632
|
-
|
633
|
-
|
704
|
+
bind_named_type_t *bnt = (bind_named_type_t *)base;
|
705
|
+
void **hp = (void **)bnt->bind.valuep;
|
634
706
|
|
635
|
-
if (
|
707
|
+
if (hp != NULL) {
|
636
708
|
ub4 idx = 0;
|
637
709
|
|
638
710
|
do {
|
639
|
-
if (
|
640
|
-
OCIObjectFree(oci8_envhp, oci8_errhp,
|
641
|
-
|
711
|
+
if (hp[idx] != NULL) {
|
712
|
+
OCIObjectFree(oci8_envhp, oci8_errhp, hp[idx], OCI_DEFAULT);
|
713
|
+
hp[idx] = NULL;
|
642
714
|
}
|
643
|
-
} while (++idx <
|
715
|
+
} while (++idx < bnt->bind.maxar_sz);
|
716
|
+
}
|
717
|
+
if (bnt->obj != NULL) {
|
718
|
+
xfree(bnt->obj);
|
719
|
+
bnt->obj = NULL;
|
644
720
|
}
|
645
721
|
oci8_bind_free(base);
|
646
722
|
}
|
647
723
|
|
648
724
|
static VALUE bind_named_type_get(oci8_bind_t *obind, void *data, void *null_struct)
|
649
725
|
{
|
650
|
-
|
651
|
-
|
726
|
+
bind_named_type_t *bnt = (bind_named_type_t *)obind;
|
727
|
+
ub4 idx = obind->curar_idx;
|
728
|
+
|
729
|
+
return bnt->obj[idx];
|
652
730
|
}
|
653
731
|
|
732
|
+
NORETURN(static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val));
|
733
|
+
|
654
734
|
static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
|
655
735
|
{
|
656
736
|
rb_raise(rb_eRuntimeError, "not supported");
|
@@ -658,10 +738,12 @@ static void bind_named_type_set(oci8_bind_t *obind, void *data, void **null_stru
|
|
658
738
|
|
659
739
|
static void bind_named_type_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
|
660
740
|
{
|
741
|
+
bind_named_type_t *bnt = (bind_named_type_t *)obind;
|
661
742
|
VALUE tdo_obj = length;
|
662
743
|
|
663
744
|
obind->value_sz = sizeof(void*);
|
664
|
-
obind->alloc_sz = sizeof(
|
745
|
+
obind->alloc_sz = sizeof(void*);
|
746
|
+
bnt->obj = xcalloc(sizeof(VALUE), obind->maxar_sz ? obind->maxar_sz : 1);
|
665
747
|
|
666
748
|
CHECK_TDO(tdo_obj);
|
667
749
|
RB_OBJ_WRITE(obind->base.self, &obind->tdo, tdo_obj);
|
@@ -669,7 +751,8 @@ static void bind_named_type_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE
|
|
669
751
|
|
670
752
|
static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
|
671
753
|
{
|
672
|
-
|
754
|
+
bind_named_type_t *bnt = (bind_named_type_t *)obind;
|
755
|
+
void **hp = (void **)obind->valuep;
|
673
756
|
oci8_base_t *tdo = DATA_PTR(obind->tdo);
|
674
757
|
OCITypeCode tc = OCITypeTypeCode(oci8_envhp, oci8_errhp, tdo->hp.tdo);
|
675
758
|
VALUE klass = Qnil;
|
@@ -687,14 +770,14 @@ static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
|
|
687
770
|
}
|
688
771
|
svcctx = oci8_get_svcctx(svc);
|
689
772
|
do {
|
690
|
-
|
691
|
-
RB_OBJ_WRITTEN(obind->base.self, Qundef,
|
692
|
-
obj = DATA_PTR(
|
693
|
-
RB_OBJ_WRITE(
|
694
|
-
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];
|
695
778
|
obj->null_structp = (char**)&obind->u.null_structs[idx];
|
696
779
|
oci8_link_to_parent(&obj->base, &obind->base);
|
697
|
-
RB_OBJ_WRITTEN(
|
780
|
+
RB_OBJ_WRITTEN(bnt->obj[idx], Qundef, obind->base.self);
|
698
781
|
|
699
782
|
chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->base.hp.svc, tc, tdo->hp.tdo, NULL, OCI_DURATION_SESSION, TRUE, (dvoid**)obj->instancep),
|
700
783
|
&svcctx->base);
|
@@ -736,7 +819,7 @@ static const oci8_bind_data_type_t bind_named_type_data_type = {
|
|
736
819
|
#endif
|
737
820
|
},
|
738
821
|
bind_named_type_free,
|
739
|
-
sizeof(
|
822
|
+
sizeof(bind_named_type_t)
|
740
823
|
},
|
741
824
|
bind_named_type_get,
|
742
825
|
bind_named_type_set,
|
@@ -754,8 +837,11 @@ static VALUE bind_named_type_alloc(VALUE klass)
|
|
754
837
|
|
755
838
|
void Init_oci_object(VALUE cOCI8)
|
756
839
|
{
|
840
|
+
cOCI8MetadataType = rb_eval_string("OCI8::Metadata::Type");
|
757
841
|
id_to_value = rb_intern("to_value");
|
758
842
|
id_set_attributes = rb_intern("attributes=");
|
843
|
+
id_get_tdo_by_metadata = rb_intern("get_tdo_by_metadata");
|
844
|
+
id_at_is_final_type = rb_intern("@is_final_type");
|
759
845
|
|
760
846
|
/* OCI8::TDO */
|
761
847
|
cOCI8TDO = oci8_define_class_under(cOCI8, "TDO", &oci8_tdo_data_type, oci8_tdo_alloc);
|
@@ -773,6 +859,10 @@ void Init_oci_object(VALUE cOCI8)
|
|
773
859
|
/* @private */
|
774
860
|
rb_define_const(cOCI8TDO, "ATTR_OCIDATE", INT2FIX(ATTR_OCIDATE));
|
775
861
|
/* @private */
|
862
|
+
rb_define_const(cOCI8TDO, "ATTR_TIMESTAMP", INT2FIX(ATTR_TIMESTAMP));
|
863
|
+
/* @private */
|
864
|
+
rb_define_const(cOCI8TDO, "ATTR_TIMESTAMP_TZ", INT2FIX(ATTR_TIMESTAMP_TZ));
|
865
|
+
/* @private */
|
776
866
|
rb_define_const(cOCI8TDO, "ATTR_BINARY_DOUBLE", INT2FIX(ATTR_BINARY_DOUBLE));
|
777
867
|
/* @private */
|
778
868
|
rb_define_const(cOCI8TDO, "ATTR_BINARY_FLOAT", INT2FIX(ATTR_BINARY_FLOAT));
|