ruby-oci8 2.1.7 → 2.1.8
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 +136 -0
- data/NEWS +61 -0
- data/README.md +2 -2
- data/VERSION +1 -1
- data/dist-files +5 -0
- data/docs/install-instant-client.md +2 -0
- data/ext/oci8/attr.c +0 -9
- data/ext/oci8/bind.c +86 -28
- data/ext/oci8/connection_pool.c +32 -17
- data/ext/oci8/extconf.rb +21 -0
- data/ext/oci8/hook_funcs.c +215 -0
- data/ext/oci8/lob.c +363 -168
- data/ext/oci8/metadata.c +43 -26
- data/ext/oci8/object.c +115 -36
- data/ext/oci8/oci8.c +392 -269
- data/ext/oci8/oci8.h +88 -33
- data/ext/oci8/oci8lib.c +59 -28
- data/ext/oci8/ocidatetime.c +100 -36
- data/ext/oci8/ocihandle.c +288 -286
- data/ext/oci8/ocinumber.c +172 -112
- data/ext/oci8/oradate.c +129 -87
- data/ext/oci8/plthook.h +56 -0
- data/ext/oci8/plthook_elf.c +537 -0
- data/ext/oci8/plthook_osx.c +474 -0
- data/ext/oci8/plthook_win32.c +376 -0
- data/ext/oci8/stmt.c +112 -75
- data/lib/oci8/cursor.rb +1 -1
- data/lib/oci8/oci8.rb +71 -0
- data/lib/oci8/properties.rb +18 -3
- metadata +10 -16
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-2015 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*
|
7
7
|
* implement private methods of classes in OCI8::Metadata module.
|
8
8
|
*
|
@@ -11,11 +11,13 @@
|
|
11
11
|
#include "oci8.h"
|
12
12
|
|
13
13
|
static VALUE mOCI8Metadata;
|
14
|
-
VALUE cOCI8MetadataBase;
|
14
|
+
static VALUE cOCI8MetadataBase;
|
15
15
|
static VALUE ptype_to_class;
|
16
16
|
static VALUE class_to_ptype;
|
17
17
|
static ID id_at_obj_link;
|
18
18
|
|
19
|
+
#define TO_METADATA(obj) ((oci8_metadata_t *)oci8_check_typeddata((obj), &oci8_metadata_base_data_type, 1))
|
20
|
+
|
19
21
|
typedef struct {
|
20
22
|
oci8_base_t base;
|
21
23
|
VALUE svc;
|
@@ -35,17 +37,32 @@ static void oci8_metadata_free(oci8_base_t *base)
|
|
35
37
|
base->type = 0; /* to prevent OCIDescriptorFree */
|
36
38
|
}
|
37
39
|
|
40
|
+
const oci8_handle_data_type_t oci8_metadata_base_data_type = {
|
41
|
+
{
|
42
|
+
"OCI8::Metadata::Base",
|
43
|
+
{
|
44
|
+
(RUBY_DATA_FUNC)oci8_metadata_mark,
|
45
|
+
oci8_handle_cleanup,
|
46
|
+
oci8_handle_size,
|
47
|
+
},
|
48
|
+
&oci8_handle_data_type.rb_data_type, NULL,
|
49
|
+
#ifdef RUBY_TYPED_WB_PROTECTED
|
50
|
+
RUBY_TYPED_WB_PROTECTED,
|
51
|
+
#endif
|
52
|
+
},
|
53
|
+
oci8_metadata_free,
|
54
|
+
sizeof(oci8_metadata_t),
|
55
|
+
};
|
56
|
+
|
38
57
|
VALUE oci8_metadata_create(OCIParam *parmhp, VALUE svc, VALUE parent)
|
39
58
|
{
|
40
59
|
oci8_metadata_t *md;
|
41
|
-
oci8_base_t *p;
|
60
|
+
oci8_base_t *p = oci8_check_typeddata(parent, &oci8_handle_data_type, 1);
|
42
61
|
ub1 ptype;
|
43
62
|
ub4 size;
|
44
63
|
VALUE klass;
|
45
64
|
VALUE obj;
|
46
65
|
|
47
|
-
p = oci8_get_handle(parent, oci8_cOCIHandle);
|
48
|
-
|
49
66
|
chker2(OCIAttrGet(parmhp, OCI_DTYPE_PARAM, &ptype, &size, OCI_ATTR_PTYPE, oci8_errhp), p);
|
50
67
|
klass = rb_hash_aref(ptype_to_class, INT2FIX(ptype));
|
51
68
|
if (NIL_P(klass))
|
@@ -54,10 +71,10 @@ VALUE oci8_metadata_create(OCIParam *parmhp, VALUE svc, VALUE parent)
|
|
54
71
|
if (!RTEST(rb_obj_is_kind_of(obj, cOCI8MetadataBase))) {
|
55
72
|
rb_raise(rb_eRuntimeError, "invalid class in PTYPE_TO_CLASS");
|
56
73
|
}
|
57
|
-
md =
|
74
|
+
md = TO_METADATA(obj);
|
58
75
|
md->base.type = OCI_DTYPE_PARAM;
|
59
76
|
md->base.hp.prm = parmhp;
|
60
|
-
md->svc
|
77
|
+
RB_OBJ_WRITE(obj, &md->svc, svc);
|
61
78
|
|
62
79
|
if (p->type == OCI_HTYPE_STMT) {
|
63
80
|
md->is_implicit = 1;
|
@@ -65,6 +82,7 @@ VALUE oci8_metadata_create(OCIParam *parmhp, VALUE svc, VALUE parent)
|
|
65
82
|
md->is_implicit = 0;
|
66
83
|
}
|
67
84
|
oci8_link_to_parent(&md->base, p);
|
85
|
+
RB_OBJ_WRITTEN(obj, Qundef, p->self);
|
68
86
|
return obj;
|
69
87
|
}
|
70
88
|
|
@@ -87,7 +105,7 @@ static VALUE metadata_s_register_ptype(VALUE klass, VALUE ptype)
|
|
87
105
|
*/
|
88
106
|
static VALUE metadata_get_param(VALUE self, VALUE idx)
|
89
107
|
{
|
90
|
-
oci8_metadata_t *md =
|
108
|
+
oci8_metadata_t *md = TO_METADATA(self);
|
91
109
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(md->svc);
|
92
110
|
OCIParam *value;
|
93
111
|
ub4 size = sizeof(value);
|
@@ -107,7 +125,7 @@ static VALUE metadata_get_param(VALUE self, VALUE idx)
|
|
107
125
|
|
108
126
|
static VALUE metadata_get_param_at(VALUE self, VALUE idx)
|
109
127
|
{
|
110
|
-
oci8_metadata_t *md =
|
128
|
+
oci8_metadata_t *md = TO_METADATA(self);
|
111
129
|
OCIParam *value;
|
112
130
|
|
113
131
|
chker2(OCIParamGet(md->base.hp.ptr, md->base.type, oci8_errhp, (dvoid *)&value, FIX2INT(idx)),
|
@@ -117,19 +135,19 @@ static VALUE metadata_get_param_at(VALUE self, VALUE idx)
|
|
117
135
|
|
118
136
|
static VALUE metadata_get_con(VALUE self)
|
119
137
|
{
|
120
|
-
oci8_metadata_t *md =
|
138
|
+
oci8_metadata_t *md = TO_METADATA(self);
|
121
139
|
return md->svc;
|
122
140
|
}
|
123
141
|
|
124
142
|
static VALUE metadata_is_implicit_p(VALUE self)
|
125
143
|
{
|
126
|
-
oci8_metadata_t *md =
|
144
|
+
oci8_metadata_t *md = TO_METADATA(self);
|
127
145
|
return md->is_implicit ? Qtrue : Qfalse;
|
128
146
|
}
|
129
147
|
|
130
148
|
static VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype, VALUE klass, VALUE check_public)
|
131
149
|
{
|
132
|
-
oci8_svcctx_t *svcctx =
|
150
|
+
oci8_svcctx_t *svcctx = oci8_get_svcctx(self);
|
133
151
|
OCIParam *parmhp;
|
134
152
|
VALUE type;
|
135
153
|
VALUE obj;
|
@@ -165,12 +183,12 @@ static VALUE oci8_do_describe(VALUE self, void *objptr, ub4 objlen, ub1 objtype,
|
|
165
183
|
* call-seq:
|
166
184
|
* __describe(name, klass, check_public)
|
167
185
|
*
|
168
|
-
*
|
169
|
-
*
|
170
|
-
*
|
171
|
-
*
|
172
|
-
*
|
173
|
-
*
|
186
|
+
* @param [String] name object name
|
187
|
+
* @param [subclass of OCI8::Metadata::Base] klass
|
188
|
+
* @param [Boolean] check_public +true+ to look up the object as a public synonym when
|
189
|
+
* the object does not exist in the current schema and
|
190
|
+
* the name includes no dots.
|
191
|
+
* @return [subclass of OCI8::Metadata::Base]
|
174
192
|
*
|
175
193
|
* @private
|
176
194
|
*/
|
@@ -200,7 +218,7 @@ static VALUE oci8_describe(VALUE self, VALUE name, VALUE klass, VALUE check_publ
|
|
200
218
|
|
201
219
|
static VALUE metadata_get_type_metadata(VALUE self, VALUE klass)
|
202
220
|
{
|
203
|
-
oci8_metadata_t *md =
|
221
|
+
oci8_metadata_t *md = TO_METADATA(self);
|
204
222
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(md->svc);
|
205
223
|
OCIRef *ref = NULL;
|
206
224
|
|
@@ -212,7 +230,7 @@ static VALUE metadata_get_type_metadata(VALUE self, VALUE klass)
|
|
212
230
|
|
213
231
|
static VALUE metadata_get_tdo_id(VALUE self)
|
214
232
|
{
|
215
|
-
oci8_metadata_t *md =
|
233
|
+
oci8_metadata_t *md = TO_METADATA(self);
|
216
234
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(md->svc);
|
217
235
|
OCIRef *tdo_ref = NULL;
|
218
236
|
void *tdo;
|
@@ -232,16 +250,15 @@ static VALUE metadata_get_tdo_id(VALUE self)
|
|
232
250
|
#endif
|
233
251
|
}
|
234
252
|
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
};
|
253
|
+
static VALUE oci8_metadata_alloc(VALUE klass)
|
254
|
+
{
|
255
|
+
return oci8_allocate_typeddata(klass, &oci8_metadata_base_data_type);
|
256
|
+
}
|
240
257
|
|
241
258
|
void Init_oci8_metadata(VALUE cOCI8)
|
242
259
|
{
|
243
260
|
mOCI8Metadata = rb_define_module_under(cOCI8, "Metadata");
|
244
|
-
cOCI8MetadataBase = oci8_define_class_under(mOCI8Metadata, "Base", &
|
261
|
+
cOCI8MetadataBase = oci8_define_class_under(mOCI8Metadata, "Base", &oci8_metadata_base_data_type, oci8_metadata_alloc);
|
245
262
|
ptype_to_class = rb_hash_new();
|
246
263
|
class_to_ptype = rb_hash_new();
|
247
264
|
rb_global_variable(&ptype_to_class);
|
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-2014 Kubo Takehiro <kubo@jiubao.org>
|
4
4
|
*/
|
5
5
|
|
6
6
|
/*
|
@@ -23,6 +23,9 @@ static VALUE cOCI8BindNamedType;
|
|
23
23
|
static ID id_to_value;
|
24
24
|
static ID id_set_attributes;
|
25
25
|
|
26
|
+
#define TO_TDO(obj) ((oci8_base_t *)oci8_check_typeddata((obj), &oci8_tdo_data_type, 1))
|
27
|
+
#define CHECK_TDO(obj) ((void)oci8_check_typeddata((obj), &oci8_tdo_data_type, 1))
|
28
|
+
|
26
29
|
typedef struct {
|
27
30
|
oci8_base_t base;
|
28
31
|
VALUE tdo;
|
@@ -66,16 +69,30 @@ static void oci8_tdo_free(oci8_base_t *base)
|
|
66
69
|
}
|
67
70
|
}
|
68
71
|
|
72
|
+
static const oci8_handle_data_type_t oci8_tdo_data_type = {
|
73
|
+
{
|
74
|
+
"OCI8::TDO",
|
75
|
+
{
|
76
|
+
(RUBY_DATA_FUNC)oci8_tdo_mark,
|
77
|
+
oci8_handle_cleanup,
|
78
|
+
oci8_handle_size,
|
79
|
+
},
|
80
|
+
&oci8_handle_data_type.rb_data_type, NULL,
|
81
|
+
#ifdef RUBY_TYPED_WB_PROTECTED
|
82
|
+
RUBY_TYPED_WB_PROTECTED,
|
83
|
+
#endif
|
84
|
+
},
|
85
|
+
oci8_tdo_free,
|
86
|
+
sizeof(oci8_base_t)
|
87
|
+
};
|
88
|
+
|
69
89
|
static VALUE oci8_tdo_setup(VALUE self, VALUE svc, VALUE md_obj)
|
70
90
|
{
|
71
|
-
oci8_base_t *tdo =
|
91
|
+
oci8_base_t *tdo = TO_TDO(self);
|
72
92
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(svc);
|
73
|
-
oci8_base_t *md;
|
93
|
+
oci8_base_t *md = oci8_check_typeddata(md_obj, &oci8_metadata_base_data_type, 1);
|
74
94
|
OCIRef *tdo_ref = NULL;
|
75
95
|
|
76
|
-
Check_Object(md_obj, cOCI8MetadataBase);
|
77
|
-
md = DATA_PTR(md_obj);
|
78
|
-
|
79
96
|
if (tdo->hp.tdo != NULL) {
|
80
97
|
OCIObjectUnpin(oci8_envhp, oci8_errhp, tdo->hp.tdo);
|
81
98
|
tdo->hp.tdo = NULL;
|
@@ -87,14 +104,14 @@ static VALUE oci8_tdo_setup(VALUE self, VALUE svc, VALUE md_obj)
|
|
87
104
|
chker2(OCIObjectPin_nb(svcctx, oci8_envhp, oci8_errhp, tdo_ref, 0, OCI_PIN_ANY, OCI_DURATION_SESSION, OCI_LOCK_NONE, &tdo->hp.ptr),
|
88
105
|
&svcctx->base);
|
89
106
|
oci8_link_to_parent(tdo, &svcctx->base);
|
107
|
+
RB_OBJ_WRITTEN(self, Qundef, svc);
|
90
108
|
return self;
|
91
109
|
}
|
92
110
|
|
93
|
-
static
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
};
|
111
|
+
static VALUE oci8_tdo_alloc(VALUE klass)
|
112
|
+
{
|
113
|
+
return oci8_allocate_typeddata(klass, &oci8_tdo_data_type);
|
114
|
+
}
|
98
115
|
|
99
116
|
static void oci8_named_type_mark(oci8_base_t *base)
|
100
117
|
{
|
@@ -181,28 +198,32 @@ static VALUE get_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *dat
|
|
181
198
|
case ATTR_BINARY_FLOAT:
|
182
199
|
return rb_float_new((double)*(float*)data);
|
183
200
|
case ATTR_NAMED_TYPE:
|
184
|
-
|
201
|
+
CHECK_TDO(typeinfo);
|
185
202
|
/* Be carefull. Don't use *tmp_obj* out of this function. */
|
186
203
|
tmp_obj = rb_class_new_instance(0, NULL, cOCI8NamedType);
|
187
204
|
obj = DATA_PTR(tmp_obj);
|
188
|
-
obj->tdo
|
205
|
+
RB_OBJ_WRITE(tmp_obj, &obj->tdo, typeinfo);
|
189
206
|
obj->instancep = (char**)&data;
|
190
207
|
obj->null_structp = (char**)&ind;
|
191
208
|
oci8_link_to_parent(&obj->base, DATA_PTR(self));
|
209
|
+
RB_OBJ_WRITTEN(tmp_obj, Qundef, self);
|
192
210
|
rv = rb_funcall(tmp_obj, id_to_value, 0);
|
193
211
|
oci8_unlink_from_parent(&obj->base);
|
212
|
+
RB_OBJ_WRITTEN(tmp_obj, self, Qundef);
|
194
213
|
return rv;
|
195
214
|
case ATTR_NAMED_COLLECTION:
|
196
|
-
|
215
|
+
CHECK_TDO(typeinfo);
|
197
216
|
/* Be carefull. Don't use *tmp_obj* out of this function. */
|
198
217
|
tmp_obj = rb_class_new_instance(0, NULL, cOCI8NamedCollection);
|
199
218
|
obj = DATA_PTR(tmp_obj);
|
200
|
-
obj->tdo
|
219
|
+
RB_OBJ_WRITE(tmp_obj, &obj->tdo, typeinfo);
|
201
220
|
obj->instancep = (char**)data;
|
202
221
|
obj->null_structp = (char**)&ind;
|
203
222
|
oci8_link_to_parent(&obj->base, DATA_PTR(self));
|
223
|
+
RB_OBJ_WRITTEN(tmp_obj, Qundef, self);
|
204
224
|
rv = rb_funcall(tmp_obj, id_to_value, 0);
|
205
225
|
oci8_unlink_from_parent(&obj->base);
|
226
|
+
RB_OBJ_WRITTEN(tmp_obj, self, Qundef);
|
206
227
|
return rv;
|
207
228
|
case ATTR_CLOB:
|
208
229
|
return oci8_make_clob(oci8_get_svcctx(typeinfo), *(OCILobLocator**)data);
|
@@ -359,16 +380,14 @@ static VALUE oci8_named_coll_set_coll_element(VALUE self, VALUE datatype, VALUE
|
|
359
380
|
cb_data.indp = &cb_data.ind;
|
360
381
|
break;
|
361
382
|
case ATTR_NAMED_TYPE:
|
362
|
-
|
363
|
-
tdo = DATA_PTR(typeinfo);
|
383
|
+
tdo = TO_TDO(typeinfo);
|
364
384
|
chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->hp.svc, OCI_TYPECODE_OBJECT, tdo->hp.tdo, NULL, OCI_DURATION_SESSION, TRUE, &cb_data.data.ptr),
|
365
385
|
svcctx);
|
366
386
|
chker2(OCIObjectGetInd(oci8_envhp, oci8_errhp, cb_data.data.ptr, (dvoid**)&cb_data.indp),
|
367
387
|
svcctx);
|
368
388
|
break;
|
369
389
|
case ATTR_NAMED_COLLECTION:
|
370
|
-
|
371
|
-
tdo = DATA_PTR(typeinfo);
|
390
|
+
tdo = TO_TDO(typeinfo);
|
372
391
|
chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->hp.svc, OCI_TYPECODE_NAMEDCOLLECTION, tdo->hp.tdo, NULL, OCI_DURATION_SESSION, TRUE, &cb_data.data.ptr),
|
373
392
|
svcctx);
|
374
393
|
chker2(OCIObjectGetInd(oci8_envhp, oci8_errhp, cb_data.data.ptr, (dvoid**)&cb_data.indp),
|
@@ -411,10 +430,10 @@ static VALUE set_coll_element_func(set_coll_element_cb_data_t *cb_data)
|
|
411
430
|
for (idx = 0; idx < RARRAY_LEN(val); idx++) {
|
412
431
|
switch (FIX2INT(datatype)) {
|
413
432
|
case ATTR_NAMED_TYPE:
|
414
|
-
set_attribute(self, datatype, typeinfo, cb_data->data.ptr, cb_data->indp,
|
433
|
+
set_attribute(self, datatype, typeinfo, cb_data->data.ptr, cb_data->indp, RARRAY_AREF(val, idx));
|
415
434
|
break;
|
416
435
|
default:
|
417
|
-
set_attribute(self, datatype, typeinfo, (void*)&cb_data->data, cb_data->indp,
|
436
|
+
set_attribute(self, datatype, typeinfo, (void*)&cb_data->data, cb_data->indp, RARRAY_AREF(val, idx));
|
418
437
|
break;
|
419
438
|
}
|
420
439
|
switch (FIX2INT(datatype)) {
|
@@ -504,28 +523,32 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
|
|
504
523
|
*(float*)data = (float)NUM2DBL(val);
|
505
524
|
break;
|
506
525
|
case ATTR_NAMED_TYPE:
|
507
|
-
|
526
|
+
CHECK_TDO(typeinfo);
|
508
527
|
/* Be carefull. Don't use *tmp_obj* out of this function. */
|
509
528
|
tmp_obj = rb_class_new_instance(0, NULL, cOCI8NamedType);
|
510
529
|
obj = DATA_PTR(tmp_obj);
|
511
|
-
obj->tdo
|
530
|
+
RB_OBJ_WRITE(tmp_obj, &obj->tdo, typeinfo);
|
512
531
|
obj->instancep = (char**)&data;
|
513
532
|
obj->null_structp = (char**)&ind;
|
514
533
|
oci8_link_to_parent(&obj->base, DATA_PTR(self));
|
534
|
+
RB_OBJ_WRITTEN(tmp_obj, Qundef, self);
|
515
535
|
rb_funcall(tmp_obj, id_set_attributes, 1, val);
|
516
536
|
oci8_unlink_from_parent(&obj->base);
|
537
|
+
RB_OBJ_WRITTEN(tmp_obj, self, Qundef);
|
517
538
|
break;
|
518
539
|
case ATTR_NAMED_COLLECTION:
|
519
|
-
|
540
|
+
CHECK_TDO(typeinfo);
|
520
541
|
/* Be carefull. Don't use *tmp_obj* out of this function. */
|
521
542
|
tmp_obj = rb_class_new_instance(0, NULL, cOCI8NamedCollection);
|
522
543
|
obj = DATA_PTR(tmp_obj);
|
523
|
-
obj->tdo
|
544
|
+
RB_OBJ_WRITE(tmp_obj, &obj->tdo, typeinfo);
|
524
545
|
obj->instancep = (char**)data;
|
525
546
|
obj->null_structp = (char**)&ind;
|
526
547
|
oci8_link_to_parent(&obj->base, DATA_PTR(self));
|
548
|
+
RB_OBJ_WRITTEN(tmp_obj, Qundef, self);
|
527
549
|
rb_funcall(tmp_obj, id_set_attributes, 1, val);
|
528
550
|
oci8_unlink_from_parent(&obj->base);
|
551
|
+
RB_OBJ_WRITTEN(tmp_obj, self, Qundef);
|
529
552
|
break;
|
530
553
|
case ATTR_CLOB:
|
531
554
|
oci8_assign_clob(oci8_get_svcctx(typeinfo), val, (OCILobLocator **)data);
|
@@ -545,12 +568,50 @@ static void set_attribute(VALUE self, VALUE datatype, VALUE typeinfo, void *data
|
|
545
568
|
*ind = 0;
|
546
569
|
}
|
547
570
|
|
548
|
-
static
|
549
|
-
|
571
|
+
static const oci8_handle_data_type_t oci8_named_type_data_type = {
|
572
|
+
{
|
573
|
+
"OCI8::NamedType",
|
574
|
+
{
|
575
|
+
(RUBY_DATA_FUNC)oci8_named_type_mark,
|
576
|
+
oci8_handle_cleanup,
|
577
|
+
oci8_handle_size,
|
578
|
+
},
|
579
|
+
&oci8_handle_data_type.rb_data_type, NULL,
|
580
|
+
#ifdef RUBY_TYPED_WB_PROTECTED
|
581
|
+
RUBY_TYPED_WB_PROTECTED,
|
582
|
+
#endif
|
583
|
+
},
|
584
|
+
oci8_named_type_free,
|
585
|
+
sizeof(oci8_named_type_t)
|
586
|
+
};
|
587
|
+
|
588
|
+
static const oci8_handle_data_type_t oci8_named_collection_data_type = {
|
589
|
+
{
|
590
|
+
"OCI8::NamedCollection",
|
591
|
+
{
|
592
|
+
(RUBY_DATA_FUNC)oci8_named_type_mark,
|
593
|
+
oci8_handle_cleanup,
|
594
|
+
oci8_handle_size,
|
595
|
+
},
|
596
|
+
&oci8_handle_data_type.rb_data_type, NULL,
|
597
|
+
#ifdef RUBY_TYPED_WB_PROTECTED
|
598
|
+
RUBY_TYPED_WB_PROTECTED,
|
599
|
+
#endif
|
600
|
+
},
|
550
601
|
oci8_named_type_free,
|
551
602
|
sizeof(oci8_named_type_t)
|
552
603
|
};
|
553
604
|
|
605
|
+
static VALUE oci8_named_type_alloc(VALUE klass)
|
606
|
+
{
|
607
|
+
return oci8_allocate_typeddata(klass, &oci8_named_type_data_type);
|
608
|
+
}
|
609
|
+
|
610
|
+
static VALUE oci8_named_collection_alloc(VALUE klass)
|
611
|
+
{
|
612
|
+
return oci8_allocate_typeddata(klass, &oci8_named_collection_data_type);
|
613
|
+
}
|
614
|
+
|
554
615
|
static void bind_named_type_mark(oci8_base_t *base)
|
555
616
|
{
|
556
617
|
oci8_bind_t *obind = (oci8_bind_t *)base;
|
@@ -602,8 +663,8 @@ static void bind_named_type_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE
|
|
602
663
|
obind->value_sz = sizeof(void*);
|
603
664
|
obind->alloc_sz = sizeof(oci8_hp_obj_t);
|
604
665
|
|
605
|
-
|
606
|
-
obind->tdo
|
666
|
+
CHECK_TDO(tdo_obj);
|
667
|
+
RB_OBJ_WRITE(obind->base.self, &obind->tdo, tdo_obj);
|
607
668
|
}
|
608
669
|
|
609
670
|
static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
|
@@ -627,11 +688,13 @@ static void bind_named_type_init_elem(oci8_bind_t *obind, VALUE svc)
|
|
627
688
|
svcctx = oci8_get_svcctx(svc);
|
628
689
|
do {
|
629
690
|
oho[idx].obj = rb_class_new_instance(0, NULL, klass);
|
691
|
+
RB_OBJ_WRITTEN(obind->base.self, Qundef, oho[idx].obj);
|
630
692
|
obj = DATA_PTR(oho[idx].obj);
|
631
|
-
obj->tdo
|
693
|
+
RB_OBJ_WRITE(oho[idx].obj, &obj->tdo, obind->tdo);
|
632
694
|
obj->instancep = (char**)&oho[idx].hp;
|
633
695
|
obj->null_structp = (char**)&obind->u.null_structs[idx];
|
634
696
|
oci8_link_to_parent(&obj->base, &obind->base);
|
697
|
+
RB_OBJ_WRITTEN(oho[idx].obj, Qundef, obind->base.self);
|
635
698
|
|
636
699
|
chker2(OCIObjectNew(oci8_envhp, oci8_errhp, svcctx->base.hp.svc, tc, tdo->hp.tdo, NULL, OCI_DURATION_SESSION, TRUE, (dvoid**)obj->instancep),
|
637
700
|
&svcctx->base);
|
@@ -658,9 +721,20 @@ static void bind_name_type_post_bind_hook(oci8_bind_t *obind)
|
|
658
721
|
}
|
659
722
|
}
|
660
723
|
|
661
|
-
static const
|
724
|
+
static const oci8_bind_data_type_t bind_named_type_data_type = {
|
662
725
|
{
|
663
|
-
|
726
|
+
{
|
727
|
+
"OCI8::BindType::NamedType",
|
728
|
+
{
|
729
|
+
(RUBY_DATA_FUNC)bind_named_type_mark,
|
730
|
+
oci8_handle_cleanup,
|
731
|
+
oci8_handle_size,
|
732
|
+
},
|
733
|
+
&oci8_bind_data_type.rb_data_type, NULL,
|
734
|
+
#ifdef RUBY_TYPED_WB_PROTECTED
|
735
|
+
RUBY_TYPED_WB_PROTECTED,
|
736
|
+
#endif
|
737
|
+
},
|
664
738
|
bind_named_type_free,
|
665
739
|
sizeof(oci8_bind_t)
|
666
740
|
},
|
@@ -673,13 +747,18 @@ static const oci8_bind_vtable_t bind_named_type_vtable = {
|
|
673
747
|
bind_name_type_post_bind_hook,
|
674
748
|
};
|
675
749
|
|
750
|
+
static VALUE bind_named_type_alloc(VALUE klass)
|
751
|
+
{
|
752
|
+
return oci8_allocate_typeddata(klass, &bind_named_type_data_type.base);
|
753
|
+
}
|
754
|
+
|
676
755
|
void Init_oci_object(VALUE cOCI8)
|
677
756
|
{
|
678
757
|
id_to_value = rb_intern("to_value");
|
679
758
|
id_set_attributes = rb_intern("attributes=");
|
680
759
|
|
681
760
|
/* OCI8::TDO */
|
682
|
-
cOCI8TDO = oci8_define_class_under(cOCI8, "TDO", &
|
761
|
+
cOCI8TDO = oci8_define_class_under(cOCI8, "TDO", &oci8_tdo_data_type, oci8_tdo_alloc);
|
683
762
|
rb_define_private_method(cOCI8TDO, "setup", oci8_tdo_setup, 2);
|
684
763
|
/* @private */
|
685
764
|
rb_define_const(cOCI8TDO, "ATTR_STRING", INT2FIX(ATTR_STRING));
|
@@ -732,7 +811,7 @@ void Init_oci_object(VALUE cOCI8)
|
|
732
811
|
rb_define_const(cOCI8TDO, "ALIGNMENT_OF_DOUBLE", INT2FIX(ALIGNMENT_OF(double)));
|
733
812
|
|
734
813
|
/* OCI8::NamedType */
|
735
|
-
cOCI8NamedType = oci8_define_class_under(cOCI8, "NamedType", &
|
814
|
+
cOCI8NamedType = oci8_define_class_under(cOCI8, "NamedType", &oci8_named_type_data_type, oci8_named_type_alloc);
|
736
815
|
rb_define_method(cOCI8NamedType, "initialize", oci8_named_type_initialize, 0);
|
737
816
|
rb_define_method(cOCI8NamedType, "tdo", oci8_named_type_tdo, 0);
|
738
817
|
rb_define_private_method(cOCI8NamedType, "get_attribute", oci8_named_type_get_attribute, 4);
|
@@ -741,12 +820,12 @@ void Init_oci_object(VALUE cOCI8)
|
|
741
820
|
rb_define_method(cOCI8NamedType, "null=", oci8_named_type_set_null, 1);
|
742
821
|
|
743
822
|
/* OCI8::NamedCollection */
|
744
|
-
cOCI8NamedCollection = oci8_define_class_under(cOCI8, "NamedCollection", &
|
823
|
+
cOCI8NamedCollection = oci8_define_class_under(cOCI8, "NamedCollection", &oci8_named_collection_data_type, oci8_named_collection_alloc);
|
745
824
|
rb_define_method(cOCI8NamedCollection, "initialize", oci8_named_type_initialize, 0);
|
746
825
|
rb_define_method(cOCI8NamedCollection, "tdo", oci8_named_type_tdo, 0);
|
747
826
|
rb_define_private_method(cOCI8NamedCollection, "get_coll_element", oci8_named_coll_get_coll_element, 2);
|
748
827
|
rb_define_private_method(cOCI8NamedCollection, "set_coll_element", oci8_named_coll_set_coll_element, 3);
|
749
828
|
|
750
829
|
/* OCI8::BindType::NamedType */
|
751
|
-
cOCI8BindNamedType = oci8_define_bind_class("NamedType", &
|
830
|
+
cOCI8BindNamedType = oci8_define_bind_class("NamedType", &bind_named_type_data_type, bind_named_type_alloc);
|
752
831
|
}
|