ruby-oci8 2.1.4 → 2.1.5
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/.yardopts +1 -0
- data/ChangeLog +67 -0
- data/NEWS +21 -0
- data/VERSION +1 -1
- data/docs/platform-specific-issues.md +4 -24
- data/ext/oci8/extconf.rb +2 -1
- data/ext/oci8/lob.c +39 -26
- data/ext/oci8/object.c +25 -1
- data/ext/oci8/oci8.c +12 -42
- data/ext/oci8/oci8.h +1 -3
- data/ext/oci8/oci8lib.c +8 -0
- data/ext/oci8/ocihandle.c +167 -188
- data/ext/oci8/oraconf.rb +3 -2
- data/lib/oci8.rb.in +1 -1
- data/lib/oci8/metadata.rb +59 -67
- data/lib/oci8/object.rb +0 -1
- data/lib/oci8/oci8.rb +35 -35
- data/lib/oci8/oracle_version.rb +7 -14
- data/ruby-oci8.gemspec +31 -26
- data/test/test_bind_time.rb +2 -2
- data/test/test_connection_pool.rb +2 -2
- data/test/test_metadata.rb +0 -2
- data/test/test_object.rb +0 -1
- data/test/test_oci8.rb +10 -2
- metadata +4 -4
data/ext/oci8/oci8.c
CHANGED
@@ -38,6 +38,8 @@ extern rb_pid_t rb_w32_getpid(void);
|
|
38
38
|
static VALUE cOCI8;
|
39
39
|
static VALUE cSession;
|
40
40
|
static VALUE cServer;
|
41
|
+
static VALUE cEnvironment;
|
42
|
+
static VALUE cProcess;
|
41
43
|
static ID id_at_session_handle;
|
42
44
|
static ID id_at_server_handle;
|
43
45
|
|
@@ -48,7 +50,7 @@ static VALUE dummy_env_method_missing(int argc, VALUE *argv, VALUE self)
|
|
48
50
|
|
49
51
|
if (self == obj) {
|
50
52
|
oci8_base_t *base;
|
51
|
-
obj = rb_obj_alloc(
|
53
|
+
obj = rb_obj_alloc(cEnvironment);
|
52
54
|
base = DATA_PTR(obj);
|
53
55
|
base->type = OCI_HTYPE_ENV;
|
54
56
|
base->hp.ptr = oci8_envhp;
|
@@ -61,21 +63,16 @@ static VALUE dummy_env_method_missing(int argc, VALUE *argv, VALUE self)
|
|
61
63
|
return rb_apply(obj, SYM2ID(method_id), args);
|
62
64
|
}
|
63
65
|
|
64
|
-
|
65
|
-
oci8_base_t base;
|
66
|
-
oci8_svcctx_t *svcctx;
|
67
|
-
} oci8_svcctx_associate_t;
|
68
|
-
|
69
|
-
static void oci8_svcctx_associate_free(oci8_base_t *base)
|
66
|
+
static void oci8_dont_free_handle_free(oci8_base_t *base)
|
70
67
|
{
|
71
68
|
base->type = 0;
|
72
69
|
base->hp.ptr = NULL;
|
73
70
|
}
|
74
71
|
|
75
|
-
static oci8_base_vtable_t
|
72
|
+
static oci8_base_vtable_t oci8_dont_free_handle_vtable = {
|
76
73
|
NULL,
|
77
|
-
|
78
|
-
sizeof(
|
74
|
+
oci8_dont_free_handle_free,
|
75
|
+
sizeof(oci8_base_t),
|
79
76
|
};
|
80
77
|
|
81
78
|
static void copy_session_handle(oci8_svcctx_t *svcctx)
|
@@ -163,8 +160,6 @@ static oci8_base_vtable_t oci8_svcctx_vtable = {
|
|
163
160
|
};
|
164
161
|
|
165
162
|
static VALUE oracle_client_vernum; /* Oracle client version number */
|
166
|
-
static ID id_at_prefetch_rows;
|
167
|
-
static ID id_set_prefetch_rows;
|
168
163
|
|
169
164
|
static VALUE oci8_s_oracle_client_vernum(VALUE klass)
|
170
165
|
{
|
@@ -776,23 +771,6 @@ static VALUE oci8_break(VALUE self)
|
|
776
771
|
return Qtrue;
|
777
772
|
}
|
778
773
|
|
779
|
-
/*
|
780
|
-
* call-seq:
|
781
|
-
* prefetch_rows = number
|
782
|
-
*
|
783
|
-
* Sets the prefetch rows size. The default value is one.
|
784
|
-
* When a select statement is executed, the OCI library allocate
|
785
|
-
* prefetch buffer to reduce the number of network round trips by
|
786
|
-
* retrieving specified number of rows in one round trip.
|
787
|
-
*
|
788
|
-
* Note: Active record adaptors set 100 by default.
|
789
|
-
*/
|
790
|
-
static VALUE oci8_set_prefetch_rows(VALUE self, VALUE val)
|
791
|
-
{
|
792
|
-
rb_ivar_set(self, id_at_prefetch_rows, val);
|
793
|
-
return val;
|
794
|
-
}
|
795
|
-
|
796
774
|
/*
|
797
775
|
* call-seq:
|
798
776
|
* oracle_server_vernum -> an integer
|
@@ -1124,8 +1102,10 @@ void Init_oci8(VALUE *out)
|
|
1124
1102
|
cOCI8 = rb_define_class("OCI8", oci8_cOCIHandle);
|
1125
1103
|
#endif
|
1126
1104
|
cOCI8 = oci8_define_class("OCI8", &oci8_svcctx_vtable);
|
1127
|
-
cSession = oci8_define_class_under(cOCI8, "Session", &
|
1128
|
-
cServer = oci8_define_class_under(cOCI8, "Server", &
|
1105
|
+
cSession = oci8_define_class_under(cOCI8, "Session", &oci8_dont_free_handle_vtable);
|
1106
|
+
cServer = oci8_define_class_under(cOCI8, "Server", &oci8_dont_free_handle_vtable);
|
1107
|
+
cEnvironment = oci8_define_class_under(cOCI8, "Environment", &oci8_dont_free_handle_vtable);
|
1108
|
+
cProcess = oci8_define_class_under(cOCI8, "Process", &oci8_dont_free_handle_vtable);
|
1129
1109
|
id_at_session_handle = rb_intern("@session_handle");
|
1130
1110
|
id_at_server_handle = rb_intern("@server_handle");
|
1131
1111
|
|
@@ -1135,7 +1115,7 @@ void Init_oci8(VALUE *out)
|
|
1135
1115
|
rb_cv_set(cOCI8, "@@environment_handle", obj);
|
1136
1116
|
|
1137
1117
|
/* setup the process handle */
|
1138
|
-
obj = rb_obj_alloc(
|
1118
|
+
obj = rb_obj_alloc(cProcess);
|
1139
1119
|
base = DATA_PTR(obj);
|
1140
1120
|
base->type = OCI_HTYPE_PROC;
|
1141
1121
|
base->self = Qnil;
|
@@ -1148,9 +1128,6 @@ void Init_oci8(VALUE *out)
|
|
1148
1128
|
oracle_client_vernum = INT2FIX(ORAVERNUM(major, minor, update, patch, port_update));
|
1149
1129
|
}
|
1150
1130
|
|
1151
|
-
id_at_prefetch_rows = rb_intern("@prefetch_rows");
|
1152
|
-
id_set_prefetch_rows = rb_intern("prefetch_rows=");
|
1153
|
-
|
1154
1131
|
rb_define_const(cOCI8, "VERSION", rb_obj_freeze(rb_usascii_str_new_cstr(OCI8LIB_VERSION)));
|
1155
1132
|
rb_define_singleton_method_nodoc(cOCI8, "oracle_client_vernum", oci8_s_oracle_client_vernum, 0);
|
1156
1133
|
rb_define_singleton_method(cOCI8, "__get_prop", oci8_s_get_prop, 1);
|
@@ -1171,7 +1148,6 @@ void Init_oci8(VALUE *out)
|
|
1171
1148
|
rb_define_method(cOCI8, "long_read_len", oci8_long_read_len, 0);
|
1172
1149
|
rb_define_method(cOCI8, "long_read_len=", oci8_set_long_read_len, 1);
|
1173
1150
|
rb_define_method(cOCI8, "break", oci8_break, 0);
|
1174
|
-
rb_define_method(cOCI8, "prefetch_rows=", oci8_set_prefetch_rows, 1);
|
1175
1151
|
rb_define_private_method(cOCI8, "oracle_server_vernum", oci8_oracle_server_vernum, 0);
|
1176
1152
|
rb_define_method(cOCI8, "ping", oci8_ping, 0);
|
1177
1153
|
rb_define_method(cOCI8, "client_identifier=", oci8_set_client_identifier, 1);
|
@@ -1186,12 +1162,6 @@ oci8_svcctx_t *oci8_get_svcctx(VALUE obj)
|
|
1186
1162
|
return (oci8_svcctx_t *)oci8_get_handle(obj, cOCI8);
|
1187
1163
|
}
|
1188
1164
|
|
1189
|
-
OCISvcCtx *oci8_get_oci_svcctx(VALUE obj)
|
1190
|
-
{
|
1191
|
-
oci8_svcctx_t *svcctx = oci8_get_svcctx(obj);
|
1192
|
-
return svcctx->base.hp.svc;
|
1193
|
-
}
|
1194
|
-
|
1195
1165
|
OCISession *oci8_get_oci_session(VALUE obj)
|
1196
1166
|
{
|
1197
1167
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(obj);
|
data/ext/oci8/oci8.h
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* oci8.h - part of ruby-oci8
|
4
4
|
*
|
5
|
-
* Copyright (C) 2002-
|
5
|
+
* Copyright (C) 2002-2013 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*/
|
7
7
|
#ifndef _RUBY_OCI_H_
|
8
8
|
#define _RUBY_OCI_H_ 1
|
@@ -494,10 +494,8 @@ void Init_oci8_handle(void);
|
|
494
494
|
void Init_oci8(VALUE *out);
|
495
495
|
void oci8_do_parse_connect_string(VALUE conn_str, VALUE *user, VALUE *pass, VALUE *dbname, VALUE *mode);
|
496
496
|
oci8_svcctx_t *oci8_get_svcctx(VALUE obj);
|
497
|
-
OCISvcCtx *oci8_get_oci_svcctx(VALUE obj);
|
498
497
|
OCISession *oci8_get_oci_session(VALUE obj);
|
499
498
|
void oci8_check_pid_consistency(oci8_svcctx_t *svcctx);
|
500
|
-
#define TO_SVCCTX oci8_get_oci_svcctx
|
501
499
|
#define TO_SESSION oci8_get_oci_session
|
502
500
|
|
503
501
|
/* connection_pool.c */
|
data/ext/oci8/oci8lib.c
CHANGED
@@ -22,6 +22,14 @@ ID oci8_id_div_op;
|
|
22
22
|
int oci8_in_finalizer = 0;
|
23
23
|
VALUE oci8_cOCIHandle;
|
24
24
|
|
25
|
+
#if defined __sun && defined __i386 && defined __GNUC__
|
26
|
+
/* When a main function is invisible from Oracle instant
|
27
|
+
* client 11.2.0.3 for Solaris x86 (32-bit), OCIEnvCreate()
|
28
|
+
* fails by unknown reasons. We export it from ruby-oci8 instead
|
29
|
+
* of ruby itself.
|
30
|
+
*/
|
31
|
+
int main() { return 0; }
|
32
|
+
#endif
|
25
33
|
|
26
34
|
static VALUE mOCI8BindType;
|
27
35
|
static VALUE cOCI8BindTypeBase;
|
data/ext/oci8/ocihandle.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* ocihandle.c
|
4
4
|
*
|
5
|
-
* Copyright (C) 2009-
|
5
|
+
* Copyright (C) 2009-2013 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*
|
7
7
|
* implement OCIHandle
|
8
8
|
*
|
@@ -103,243 +103,272 @@ static VALUE oci8_s_allocate(VALUE klass)
|
|
103
103
|
return obj;
|
104
104
|
}
|
105
105
|
|
106
|
+
enum datatype {
|
107
|
+
DATATYPE_UB1,
|
108
|
+
DATATYPE_UB2,
|
109
|
+
DATATYPE_UB4,
|
110
|
+
DATATYPE_UB8,
|
111
|
+
DATATYPE_SB1,
|
112
|
+
DATATYPE_SB2,
|
113
|
+
DATATYPE_SB4,
|
114
|
+
DATATYPE_SB8,
|
115
|
+
DATATYPE_BOOLEAN,
|
116
|
+
DATATYPE_STRING,
|
117
|
+
DATATYPE_BINARY,
|
118
|
+
DATATYPE_INTEGER,
|
119
|
+
DATATYPE_ORADATE,
|
120
|
+
};
|
121
|
+
|
122
|
+
static VALUE attr_get_common(int argc, VALUE *argv, VALUE self, enum datatype datatype)
|
123
|
+
{
|
124
|
+
oci8_base_t *base = DATA_PTR(self);
|
125
|
+
VALUE attr_type;
|
126
|
+
VALUE strict;
|
127
|
+
union {
|
128
|
+
ub1 ub1val;
|
129
|
+
ub2 ub2val;
|
130
|
+
ub4 ub4val;
|
131
|
+
ub8 ub8val;
|
132
|
+
sb1 sb1val;
|
133
|
+
sb2 sb2val;
|
134
|
+
sb4 sb4val;
|
135
|
+
sb8 sb8val;
|
136
|
+
boolean booleanval;
|
137
|
+
char *charptr;
|
138
|
+
ub1 *ub1ptr;
|
139
|
+
} v;
|
140
|
+
ub4 size = 0;
|
141
|
+
sword rv;
|
142
|
+
|
143
|
+
v.ub8val = MAGIC_NUMBER;
|
144
|
+
rb_scan_args(argc, argv, "11", &attr_type, &strict);
|
145
|
+
if (argc == 1) {
|
146
|
+
strict = Qtrue;
|
147
|
+
}
|
148
|
+
Check_Type(attr_type, T_FIXNUM);
|
149
|
+
rv = OCIAttrGet(base->hp.ptr, base->type, &v, &size, FIX2INT(attr_type), oci8_errhp);
|
150
|
+
if (!RTEST(strict)) {
|
151
|
+
if (rv == OCI_ERROR && oci8_get_error_code(oci8_errhp) == 24328) {
|
152
|
+
/* ignore ORA-24328: illegal attribute value */
|
153
|
+
return Qnil;
|
154
|
+
}
|
155
|
+
}
|
156
|
+
chker2(rv, base);
|
157
|
+
switch (datatype) {
|
158
|
+
OCINumber onum;
|
159
|
+
static VALUE cOraDate = Qnil;
|
160
|
+
case DATATYPE_UB1:
|
161
|
+
return INT2FIX(v.ub1val);
|
162
|
+
case DATATYPE_UB2:
|
163
|
+
return INT2FIX(v.ub2val);
|
164
|
+
case DATATYPE_UB4:
|
165
|
+
return UINT2NUM(v.ub4val);
|
166
|
+
case DATATYPE_UB8:
|
167
|
+
return ULL2NUM(v.ub8val);
|
168
|
+
case DATATYPE_SB1:
|
169
|
+
return INT2FIX(v.sb1val);
|
170
|
+
case DATATYPE_SB2:
|
171
|
+
return INT2FIX(v.sb2val);
|
172
|
+
case DATATYPE_SB4:
|
173
|
+
return INT2NUM(v.sb4val);
|
174
|
+
case DATATYPE_SB8:
|
175
|
+
return LL2NUM(v.sb8val);
|
176
|
+
case DATATYPE_BOOLEAN:
|
177
|
+
return v.booleanval ? Qtrue : Qfalse;
|
178
|
+
case DATATYPE_STRING:
|
179
|
+
if (size == 0 && !RTEST(strict)) {
|
180
|
+
return Qnil;
|
181
|
+
}
|
182
|
+
return rb_external_str_new_with_enc(v.charptr, size, oci8_encoding);
|
183
|
+
case DATATYPE_BINARY:
|
184
|
+
return rb_tainted_str_new(v.charptr, size);
|
185
|
+
case DATATYPE_INTEGER:
|
186
|
+
if (size > sizeof(onum.OCINumberPart) - 1) {
|
187
|
+
rb_raise(rb_eRuntimeError, "Too long size %u", size);
|
188
|
+
}
|
189
|
+
memset(&onum, 0, sizeof(onum));
|
190
|
+
onum.OCINumberPart[0] = size;
|
191
|
+
memcpy(&onum.OCINumberPart[1], v.ub1ptr, size);
|
192
|
+
return oci8_make_integer(&onum, oci8_errhp);
|
193
|
+
case DATATYPE_ORADATE:
|
194
|
+
if (NIL_P(cOraDate))
|
195
|
+
cOraDate = rb_eval_string("OraDate");
|
196
|
+
return rb_funcall(cOraDate, oci8_id_new, 6,
|
197
|
+
INT2FIX((v.ub1ptr[0] - 100) * 100 + (v.ub1ptr[1] - 100)),
|
198
|
+
INT2FIX(v.ub1ptr[2]),
|
199
|
+
INT2FIX(v.ub1ptr[3]),
|
200
|
+
INT2FIX(v.ub1ptr[4] - 1),
|
201
|
+
INT2FIX(v.ub1ptr[5] - 1),
|
202
|
+
INT2FIX(v.ub1ptr[6] - 1));
|
203
|
+
}
|
204
|
+
return Qnil;
|
205
|
+
}
|
206
|
+
|
106
207
|
/*
|
107
208
|
* call-seq:
|
108
|
-
* attr_get_ub1(attr_type)
|
209
|
+
* attr_get_ub1(attr_type, strict = true)
|
109
210
|
*
|
110
211
|
* Gets the value of an attribute as `ub1' datatype.
|
111
212
|
*
|
112
213
|
* @param [Fixnum] attr_type
|
214
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
113
215
|
* @return [Fixnum]
|
114
216
|
*
|
115
217
|
* @since 2.0.4
|
116
218
|
* @private
|
117
219
|
*/
|
118
|
-
static VALUE attr_get_ub1(VALUE
|
220
|
+
static VALUE attr_get_ub1(int argc, VALUE *argv, VALUE self)
|
119
221
|
{
|
120
|
-
|
121
|
-
union {
|
122
|
-
ub1 value;
|
123
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
124
|
-
} v;
|
125
|
-
|
126
|
-
v.dummy = MAGIC_NUMBER;
|
127
|
-
Check_Type(attr_type, T_FIXNUM);
|
128
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
129
|
-
return INT2FIX(v.value);
|
222
|
+
return attr_get_common(argc, argv, self, DATATYPE_UB1);
|
130
223
|
}
|
131
224
|
|
132
225
|
/*
|
133
226
|
* call-seq:
|
134
|
-
* attr_get_ub2(attr_type)
|
227
|
+
* attr_get_ub2(attr_type, strict = true)
|
135
228
|
*
|
136
229
|
* Gets the value of an attribute as `ub2' datatype.
|
137
230
|
*
|
138
231
|
* @param [Fixnum] attr_type
|
232
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
139
233
|
* @return [Fixnum]
|
140
234
|
*
|
141
235
|
* @since 2.0.4
|
142
236
|
* @private
|
143
237
|
*/
|
144
|
-
static VALUE attr_get_ub2(VALUE
|
238
|
+
static VALUE attr_get_ub2(int argc, VALUE *argv, VALUE self)
|
145
239
|
{
|
146
|
-
|
147
|
-
union {
|
148
|
-
ub2 value;
|
149
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
150
|
-
} v;
|
151
|
-
|
152
|
-
v.dummy = MAGIC_NUMBER;
|
153
|
-
Check_Type(attr_type, T_FIXNUM);
|
154
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
155
|
-
return INT2FIX(v.value);
|
240
|
+
return attr_get_common(argc, argv, self, DATATYPE_UB2);
|
156
241
|
}
|
157
242
|
|
158
243
|
/*
|
159
244
|
* call-seq:
|
160
|
-
* attr_get_ub4(attr_type)
|
245
|
+
* attr_get_ub4(attr_type, strict = true)
|
161
246
|
*
|
162
247
|
* Gets the value of an attribute as `ub4' datatype.
|
163
248
|
*
|
164
249
|
* @param [Fixnum] attr_type
|
250
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
165
251
|
* @return [Integer]
|
166
252
|
*
|
167
253
|
* @since 2.0.4
|
168
254
|
* @private
|
169
255
|
*/
|
170
|
-
static VALUE attr_get_ub4(VALUE
|
256
|
+
static VALUE attr_get_ub4(int argc, VALUE *argv, VALUE self)
|
171
257
|
{
|
172
|
-
|
173
|
-
union {
|
174
|
-
ub4 value;
|
175
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
176
|
-
} v;
|
177
|
-
|
178
|
-
v.dummy = MAGIC_NUMBER;
|
179
|
-
Check_Type(attr_type, T_FIXNUM);
|
180
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
181
|
-
return UINT2NUM(v.value);
|
258
|
+
return attr_get_common(argc, argv, self, DATATYPE_UB4);
|
182
259
|
}
|
183
260
|
|
184
261
|
/*
|
185
262
|
* call-seq:
|
186
|
-
* attr_get_ub8(attr_type)
|
263
|
+
* attr_get_ub8(attr_type, strict = true)
|
187
264
|
*
|
188
265
|
* Gets the value of an attribute as `ub8' datatype.
|
189
266
|
*
|
190
267
|
* @param [Fixnum] attr_type
|
268
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
191
269
|
* @return [Integer]
|
192
270
|
*
|
193
271
|
* @since 2.0.4
|
194
272
|
* @private
|
195
273
|
*/
|
196
|
-
static VALUE attr_get_ub8(VALUE
|
274
|
+
static VALUE attr_get_ub8(int argc, VALUE *argv, VALUE self)
|
197
275
|
{
|
198
|
-
|
199
|
-
union {
|
200
|
-
ub8 value;
|
201
|
-
ub8 dummy;
|
202
|
-
} v;
|
203
|
-
|
204
|
-
v.dummy = MAGIC_NUMBER;
|
205
|
-
Check_Type(attr_type, T_FIXNUM);
|
206
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
207
|
-
return ULL2NUM(v.value);
|
276
|
+
return attr_get_common(argc, argv, self, DATATYPE_UB8);
|
208
277
|
}
|
209
278
|
|
210
279
|
/*
|
211
280
|
* call-seq:
|
212
|
-
* attr_get_sb1(attr_type)
|
281
|
+
* attr_get_sb1(attr_type, strict = true)
|
213
282
|
*
|
214
283
|
* Gets the value of an attribute as `sb1' datatype.
|
215
284
|
*
|
216
285
|
* @param [Fixnum] attr_type
|
286
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
217
287
|
* @return [Fixnum]
|
218
288
|
*
|
219
289
|
* @since 2.0.4
|
220
290
|
* @private
|
221
291
|
*/
|
222
|
-
static VALUE attr_get_sb1(VALUE
|
292
|
+
static VALUE attr_get_sb1(int argc, VALUE *argv, VALUE self)
|
223
293
|
{
|
224
|
-
|
225
|
-
union {
|
226
|
-
sb1 value;
|
227
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
228
|
-
} v;
|
229
|
-
|
230
|
-
v.dummy = MAGIC_NUMBER;
|
231
|
-
Check_Type(attr_type, T_FIXNUM);
|
232
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
233
|
-
return INT2FIX(v.value);
|
294
|
+
return attr_get_common(argc, argv, self, DATATYPE_SB1);
|
234
295
|
}
|
235
296
|
|
236
297
|
/*
|
237
298
|
* call-seq:
|
238
|
-
* attr_get_sb2(attr_type)
|
299
|
+
* attr_get_sb2(attr_type, strict = true)
|
239
300
|
*
|
240
301
|
* Gets the value of an attribute as `sb2' datatype.
|
241
302
|
*
|
242
303
|
* @param [Fixnum] attr_type
|
304
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
243
305
|
* @return [Fixnum]
|
244
306
|
*
|
245
307
|
* @since 2.0.4
|
246
308
|
* @private
|
247
309
|
*/
|
248
|
-
static VALUE attr_get_sb2(VALUE
|
310
|
+
static VALUE attr_get_sb2(int argc, VALUE *argv, VALUE self)
|
249
311
|
{
|
250
|
-
|
251
|
-
union {
|
252
|
-
sb2 value;
|
253
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
254
|
-
} v;
|
255
|
-
|
256
|
-
v.dummy = MAGIC_NUMBER;
|
257
|
-
Check_Type(attr_type, T_FIXNUM);
|
258
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
259
|
-
return INT2FIX(v.value);
|
312
|
+
return attr_get_common(argc, argv, self, DATATYPE_SB2);
|
260
313
|
}
|
261
314
|
|
262
315
|
/*
|
263
316
|
* call-seq:
|
264
|
-
* attr_get_sb4(attr_type)
|
317
|
+
* attr_get_sb4(attr_type, strict = true)
|
265
318
|
*
|
266
319
|
* Gets the value of an attribute as `sb4' datatype.
|
267
320
|
*
|
268
321
|
* @param [Fixnum] attr_type
|
322
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
269
323
|
* @return [Integer]
|
270
324
|
*
|
271
325
|
* @since 2.0.4
|
272
326
|
* @private
|
273
327
|
*/
|
274
|
-
static VALUE attr_get_sb4(VALUE
|
328
|
+
static VALUE attr_get_sb4(int argc, VALUE *argv, VALUE self)
|
275
329
|
{
|
276
|
-
|
277
|
-
union {
|
278
|
-
sb4 value;
|
279
|
-
ub8 dummy;
|
280
|
-
} v;
|
281
|
-
|
282
|
-
v.dummy = MAGIC_NUMBER;
|
283
|
-
Check_Type(attr_type, T_FIXNUM);
|
284
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
285
|
-
return INT2NUM(v.value);
|
330
|
+
return attr_get_common(argc, argv, self, DATATYPE_SB4);
|
286
331
|
}
|
287
332
|
|
288
333
|
/*
|
289
334
|
* call-seq:
|
290
|
-
* attr_get_sb8(attr_type)
|
335
|
+
* attr_get_sb8(attr_type, strict = true)
|
291
336
|
*
|
292
337
|
* Gets the value of an attribute as `sb8' datatype.
|
293
338
|
*
|
294
339
|
* @param [Fixnum] attr_type
|
340
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
295
341
|
* @return [Integer]
|
296
342
|
*
|
297
343
|
* @since 2.0.4
|
298
344
|
* @private
|
299
345
|
*/
|
300
|
-
static VALUE attr_get_sb8(VALUE
|
346
|
+
static VALUE attr_get_sb8(int argc, VALUE *argv, VALUE self)
|
301
347
|
{
|
302
|
-
|
303
|
-
union {
|
304
|
-
sb8 value;
|
305
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
306
|
-
} v;
|
307
|
-
|
308
|
-
v.dummy = MAGIC_NUMBER;
|
309
|
-
Check_Type(attr_type, T_FIXNUM);
|
310
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
311
|
-
return LL2NUM(v.value);
|
348
|
+
return attr_get_common(argc, argv, self, DATATYPE_SB8);
|
312
349
|
}
|
313
350
|
|
314
351
|
/*
|
315
352
|
* call-seq:
|
316
|
-
* attr_get_boolean(attr_type)
|
353
|
+
* attr_get_boolean(attr_type, strict = true)
|
317
354
|
*
|
318
355
|
* Gets the value of an attribute as `boolean' datatype.
|
319
356
|
*
|
320
357
|
* @param [Fixnum] attr_type
|
358
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
321
359
|
* @return [true of false]
|
322
360
|
*
|
323
361
|
* @since 2.0.4
|
324
362
|
* @private
|
325
363
|
*/
|
326
|
-
static VALUE attr_get_boolean(VALUE
|
364
|
+
static VALUE attr_get_boolean(int argc, VALUE *argv, VALUE self)
|
327
365
|
{
|
328
|
-
|
329
|
-
union {
|
330
|
-
boolean value;
|
331
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
332
|
-
} v;
|
333
|
-
|
334
|
-
v.dummy = MAGIC_NUMBER;
|
335
|
-
Check_Type(attr_type, T_FIXNUM);
|
336
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, NULL, FIX2INT(attr_type), oci8_errhp), base);
|
337
|
-
return v.value ? Qtrue : Qfalse;
|
366
|
+
return attr_get_common(argc, argv, self, DATATYPE_BOOLEAN);
|
338
367
|
}
|
339
368
|
|
340
369
|
/*
|
341
370
|
* call-seq:
|
342
|
-
* attr_get_string(attr_type)
|
371
|
+
* attr_get_string(attr_type, strict = true)
|
343
372
|
*
|
344
373
|
* Gets the value of an attribute as `oratext *' datatype.
|
345
374
|
* The return value is converted to Encoding.default_internal or
|
@@ -349,29 +378,20 @@ static VALUE attr_get_boolean(VALUE self, VALUE attr_type)
|
|
349
378
|
* pointer type, it causes a segmentation fault.
|
350
379
|
*
|
351
380
|
* @param [Fixnum] attr_type
|
381
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
352
382
|
* @return [String]
|
353
383
|
*
|
354
384
|
* @since 2.0.4
|
355
385
|
* @private
|
356
386
|
*/
|
357
|
-
static VALUE attr_get_string(VALUE
|
387
|
+
static VALUE attr_get_string(int argc, VALUE *argv, VALUE self)
|
358
388
|
{
|
359
|
-
|
360
|
-
union {
|
361
|
-
char *value;
|
362
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
363
|
-
} v;
|
364
|
-
ub4 size = 0;
|
365
|
-
|
366
|
-
v.dummy = MAGIC_NUMBER;
|
367
|
-
Check_Type(attr_type, T_FIXNUM);
|
368
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, &size, FIX2INT(attr_type), oci8_errhp), base);
|
369
|
-
return rb_external_str_new_with_enc(v.value, size, oci8_encoding);
|
389
|
+
return attr_get_common(argc, argv, self, DATATYPE_STRING);
|
370
390
|
}
|
371
391
|
|
372
392
|
/*
|
373
393
|
* call-seq:
|
374
|
-
* attr_get_binary(attr_type)
|
394
|
+
* attr_get_binary(attr_type, strict = true)
|
375
395
|
*
|
376
396
|
* Gets the value of an attribute as `ub1 *' datatype.
|
377
397
|
* The return value is tagged with ASCII-8BIT when the ruby version is 1.9.
|
@@ -380,29 +400,20 @@ static VALUE attr_get_string(VALUE self, VALUE attr_type)
|
|
380
400
|
* pointer type, it causes a segmentation fault.
|
381
401
|
*
|
382
402
|
* @param [Fixnum] attr_type
|
403
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
383
404
|
* @return [String]
|
384
405
|
*
|
385
406
|
* @since 2.0.4
|
386
407
|
* @private
|
387
408
|
*/
|
388
|
-
static VALUE attr_get_binary(VALUE
|
409
|
+
static VALUE attr_get_binary(int argc, VALUE *argv, VALUE self)
|
389
410
|
{
|
390
|
-
|
391
|
-
union {
|
392
|
-
char *value;
|
393
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
394
|
-
} v;
|
395
|
-
ub4 size = 0;
|
396
|
-
|
397
|
-
v.dummy = 0;
|
398
|
-
Check_Type(attr_type, T_FIXNUM);
|
399
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, &size, FIX2INT(attr_type), oci8_errhp), base);
|
400
|
-
return rb_tainted_str_new(v.value, size);
|
411
|
+
return attr_get_common(argc, argv, self, DATATYPE_BINARY);
|
401
412
|
}
|
402
413
|
|
403
414
|
/*
|
404
415
|
* call-seq:
|
405
|
-
* attr_get_integer(attr_type
|
416
|
+
* attr_get_integer(attr_type, strict = true)
|
406
417
|
*
|
407
418
|
* Gets the value of an attribute as `ub1 *' datatype.
|
408
419
|
* The return value is converted to Integer from internal Oracle NUMBER format.
|
@@ -411,34 +422,20 @@ static VALUE attr_get_binary(VALUE self, VALUE attr_type)
|
|
411
422
|
* pointer type, it causes a segmentation fault.
|
412
423
|
*
|
413
424
|
* @param [Fixnum] attr_type
|
425
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
414
426
|
* @return [Fixnum]
|
415
427
|
*
|
416
428
|
* @since 2.0.4
|
417
429
|
* @private
|
418
430
|
*/
|
419
|
-
static VALUE attr_get_integer(VALUE
|
431
|
+
static VALUE attr_get_integer(int argc, VALUE *argv, VALUE self)
|
420
432
|
{
|
421
|
-
|
422
|
-
OCINumber onum;
|
423
|
-
union {
|
424
|
-
void *value;
|
425
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
426
|
-
} v;
|
427
|
-
ub4 size = 0;
|
428
|
-
|
429
|
-
v.dummy = 0;
|
430
|
-
Check_Type(attr_type, T_FIXNUM);
|
431
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, &size, FIX2INT(attr_type), oci8_errhp), base);
|
432
|
-
|
433
|
-
memset(&onum, 0, sizeof(onum));
|
434
|
-
onum.OCINumberPart[0] = size;
|
435
|
-
memcpy(&onum.OCINumberPart[1], v.value, size);
|
436
|
-
return oci8_make_integer(&onum, oci8_errhp);
|
433
|
+
return attr_get_common(argc, argv, self, DATATYPE_INTEGER);
|
437
434
|
}
|
438
435
|
|
439
436
|
/*
|
440
437
|
* call-seq:
|
441
|
-
* attr_get_oradate(attr_type
|
438
|
+
* attr_get_oradate(attr_type, strict = true)
|
442
439
|
*
|
443
440
|
* Gets the value of an attribute as `ub1 *' datatype.
|
444
441
|
* The return value is converted to OraDate.
|
@@ -447,33 +444,15 @@ static VALUE attr_get_integer(VALUE self, VALUE attr_type)
|
|
447
444
|
* pointer type, it causes a segmentation fault.
|
448
445
|
*
|
449
446
|
* @param [Fixnum] attr_type
|
447
|
+
* @param [Boolean] strict If false, "ORA-24328: illegal attribute value" is ignored.
|
450
448
|
* @return [OraDate]
|
451
449
|
*
|
452
450
|
* @since 2.0.4
|
453
451
|
* @private
|
454
452
|
*/
|
455
|
-
static VALUE attr_get_oradate(VALUE
|
453
|
+
static VALUE attr_get_oradate(int argc, VALUE *argv, VALUE self)
|
456
454
|
{
|
457
|
-
|
458
|
-
union {
|
459
|
-
ub1 *value;
|
460
|
-
ub8 dummy; /* padding for incorrect attrtype to protect the stack */
|
461
|
-
} v;
|
462
|
-
ub4 size = 0;
|
463
|
-
static VALUE cOraDate = Qnil;
|
464
|
-
|
465
|
-
v.dummy = 0;
|
466
|
-
Check_Type(attr_type, T_FIXNUM);
|
467
|
-
chker2(OCIAttrGet(base->hp.ptr, base->type, &v.value, &size, FIX2INT(attr_type), oci8_errhp), base);
|
468
|
-
if (NIL_P(cOraDate))
|
469
|
-
cOraDate = rb_eval_string("OraDate");
|
470
|
-
return rb_funcall(cOraDate, oci8_id_new, 6,
|
471
|
-
INT2FIX((v.value[0] - 100) * 100 + (v.value[1] - 100)),
|
472
|
-
INT2FIX(v.value[2]),
|
473
|
-
INT2FIX(v.value[3]),
|
474
|
-
INT2FIX(v.value[4] - 1),
|
475
|
-
INT2FIX(v.value[5] - 1),
|
476
|
-
INT2FIX(v.value[6] - 1));
|
455
|
+
return attr_get_common(argc, argv, self, DATATYPE_ORADATE);
|
477
456
|
}
|
478
457
|
|
479
458
|
/*
|
@@ -836,19 +815,19 @@ void Init_oci8_handle(void)
|
|
836
815
|
rb_ivar_set(oci8_cOCIHandle, oci8_id_oci8_vtable, obj);
|
837
816
|
|
838
817
|
/* methods to get attributes */
|
839
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_ub1", attr_get_ub1, 1);
|
840
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_ub2", attr_get_ub2, 1);
|
841
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_ub4", attr_get_ub4, 1);
|
842
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_ub8", attr_get_ub8, 1);
|
843
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_sb1", attr_get_sb1, 1);
|
844
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_sb2", attr_get_sb2, 1);
|
845
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_sb4", attr_get_sb4, 1);
|
846
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_sb8", attr_get_sb8, 1);
|
847
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_boolean", attr_get_boolean, 1);
|
848
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_string", attr_get_string, 1);
|
849
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_binary", attr_get_binary, 1);
|
850
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_integer", attr_get_integer, 1);
|
851
|
-
rb_define_private_method(oci8_cOCIHandle, "attr_get_oradate", attr_get_oradate, 1);
|
818
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_ub1", attr_get_ub1, -1);
|
819
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_ub2", attr_get_ub2, -1);
|
820
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_ub4", attr_get_ub4, -1);
|
821
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_ub8", attr_get_ub8, -1);
|
822
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_sb1", attr_get_sb1, -1);
|
823
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_sb2", attr_get_sb2, -1);
|
824
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_sb4", attr_get_sb4, -1);
|
825
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_sb8", attr_get_sb8, -1);
|
826
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_boolean", attr_get_boolean, -1);
|
827
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_string", attr_get_string, -1);
|
828
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_binary", attr_get_binary, -1);
|
829
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_integer", attr_get_integer, -1);
|
830
|
+
rb_define_private_method(oci8_cOCIHandle, "attr_get_oradate", attr_get_oradate, -1);
|
852
831
|
|
853
832
|
/* methods to set attributes */
|
854
833
|
rb_define_private_method(oci8_cOCIHandle, "attr_set_ub1", attr_set_ub1, 2);
|