ruby-oci8 2.1.4 → 2.1.5
Sign up to get free protection for your applications and to get access to all the features.
- 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);
|