ruby-oci8 2.0.1 → 2.0.2
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 +89 -0
- data/Makefile +16 -14
- data/NEWS +36 -0
- data/VERSION +1 -1
- data/dist-files +3 -0
- data/ext/oci8/apiwrap.yml +107 -95
- data/ext/oci8/attr.c +14 -13
- data/ext/oci8/bind.c +4 -4
- data/ext/oci8/encoding.c +1 -1
- data/ext/oci8/env.c +72 -22
- data/ext/oci8/error.c +1 -1
- data/ext/oci8/extconf.rb +8 -2
- data/ext/oci8/lob.c +24 -5
- data/ext/oci8/metadata.c +3 -3
- data/ext/oci8/object.c +10 -5
- data/ext/oci8/oci8.c +87 -2
- data/ext/oci8/oci8.h +70 -16
- data/ext/oci8/oci8lib.c +37 -3
- data/ext/oci8/ocidatetime.c +1 -1
- data/ext/oci8/ocinumber.c +262 -148
- data/ext/oci8/oraconf.rb +63 -63
- data/ext/oci8/oradate.c +1 -1
- data/lib/dbd/OCI8.rb +17 -2
- data/lib/oci8.rb.in +1 -0
- data/lib/oci8/bindtype.rb +295 -0
- data/lib/oci8/oci8.rb +23 -270
- data/test/test_all.rb +12 -3
- data/test/test_appinfo.rb +29 -0
- data/test/test_dbi.rb +1 -1
- data/test/test_encoding.rb +100 -0
- data/test/test_oci8.rb +37 -0
- data/test/test_oranumber.rb +24 -0
- metadata +6 -3
data/ext/oci8/oci8.h
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
*/
|
3
|
+
* oci8.h - part of ruby-oci8
|
4
|
+
*
|
5
|
+
* Copyright (C) 2002-2009 KUBO Takehiro <kubo@jiubao.org>
|
6
|
+
*/
|
7
7
|
#ifndef _RUBY_OCI_H_
|
8
8
|
#define _RUBY_OCI_H_ 1
|
9
9
|
|
@@ -49,7 +49,46 @@ extern "C"
|
|
49
49
|
#include <ruby/encoding.h>
|
50
50
|
#endif
|
51
51
|
|
52
|
-
#
|
52
|
+
#ifndef OCI_TEMP_CLOB
|
53
|
+
#define OCI_TEMP_CLOB 1
|
54
|
+
#endif
|
55
|
+
#ifndef OCI_TEMP_BLOB
|
56
|
+
#define OCI_TEMP_BLOB 2
|
57
|
+
#endif
|
58
|
+
|
59
|
+
#ifndef ORAXB8_DEFINED
|
60
|
+
#if SIZEOF_LONG == 8
|
61
|
+
typedef unsigned long oraub8;
|
62
|
+
typedef signed long orasb8;
|
63
|
+
#elif SIZEOF_LONG_LONG == 8
|
64
|
+
typedef unsigned long long oraub8;
|
65
|
+
typedef signed long long orasb8;
|
66
|
+
#elif SIZEOF___INT64 == 8
|
67
|
+
typedef unsigned __int64 oraub8;
|
68
|
+
typedef signed __int64 orasb8;
|
69
|
+
#endif
|
70
|
+
#endif /* ORAXB8_DEFINED */
|
71
|
+
|
72
|
+
#ifndef HAVE_TYPE_ORATEXT
|
73
|
+
typedef unsigned char oratext;
|
74
|
+
#endif
|
75
|
+
#ifndef HAVE_TYPE_OCIDATETIME_
|
76
|
+
typedef struct OCIDateTime OCIDateTime;
|
77
|
+
#endif
|
78
|
+
#ifndef HAVE_TYPE_OCIINTERVAL_
|
79
|
+
typedef struct OCIInterval OCIInterval;
|
80
|
+
#endif
|
81
|
+
#ifndef HAVE_TYPE_OCICALLBACKLOBREAD2
|
82
|
+
typedef sb4 (*OCICallbackLobRead2)(dvoid *ctxp, CONST dvoid *bufp, oraub8 len,
|
83
|
+
ub1 piece, dvoid **changed_bufpp,
|
84
|
+
oraub8 *changed_lenp);
|
85
|
+
#endif
|
86
|
+
#ifndef HAVE_TYPE_OCICALLBACKLOBWRITE2
|
87
|
+
typedef sb4 (*OCICallbackLobWrite2)(dvoid *ctxp, dvoid *bufp, oraub8 *lenp,
|
88
|
+
ub1 *piece, dvoid **changed_bufpp,
|
89
|
+
oraub8 *changed_lenp);
|
90
|
+
#endif
|
91
|
+
#ifndef HAVE_TYPE_OCIADMIN_
|
53
92
|
typedef struct OCIAdmin OCIAdmin;
|
54
93
|
#endif
|
55
94
|
|
@@ -78,6 +117,9 @@ typedef struct OCIAdmin OCIAdmin;
|
|
78
117
|
#ifndef RFLOAT_VALUE
|
79
118
|
#define RFLOAT_VALUE(obj) RFLOAT(obj)->value
|
80
119
|
#endif
|
120
|
+
#ifndef STRINGIZE
|
121
|
+
#define STRINGIZE(name) #name
|
122
|
+
#endif
|
81
123
|
|
82
124
|
/* new functions in ruby 1.9.
|
83
125
|
* define compatible macros for ruby 1.8 or lower.
|
@@ -305,12 +347,24 @@ typedef struct {
|
|
305
347
|
#define UB4_TO_NUM UINT2NUM
|
306
348
|
#endif
|
307
349
|
|
308
|
-
/*
|
309
|
-
|
350
|
+
/* The folloiwng macros oci8_envhp and oci8_errhp are used
|
351
|
+
* as if they are defined as follows:
|
352
|
+
*
|
353
|
+
* extern OCIEnv *oci8_envhp;
|
354
|
+
* extern OCIError *oci8_errhp;
|
355
|
+
*/
|
356
|
+
#define oci8_envhp (LIKELY(oci8_global_envhp != NULL) ? oci8_global_envhp : oci8_make_envhp())
|
310
357
|
#ifdef RUBY_VM
|
311
|
-
/* oci8_errhp is a thread local object in ruby 1.9. */
|
312
358
|
#define oci8_errhp oci8_get_errhp()
|
359
|
+
#else
|
360
|
+
#define oci8_errhp (LIKELY(oci8_global_errhp != NULL) ? oci8_global_errhp : oci8_make_errhp())
|
361
|
+
#endif
|
313
362
|
|
363
|
+
/* env.c */
|
364
|
+
extern ub4 oci8_env_mode;
|
365
|
+
extern OCIEnv *oci8_global_envhp;
|
366
|
+
OCIEnv *oci8_make_envhp(void);
|
367
|
+
#ifdef RUBY_VM
|
314
368
|
extern oci8_tls_key_t oci8_tls_key; /* native thread key */
|
315
369
|
OCIError *oci8_make_errhp(void);
|
316
370
|
|
@@ -321,8 +375,8 @@ static inline OCIError *oci8_get_errhp()
|
|
321
375
|
}
|
322
376
|
|
323
377
|
#else
|
324
|
-
|
325
|
-
|
378
|
+
extern OCIError *oci8_global_errhp;
|
379
|
+
OCIError *oci8_make_errhp(void);
|
326
380
|
#endif
|
327
381
|
void Init_oci8_env(void);
|
328
382
|
|
@@ -395,13 +449,13 @@ VALUE oci8_make_bfile(oci8_svcctx_t *svcctx, OCILobLocator *s);
|
|
395
449
|
void Init_ora_date(void);
|
396
450
|
|
397
451
|
/* ocinumber.c */
|
398
|
-
void Init_oci_number(VALUE mOCI);
|
452
|
+
void Init_oci_number(VALUE mOCI, OCIError *errhp);
|
399
453
|
OCINumber *oci8_get_ocinumber(VALUE num);
|
400
|
-
VALUE oci8_make_ocinumber(OCINumber *s);
|
401
|
-
VALUE oci8_make_integer(OCINumber *s);
|
402
|
-
VALUE oci8_make_float(OCINumber *s);
|
403
|
-
OCINumber *oci8_set_ocinumber(OCINumber *result, VALUE self);
|
404
|
-
OCINumber *oci8_set_integer(OCINumber *result, VALUE self);
|
454
|
+
VALUE oci8_make_ocinumber(OCINumber *s, OCIError *errhp);
|
455
|
+
VALUE oci8_make_integer(OCINumber *s, OCIError *errhp);
|
456
|
+
VALUE oci8_make_float(OCINumber *s, OCIError *errhp);
|
457
|
+
OCINumber *oci8_set_ocinumber(OCINumber *result, VALUE self, OCIError *errhp);
|
458
|
+
OCINumber *oci8_set_integer(OCINumber *result, VALUE self, OCIError *errhp);
|
405
459
|
|
406
460
|
/* ocidatetim.c */
|
407
461
|
void Init_oci_datetime(void);
|
data/ext/oci8/oci8lib.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-2009 KUBO Takehiro <kubo@jiubao.org>
|
4
4
|
*/
|
5
5
|
|
6
6
|
#include "oci8.h"
|
@@ -66,7 +66,7 @@ static void oci8_handle_mark(oci8_base_t *base)
|
|
66
66
|
static void oci8_handle_cleanup(oci8_base_t *base)
|
67
67
|
{
|
68
68
|
oci8_base_free(base);
|
69
|
-
|
69
|
+
xfree(base);
|
70
70
|
}
|
71
71
|
|
72
72
|
static VALUE oci8_s_allocate(VALUE klass)
|
@@ -108,6 +108,9 @@ Init_oci8lib()
|
|
108
108
|
{
|
109
109
|
VALUE cOCI8;
|
110
110
|
VALUE obj;
|
111
|
+
OCIEnv *envhp;
|
112
|
+
OCIError *errhp;
|
113
|
+
sword rv;
|
111
114
|
|
112
115
|
#ifdef RUNTIME_API_CHECK
|
113
116
|
Init_oci8_apiwrap();
|
@@ -154,8 +157,35 @@ Init_oci8lib()
|
|
154
157
|
Init_oci8_metadata(cOCI8);
|
155
158
|
Init_oci8_lob(cOCI8);
|
156
159
|
|
160
|
+
/* allocate a temporary errhp to pass Init_oci_number() */
|
161
|
+
if (have_OCIEnvCreate) {
|
162
|
+
rv = OCIEnvCreate(&envhp, oci8_env_mode, NULL, NULL, NULL, NULL, 0, NULL);
|
163
|
+
if (rv != OCI_SUCCESS) {
|
164
|
+
oci8_raise_init_error();
|
165
|
+
}
|
166
|
+
} else {
|
167
|
+
rv = OCIInitialize(oci8_env_mode, NULL, NULL, NULL, NULL);
|
168
|
+
if (rv != OCI_SUCCESS) {
|
169
|
+
oci8_raise_init_error();
|
170
|
+
}
|
171
|
+
rv = OCIEnvInit(&envhp, OCI_DEFAULT, 0, NULL);
|
172
|
+
if (rv != OCI_SUCCESS) {
|
173
|
+
oci8_raise_init_error();
|
174
|
+
}
|
175
|
+
}
|
176
|
+
rv = OCIHandleAlloc(envhp, (dvoid *)&errhp, OCI_HTYPE_ERROR, 0, NULL);
|
177
|
+
if (rv != OCI_SUCCESS)
|
178
|
+
oci8_env_raise(envhp, rv);
|
179
|
+
Init_oci_number(cOCI8, errhp);
|
180
|
+
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
|
181
|
+
if (have_OCIEnvCreate) {
|
182
|
+
OCIHandleFree(envhp, OCI_HTYPE_ENV);
|
183
|
+
} else {
|
184
|
+
/* Delayed OCIEnv initialization cannot be used on Oracle 8.0. */
|
185
|
+
oci8_global_envhp = envhp;
|
186
|
+
}
|
187
|
+
|
157
188
|
Init_ora_date();
|
158
|
-
Init_oci_number(cOCI8);
|
159
189
|
Init_oci_datetime();
|
160
190
|
Init_oci_object(cOCI8);
|
161
191
|
Init_oci_xmldb();
|
@@ -167,6 +197,10 @@ Init_oci8lib()
|
|
167
197
|
#ifdef DEBUG_CORE_FILE
|
168
198
|
signal(SIGSEGV, SIG_DFL);
|
169
199
|
#endif
|
200
|
+
|
201
|
+
if (have_OCIEnvCreate && oci8_global_envhp != NULL) {
|
202
|
+
rb_raise(rb_eRuntimeError, "Internal Error: OCIEnv should not be initialized here.");
|
203
|
+
}
|
170
204
|
}
|
171
205
|
|
172
206
|
VALUE oci8_define_class(const char *name, oci8_base_class_t *base_class)
|
data/ext/oci8/ocidatetime.c
CHANGED
data/ext/oci8/ocinumber.c
CHANGED
@@ -2,10 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* ocinumber.c
|
4
4
|
*
|
5
|
-
*
|
6
|
-
* $Date: 2009-01-12 00:11:09 +0900 (Mon, 12 Jan 2009) $
|
7
|
-
*
|
8
|
-
* Copyright (C) 2005-2008 KUBO Takehiro <kubo@jiubao.org>
|
5
|
+
* Copyright (C) 2005-2009 KUBO Takehiro <kubo@jiubao.org>
|
9
6
|
*
|
10
7
|
*/
|
11
8
|
#include "oci8.h"
|
@@ -20,6 +17,10 @@
|
|
20
17
|
|
21
18
|
static ID id_power; /* rb_intern("**") */
|
22
19
|
static ID id_cmp; /* rb_intern("<=>") */
|
20
|
+
static ID id_finite_p;
|
21
|
+
static ID id_split;
|
22
|
+
static ID id_numerator;
|
23
|
+
static ID id_denominator;
|
23
24
|
|
24
25
|
static VALUE cOCINumber;
|
25
26
|
static OCINumber const_p1; /* +1 */
|
@@ -61,40 +62,40 @@ static VALUE onum_s_alloc(VALUE klass)
|
|
61
62
|
}
|
62
63
|
|
63
64
|
/* construct an ruby object(OCI::Number) from C structure (OCINumber). */
|
64
|
-
VALUE oci8_make_ocinumber(OCINumber *s)
|
65
|
+
VALUE oci8_make_ocinumber(OCINumber *s, OCIError *errhp)
|
65
66
|
{
|
66
67
|
VALUE obj;
|
67
68
|
OCINumber *d;
|
68
69
|
|
69
70
|
obj = Data_Make_Struct(cOCINumber, OCINumber, NULL, xfree, d);
|
70
|
-
oci_lc(OCINumberAssign(
|
71
|
+
oci_lc(OCINumberAssign(errhp, s, d));
|
71
72
|
return obj;
|
72
73
|
}
|
73
74
|
|
74
|
-
VALUE oci8_make_integer(OCINumber *s)
|
75
|
+
VALUE oci8_make_integer(OCINumber *s, OCIError *errhp)
|
75
76
|
{
|
76
77
|
signed long sl;
|
77
78
|
char buf[512];
|
78
79
|
ub4 buf_size = sizeof(buf);
|
79
80
|
|
80
|
-
if (OCINumberToInt(
|
81
|
+
if (OCINumberToInt(errhp, s, sizeof(sl), OCI_NUMBER_SIGNED, &sl) == OCI_SUCCESS) {
|
81
82
|
return LONG2NUM(sl);
|
82
83
|
}
|
83
|
-
oci_lc(OCINumberToText(
|
84
|
+
oci_lc(OCINumberToText(errhp, s, NUMBER_FORMAT2, NUMBER_FORMAT2_LEN,
|
84
85
|
NULL, 0, &buf_size, TO_ORATEXT(buf)));
|
85
86
|
return rb_cstr2inum(buf, 10);
|
86
87
|
}
|
87
88
|
|
88
|
-
VALUE oci8_make_float(OCINumber *s)
|
89
|
+
VALUE oci8_make_float(OCINumber *s, OCIError *errhp)
|
89
90
|
{
|
90
91
|
double dbl;
|
91
92
|
|
92
|
-
oci_lc(OCINumberToReal(
|
93
|
+
oci_lc(OCINumberToReal(errhp, s, sizeof(double), &dbl));
|
93
94
|
return rb_float_new(dbl);
|
94
95
|
}
|
95
96
|
|
96
97
|
/* fill C structure (OCINumber) from a string. */
|
97
|
-
static void set_oci_number_from_str(OCINumber *result, VALUE str, VALUE fmt, VALUE nls_params)
|
98
|
+
static void set_oci_number_from_str(OCINumber *result, VALUE str, VALUE fmt, VALUE nls_params, OCIError *errhp)
|
98
99
|
{
|
99
100
|
oratext *fmt_ptr;
|
100
101
|
oratext *nls_params_ptr;
|
@@ -135,7 +136,7 @@ static void set_oci_number_from_str(OCINumber *result, VALUE str, VALUE fmt, VAL
|
|
135
136
|
nls_params_ptr = RSTRING_ORATEXT(nls_params);
|
136
137
|
nls_params_len = RSTRING_LEN(nls_params);
|
137
138
|
}
|
138
|
-
oci_lc(OCINumberFromText(
|
139
|
+
oci_lc(OCINumberFromText(errhp,
|
139
140
|
RSTRING_ORATEXT(str), RSTRING_LEN(str),
|
140
141
|
fmt_ptr, fmt_len, nls_params_ptr, nls_params_len,
|
141
142
|
result));
|
@@ -143,56 +144,128 @@ static void set_oci_number_from_str(OCINumber *result, VALUE str, VALUE fmt, VAL
|
|
143
144
|
|
144
145
|
/* fill C structure (OCINumber) from a numeric object. */
|
145
146
|
/* 1 - success, 0 - error */
|
146
|
-
static int set_oci_number_from_num(OCINumber *result, VALUE num, int force)
|
147
|
+
static int set_oci_number_from_num(OCINumber *result, VALUE num, int force, OCIError *errhp)
|
147
148
|
{
|
148
149
|
signed long sl;
|
149
150
|
double dbl;
|
150
151
|
|
151
152
|
if (!RTEST(rb_obj_is_kind_of(num, rb_cNumeric)))
|
152
153
|
rb_raise(rb_eTypeError, "expect Numeric but %s", rb_class2name(CLASS_OF(num)));
|
154
|
+
if (rb_respond_to(num, id_finite_p) && !RTEST(rb_funcall(num, id_finite_p, 0))) {
|
155
|
+
rb_raise(rb_eTypeError, "cannot accept number which isn't finite.");
|
156
|
+
}
|
153
157
|
switch (rb_type(num)) {
|
154
158
|
case T_FIXNUM:
|
155
159
|
/* set from long. */
|
156
160
|
sl = NUM2LONG(num);
|
157
|
-
oci_lc(OCINumberFromInt(
|
161
|
+
oci_lc(OCINumberFromInt(errhp, &sl, sizeof(sl), OCI_NUMBER_SIGNED, result));
|
158
162
|
return 1;
|
159
163
|
case T_FLOAT:
|
160
164
|
/* set from double. */
|
161
165
|
dbl = NUM2DBL(num);
|
162
|
-
oci_lc(OCINumberFromReal(
|
166
|
+
oci_lc(OCINumberFromReal(errhp, &dbl, sizeof(dbl), result));
|
163
167
|
return 1;
|
164
168
|
case T_BIGNUM:
|
165
169
|
/* change via string. */
|
166
170
|
num = rb_big2str(num, 10);
|
167
|
-
set_oci_number_from_str(result, num, Qnil, Qnil);
|
171
|
+
set_oci_number_from_str(result, num, Qnil, Qnil, errhp);
|
168
172
|
return 1;
|
169
173
|
}
|
170
174
|
if (RTEST(rb_obj_is_instance_of(num, cOCINumber))) {
|
171
175
|
/* OCI::Number */
|
172
|
-
oci_lc(OCINumberAssign(
|
176
|
+
oci_lc(OCINumberAssign(errhp, DATA_PTR(num), result));
|
173
177
|
return 1;
|
174
178
|
}
|
179
|
+
if (rb_respond_to(num, id_split)) {
|
180
|
+
/* BigDecimal */
|
181
|
+
VALUE split = rb_funcall(num, id_split, 0);
|
182
|
+
|
183
|
+
if (TYPE(split) == T_ARRAY && RARRAY_LEN(split) == 4) {
|
184
|
+
/*
|
185
|
+
* sign, significant_digits, base, exponent = num.split
|
186
|
+
* onum = sign * "0.#{significant_digits}".to_f * (base ** exponent)
|
187
|
+
*/
|
188
|
+
VALUE *ary = RARRAY_PTR(split);
|
189
|
+
int sign;
|
190
|
+
OCINumber digits;
|
191
|
+
int exponent;
|
192
|
+
int digits_len;
|
193
|
+
OCINumber work;
|
194
|
+
|
195
|
+
/* check sign */
|
196
|
+
if (TYPE(ary[0]) != T_FIXNUM) {
|
197
|
+
goto is_not_big_decimal;
|
198
|
+
}
|
199
|
+
sign = FIX2INT(ary[0]);
|
200
|
+
/* check digits */
|
201
|
+
StringValue(ary[1]);
|
202
|
+
digits_len = RSTRING_LEN(ary[1]);
|
203
|
+
set_oci_number_from_str(&digits, ary[1], Qnil, Qnil, errhp);
|
204
|
+
/* check base */
|
205
|
+
if (TYPE(ary[2]) != T_FIXNUM || FIX2LONG(ary[2]) != 10) {
|
206
|
+
goto is_not_big_decimal;
|
207
|
+
}
|
208
|
+
/* check exponent */
|
209
|
+
if (TYPE(ary[3]) != T_FIXNUM) {
|
210
|
+
goto is_not_big_decimal;
|
211
|
+
}
|
212
|
+
exponent = FIX2INT(ary[3]);
|
213
|
+
|
214
|
+
if (have_OCINumberShift) {
|
215
|
+
/* Oracle 8.1 or upper */
|
216
|
+
oci_lc(OCINumberShift(errhp, &digits, exponent - digits_len, &work));
|
217
|
+
} else {
|
218
|
+
/* Oracle 8.0 */
|
219
|
+
int n = 10;
|
220
|
+
OCINumber base;
|
221
|
+
OCINumber exp;
|
222
|
+
|
223
|
+
oci_lc(OCINumberFromInt(errhp, &n, sizeof(n), OCI_NUMBER_SIGNED, &base));
|
224
|
+
oci_lc(OCINumberIntPower(errhp, &base, exponent - digits_len, &exp));
|
225
|
+
oci_lc(OCINumberMul(errhp, &digits, &exp, &work));
|
226
|
+
}
|
227
|
+
if (sign >= 0) {
|
228
|
+
oci_lc(OCINumberAssign(errhp, &work, result));
|
229
|
+
} else {
|
230
|
+
oci_lc(OCINumberNeg(errhp, &work, result));
|
231
|
+
}
|
232
|
+
return 1;
|
233
|
+
}
|
234
|
+
}
|
235
|
+
is_not_big_decimal:
|
236
|
+
if (rb_respond_to(num, id_numerator) && rb_respond_to(num, id_denominator)) {
|
237
|
+
/* Rational */
|
238
|
+
OCINumber numerator;
|
239
|
+
OCINumber denominator;
|
240
|
+
|
241
|
+
if (set_oci_number_from_num(&numerator, rb_funcall(num, id_numerator, 0), 0, errhp) &&
|
242
|
+
set_oci_number_from_num(&denominator, rb_funcall(num, id_denominator, 0), 0, errhp)) {
|
243
|
+
oci_lc(OCINumberDiv(errhp, &numerator, &denominator, result));
|
244
|
+
return 1;
|
245
|
+
}
|
246
|
+
}
|
175
247
|
if (force) {
|
176
248
|
/* change via string as a last resort. */
|
177
249
|
/* TODO: if error, raise TypeError instead of OCI::Error */
|
178
|
-
set_oci_number_from_str(result, num, Qnil, Qnil);
|
250
|
+
set_oci_number_from_str(result, num, Qnil, Qnil, errhp);
|
179
251
|
return 1;
|
180
252
|
}
|
181
253
|
return 0;
|
182
254
|
}
|
183
255
|
|
184
|
-
OCINumber *oci8_set_ocinumber(OCINumber *result, VALUE self)
|
256
|
+
OCINumber *oci8_set_ocinumber(OCINumber *result, VALUE self, OCIError *errhp)
|
185
257
|
{
|
186
|
-
set_oci_number_from_num(result, self, 1);
|
258
|
+
set_oci_number_from_num(result, self, 1, errhp);
|
187
259
|
return result;
|
188
260
|
}
|
189
|
-
#define TO_OCINUM
|
261
|
+
#define TO_OCINUM oci8_set_ocinumber
|
190
262
|
|
191
|
-
OCINumber *oci8_set_integer(OCINumber *result, VALUE self)
|
263
|
+
OCINumber *oci8_set_integer(OCINumber *result, VALUE self, OCIError *errhp)
|
192
264
|
{
|
193
265
|
OCINumber work;
|
194
|
-
|
195
|
-
|
266
|
+
|
267
|
+
set_oci_number_from_num(&work, self, 1, errhp);
|
268
|
+
oci_lc(OCINumberTrunc(errhp, &work, 0, result));
|
196
269
|
return result;
|
197
270
|
}
|
198
271
|
|
@@ -205,30 +278,31 @@ OCINumber *oci8_set_integer(OCINumber *result, VALUE self)
|
|
205
278
|
*/
|
206
279
|
static VALUE omath_atan2(VALUE self, VALUE Ycoordinate, VALUE Xcoordinate)
|
207
280
|
{
|
281
|
+
OCIError *errhp = oci8_errhp;
|
208
282
|
OCINumber nY;
|
209
283
|
OCINumber nX;
|
210
284
|
OCINumber rv;
|
211
285
|
boolean is_zero;
|
212
286
|
sword sign;
|
213
287
|
|
214
|
-
set_oci_number_from_num(&nX, Xcoordinate, 1);
|
215
|
-
set_oci_number_from_num(&nY, Ycoordinate, 1);
|
288
|
+
set_oci_number_from_num(&nX, Xcoordinate, 1, errhp);
|
289
|
+
set_oci_number_from_num(&nY, Ycoordinate, 1, errhp);
|
216
290
|
/* check zero */
|
217
|
-
oci_lc(OCINumberIsZero(
|
291
|
+
oci_lc(OCINumberIsZero(errhp, &nX, &is_zero));
|
218
292
|
if (is_zero) {
|
219
|
-
oci_lc(OCINumberSign(
|
293
|
+
oci_lc(OCINumberSign(errhp, &nY, &sign));
|
220
294
|
switch (sign) {
|
221
295
|
case 0:
|
222
296
|
return INT2FIX(0); /* atan2(0, 0) => 0 or ERROR? */
|
223
297
|
case 1:
|
224
|
-
return oci8_make_ocinumber(&const_PI2); /* atan2(positive, 0) => PI/2 */
|
298
|
+
return oci8_make_ocinumber(&const_PI2, errhp); /* atan2(positive, 0) => PI/2 */
|
225
299
|
case -1:
|
226
|
-
return oci8_make_ocinumber(&const_mPI2); /* atan2(negative, 0) => -PI/2 */
|
300
|
+
return oci8_make_ocinumber(&const_mPI2, errhp); /* atan2(negative, 0) => -PI/2 */
|
227
301
|
}
|
228
302
|
}
|
229
303
|
/* atan2 */
|
230
|
-
oci_lc(OCINumberArcTan2(
|
231
|
-
return oci8_make_ocinumber(&rv);
|
304
|
+
oci_lc(OCINumberArcTan2(errhp, &nY, &nX, &rv));
|
305
|
+
return oci8_make_ocinumber(&rv, errhp);
|
232
306
|
}
|
233
307
|
|
234
308
|
/*
|
@@ -240,11 +314,12 @@ static VALUE omath_atan2(VALUE self, VALUE Ycoordinate, VALUE Xcoordinate)
|
|
240
314
|
*/
|
241
315
|
static VALUE omath_cos(VALUE obj, VALUE radian)
|
242
316
|
{
|
317
|
+
OCIError *errhp = oci8_errhp;
|
243
318
|
OCINumber r;
|
244
319
|
OCINumber rv;
|
245
320
|
|
246
|
-
oci_lc(OCINumberCos(
|
247
|
-
return oci8_make_ocinumber(&rv);
|
321
|
+
oci_lc(OCINumberCos(errhp, TO_OCINUM(&r, radian, errhp), &rv));
|
322
|
+
return oci8_make_ocinumber(&rv, errhp);
|
248
323
|
}
|
249
324
|
|
250
325
|
/*
|
@@ -256,11 +331,12 @@ static VALUE omath_cos(VALUE obj, VALUE radian)
|
|
256
331
|
*/
|
257
332
|
static VALUE omath_sin(VALUE obj, VALUE radian)
|
258
333
|
{
|
334
|
+
OCIError *errhp = oci8_errhp;
|
259
335
|
OCINumber r;
|
260
336
|
OCINumber rv;
|
261
337
|
|
262
|
-
oci_lc(OCINumberSin(
|
263
|
-
return oci8_make_ocinumber(&rv);
|
338
|
+
oci_lc(OCINumberSin(errhp, TO_OCINUM(&r, radian, errhp), &rv));
|
339
|
+
return oci8_make_ocinumber(&rv, errhp);
|
264
340
|
}
|
265
341
|
|
266
342
|
/*
|
@@ -271,11 +347,12 @@ static VALUE omath_sin(VALUE obj, VALUE radian)
|
|
271
347
|
*/
|
272
348
|
static VALUE omath_tan(VALUE obj, VALUE radian)
|
273
349
|
{
|
350
|
+
OCIError *errhp = oci8_errhp;
|
274
351
|
OCINumber r;
|
275
352
|
OCINumber rv;
|
276
353
|
|
277
|
-
oci_lc(OCINumberTan(
|
278
|
-
return oci8_make_ocinumber(&rv);
|
354
|
+
oci_lc(OCINumberTan(errhp, TO_OCINUM(&r, radian, errhp), &rv));
|
355
|
+
return oci8_make_ocinumber(&rv, errhp);
|
279
356
|
}
|
280
357
|
|
281
358
|
/*
|
@@ -286,22 +363,23 @@ static VALUE omath_tan(VALUE obj, VALUE radian)
|
|
286
363
|
*/
|
287
364
|
static VALUE omath_acos(VALUE obj, VALUE num)
|
288
365
|
{
|
366
|
+
OCIError *errhp = oci8_errhp;
|
289
367
|
OCINumber n;
|
290
368
|
OCINumber r;
|
291
369
|
sword sign;
|
292
370
|
|
293
|
-
set_oci_number_from_num(&n, num, 1);
|
371
|
+
set_oci_number_from_num(&n, num, 1, errhp);
|
294
372
|
/* check upper bound */
|
295
|
-
oci_lc(OCINumberCmp(
|
373
|
+
oci_lc(OCINumberCmp(errhp, &n, &const_p1, &sign));
|
296
374
|
if (sign > 0)
|
297
375
|
rb_raise(rb_eRangeError, "out of range for acos");
|
298
376
|
/* check lower bound */
|
299
|
-
oci_lc(OCINumberCmp(
|
377
|
+
oci_lc(OCINumberCmp(errhp, &n, &const_m1, &sign));
|
300
378
|
if (sign < 0)
|
301
379
|
rb_raise(rb_eRangeError, "out of range for acos");
|
302
380
|
/* acos */
|
303
|
-
oci_lc(OCINumberArcCos(
|
304
|
-
return oci8_make_ocinumber(&r);
|
381
|
+
oci_lc(OCINumberArcCos(errhp, &n, &r));
|
382
|
+
return oci8_make_ocinumber(&r, errhp);
|
305
383
|
}
|
306
384
|
|
307
385
|
/*
|
@@ -312,22 +390,23 @@ static VALUE omath_acos(VALUE obj, VALUE num)
|
|
312
390
|
*/
|
313
391
|
static VALUE omath_asin(VALUE obj, VALUE num)
|
314
392
|
{
|
393
|
+
OCIError *errhp = oci8_errhp;
|
315
394
|
OCINumber n;
|
316
395
|
OCINumber r;
|
317
396
|
sword sign;
|
318
397
|
|
319
|
-
set_oci_number_from_num(&n, num, 1);
|
398
|
+
set_oci_number_from_num(&n, num, 1, errhp);
|
320
399
|
/* check upper bound */
|
321
|
-
oci_lc(OCINumberCmp(
|
400
|
+
oci_lc(OCINumberCmp(errhp, &n, &const_p1, &sign));
|
322
401
|
if (sign > 0)
|
323
402
|
rb_raise(rb_eRangeError, "out of range for asin");
|
324
403
|
/* check lower bound */
|
325
|
-
oci_lc(OCINumberCmp(
|
404
|
+
oci_lc(OCINumberCmp(errhp, &n, &const_m1, &sign));
|
326
405
|
if (sign < 0)
|
327
406
|
rb_raise(rb_eRangeError, "out of range for asin");
|
328
407
|
/* asin */
|
329
|
-
oci_lc(OCINumberArcSin(
|
330
|
-
return oci8_make_ocinumber(&r);
|
408
|
+
oci_lc(OCINumberArcSin(errhp, &n, &r));
|
409
|
+
return oci8_make_ocinumber(&r, errhp);
|
331
410
|
}
|
332
411
|
|
333
412
|
/*
|
@@ -338,11 +417,12 @@ static VALUE omath_asin(VALUE obj, VALUE num)
|
|
338
417
|
*/
|
339
418
|
static VALUE omath_atan(VALUE obj, VALUE num)
|
340
419
|
{
|
420
|
+
OCIError *errhp = oci8_errhp;
|
341
421
|
OCINumber n;
|
342
422
|
OCINumber r;
|
343
423
|
|
344
|
-
oci_lc(OCINumberArcTan(
|
345
|
-
return oci8_make_ocinumber(&r);
|
424
|
+
oci_lc(OCINumberArcTan(errhp, TO_OCINUM(&n, num, errhp), &r));
|
425
|
+
return oci8_make_ocinumber(&r, errhp);
|
346
426
|
}
|
347
427
|
|
348
428
|
/*
|
@@ -353,11 +433,12 @@ static VALUE omath_atan(VALUE obj, VALUE num)
|
|
353
433
|
*/
|
354
434
|
static VALUE omath_cosh(VALUE obj, VALUE num)
|
355
435
|
{
|
436
|
+
OCIError *errhp = oci8_errhp;
|
356
437
|
OCINumber n;
|
357
438
|
OCINumber r;
|
358
439
|
|
359
|
-
oci_lc(OCINumberHypCos(
|
360
|
-
return oci8_make_ocinumber(&r);
|
440
|
+
oci_lc(OCINumberHypCos(errhp, TO_OCINUM(&n, num, errhp), &r));
|
441
|
+
return oci8_make_ocinumber(&r, errhp);
|
361
442
|
}
|
362
443
|
|
363
444
|
/*
|
@@ -369,11 +450,12 @@ static VALUE omath_cosh(VALUE obj, VALUE num)
|
|
369
450
|
*/
|
370
451
|
static VALUE omath_sinh(VALUE obj, VALUE num)
|
371
452
|
{
|
453
|
+
OCIError *errhp = oci8_errhp;
|
372
454
|
OCINumber n;
|
373
455
|
OCINumber r;
|
374
456
|
|
375
|
-
oci_lc(OCINumberHypSin(
|
376
|
-
return oci8_make_ocinumber(&r);
|
457
|
+
oci_lc(OCINumberHypSin(errhp, TO_OCINUM(&n, num, errhp), &r));
|
458
|
+
return oci8_make_ocinumber(&r, errhp);
|
377
459
|
}
|
378
460
|
|
379
461
|
/*
|
@@ -385,11 +467,12 @@ static VALUE omath_sinh(VALUE obj, VALUE num)
|
|
385
467
|
*/
|
386
468
|
static VALUE omath_tanh(VALUE obj, VALUE num)
|
387
469
|
{
|
470
|
+
OCIError *errhp = oci8_errhp;
|
388
471
|
OCINumber n;
|
389
472
|
OCINumber r;
|
390
473
|
|
391
|
-
oci_lc(OCINumberHypTan(
|
392
|
-
return oci8_make_ocinumber(&r);
|
474
|
+
oci_lc(OCINumberHypTan(errhp, TO_OCINUM(&n, num, errhp), &r));
|
475
|
+
return oci8_make_ocinumber(&r, errhp);
|
393
476
|
}
|
394
477
|
|
395
478
|
/*
|
@@ -400,11 +483,12 @@ static VALUE omath_tanh(VALUE obj, VALUE num)
|
|
400
483
|
*/
|
401
484
|
static VALUE omath_exp(VALUE obj, VALUE num)
|
402
485
|
{
|
486
|
+
OCIError *errhp = oci8_errhp;
|
403
487
|
OCINumber n;
|
404
488
|
OCINumber r;
|
405
489
|
|
406
|
-
oci_lc(OCINumberExp(
|
407
|
-
return oci8_make_ocinumber(&r);
|
490
|
+
oci_lc(OCINumberExp(errhp, TO_OCINUM(&n, num, errhp), &r));
|
491
|
+
return oci8_make_ocinumber(&r, errhp);
|
408
492
|
}
|
409
493
|
|
410
494
|
/*
|
@@ -417,6 +501,7 @@ static VALUE omath_exp(VALUE obj, VALUE num)
|
|
417
501
|
*/
|
418
502
|
static VALUE omath_log(int argc, VALUE *argv, VALUE obj)
|
419
503
|
{
|
504
|
+
OCIError *errhp = oci8_errhp;
|
420
505
|
VALUE num, base;
|
421
506
|
OCINumber n;
|
422
507
|
OCINumber b;
|
@@ -424,23 +509,23 @@ static VALUE omath_log(int argc, VALUE *argv, VALUE obj)
|
|
424
509
|
sword sign;
|
425
510
|
|
426
511
|
rb_scan_args(argc, argv, "11", &num, &base);
|
427
|
-
set_oci_number_from_num(&n, num, 1);
|
428
|
-
oci_lc(OCINumberSign(
|
512
|
+
set_oci_number_from_num(&n, num, 1, errhp);
|
513
|
+
oci_lc(OCINumberSign(errhp, &n, &sign));
|
429
514
|
if (sign <= 0)
|
430
515
|
rb_raise(rb_eRangeError, "nonpositive value for log");
|
431
516
|
if (NIL_P(base)) {
|
432
|
-
oci_lc(OCINumberLn(
|
517
|
+
oci_lc(OCINumberLn(errhp, &n, &r));
|
433
518
|
} else {
|
434
|
-
set_oci_number_from_num(&b, base, 1);
|
435
|
-
oci_lc(OCINumberSign(
|
519
|
+
set_oci_number_from_num(&b, base, 1, errhp);
|
520
|
+
oci_lc(OCINumberSign(errhp, &b, &sign));
|
436
521
|
if (sign <= 0)
|
437
522
|
rb_raise(rb_eRangeError, "nonpositive value for the base of log");
|
438
|
-
oci_lc(OCINumberCmp(
|
523
|
+
oci_lc(OCINumberCmp(errhp, &b, &const_p1, &sign));
|
439
524
|
if (sign == 0)
|
440
525
|
rb_raise(rb_eRangeError, "base 1 for log");
|
441
|
-
oci_lc(OCINumberLog(
|
526
|
+
oci_lc(OCINumberLog(errhp, &b, &n, &r));
|
442
527
|
}
|
443
|
-
return oci8_make_ocinumber(&r);
|
528
|
+
return oci8_make_ocinumber(&r, errhp);
|
444
529
|
}
|
445
530
|
|
446
531
|
/*
|
@@ -451,16 +536,17 @@ static VALUE omath_log(int argc, VALUE *argv, VALUE obj)
|
|
451
536
|
*/
|
452
537
|
static VALUE omath_log10(VALUE obj, VALUE num)
|
453
538
|
{
|
539
|
+
OCIError *errhp = oci8_errhp;
|
454
540
|
OCINumber n;
|
455
541
|
OCINumber r;
|
456
542
|
sword sign;
|
457
543
|
|
458
|
-
set_oci_number_from_num(&n, num, 1);
|
459
|
-
oci_lc(OCINumberSign(
|
544
|
+
set_oci_number_from_num(&n, num, 1, errhp);
|
545
|
+
oci_lc(OCINumberSign(errhp, &n, &sign));
|
460
546
|
if (sign <= 0)
|
461
547
|
rb_raise(rb_eRangeError, "nonpositive value for log10");
|
462
|
-
oci_lc(OCINumberLog(
|
463
|
-
return oci8_make_ocinumber(&r);
|
548
|
+
oci_lc(OCINumberLog(errhp, &const_p10, &n, &r));
|
549
|
+
return oci8_make_ocinumber(&r, errhp);
|
464
550
|
}
|
465
551
|
|
466
552
|
/*
|
@@ -471,33 +557,35 @@ static VALUE omath_log10(VALUE obj, VALUE num)
|
|
471
557
|
*/
|
472
558
|
static VALUE omath_sqrt(VALUE obj, VALUE num)
|
473
559
|
{
|
560
|
+
OCIError *errhp = oci8_errhp;
|
474
561
|
OCINumber n;
|
475
562
|
OCINumber r;
|
476
563
|
sword sign;
|
477
564
|
|
478
|
-
set_oci_number_from_num(&n, num, 1);
|
565
|
+
set_oci_number_from_num(&n, num, 1, errhp);
|
479
566
|
/* check whether num is negative */
|
480
|
-
oci_lc(OCINumberSign(
|
567
|
+
oci_lc(OCINumberSign(errhp, &n, &sign));
|
481
568
|
if (sign < 0) {
|
482
569
|
errno = EDOM;
|
483
570
|
rb_sys_fail("sqrt");
|
484
571
|
}
|
485
|
-
oci_lc(OCINumberSqrt(
|
486
|
-
return oci8_make_ocinumber(&r);
|
572
|
+
oci_lc(OCINumberSqrt(errhp, &n, &r));
|
573
|
+
return oci8_make_ocinumber(&r, errhp);
|
487
574
|
}
|
488
575
|
|
489
576
|
static VALUE onum_initialize(int argc, VALUE *argv, VALUE self)
|
490
577
|
{
|
578
|
+
OCIError *errhp = oci8_errhp;
|
491
579
|
VALUE val;
|
492
580
|
VALUE fmt;
|
493
581
|
VALUE nls_params;
|
494
582
|
|
495
583
|
if (rb_scan_args(argc, argv, "03", &val /* 0 */, &fmt /* nil */, &nls_params /* nil */) == 0) {
|
496
|
-
OCINumberSetZero(
|
584
|
+
OCINumberSetZero(errhp, _NUMBER(self));
|
497
585
|
} else if (RTEST(rb_obj_is_kind_of(val, rb_cNumeric))) {
|
498
|
-
set_oci_number_from_num(_NUMBER(self), val, 1);
|
586
|
+
set_oci_number_from_num(_NUMBER(self), val, 1, errhp);
|
499
587
|
} else {
|
500
|
-
set_oci_number_from_str(_NUMBER(self), val, fmt, nls_params);
|
588
|
+
set_oci_number_from_str(_NUMBER(self), val, fmt, nls_params, errhp);
|
501
589
|
}
|
502
590
|
return Qnil;
|
503
591
|
}
|
@@ -514,11 +602,12 @@ static VALUE onum_initialize_copy(VALUE lhs, VALUE rhs)
|
|
514
602
|
|
515
603
|
static VALUE onum_coerce(VALUE self, VALUE other)
|
516
604
|
{
|
605
|
+
OCIError *errhp = oci8_errhp;
|
517
606
|
OCINumber n;
|
518
607
|
|
519
608
|
if (RTEST(rb_obj_is_kind_of(other, rb_cNumeric)))
|
520
|
-
if (set_oci_number_from_num(&n, other, 0))
|
521
|
-
return rb_assoc_new(oci8_make_ocinumber(&n), self);
|
609
|
+
if (set_oci_number_from_num(&n, other, 0, errhp))
|
610
|
+
return rb_assoc_new(oci8_make_ocinumber(&n, errhp), self);
|
522
611
|
rb_raise(rb_eTypeError, "Can't coerce %s to %s",
|
523
612
|
rb_class2name(CLASS_OF(other)), rb_class2name(cOCINumber));
|
524
613
|
}
|
@@ -531,10 +620,11 @@ static VALUE onum_coerce(VALUE self, VALUE other)
|
|
531
620
|
*/
|
532
621
|
static VALUE onum_neg(VALUE self)
|
533
622
|
{
|
623
|
+
OCIError *errhp = oci8_errhp;
|
534
624
|
OCINumber r;
|
535
625
|
|
536
|
-
oci_lc(OCINumberNeg(
|
537
|
-
return oci8_make_ocinumber(&r);
|
626
|
+
oci_lc(OCINumberNeg(errhp, _NUMBER(self), &r));
|
627
|
+
return oci8_make_ocinumber(&r, errhp);
|
538
628
|
}
|
539
629
|
|
540
630
|
/*
|
@@ -546,15 +636,16 @@ static VALUE onum_neg(VALUE self)
|
|
546
636
|
*/
|
547
637
|
static VALUE onum_add(VALUE lhs, VALUE rhs)
|
548
638
|
{
|
639
|
+
OCIError *errhp = oci8_errhp;
|
549
640
|
OCINumber n;
|
550
641
|
OCINumber r;
|
551
642
|
|
552
643
|
/* change to OCINumber */
|
553
|
-
if (!set_oci_number_from_num(&n, rhs, 0))
|
644
|
+
if (!set_oci_number_from_num(&n, rhs, 0, errhp))
|
554
645
|
return rb_num_coerce_bin(lhs, rhs, '+');
|
555
646
|
/* add */
|
556
|
-
oci_lc(OCINumberAdd(
|
557
|
-
return oci8_make_ocinumber(&r);
|
647
|
+
oci_lc(OCINumberAdd(errhp, _NUMBER(lhs), &n, &r));
|
648
|
+
return oci8_make_ocinumber(&r, errhp);
|
558
649
|
}
|
559
650
|
|
560
651
|
/*
|
@@ -566,15 +657,16 @@ static VALUE onum_add(VALUE lhs, VALUE rhs)
|
|
566
657
|
*/
|
567
658
|
static VALUE onum_sub(VALUE lhs, VALUE rhs)
|
568
659
|
{
|
660
|
+
OCIError *errhp = oci8_errhp;
|
569
661
|
OCINumber n;
|
570
662
|
OCINumber r;
|
571
663
|
|
572
664
|
/* change to OCINumber */
|
573
|
-
if (!set_oci_number_from_num(&n, rhs, 0))
|
665
|
+
if (!set_oci_number_from_num(&n, rhs, 0, errhp))
|
574
666
|
return rb_num_coerce_bin(lhs, rhs, '-');
|
575
667
|
/* subtracting */
|
576
|
-
oci_lc(OCINumberSub(
|
577
|
-
return oci8_make_ocinumber(&r);
|
668
|
+
oci_lc(OCINumberSub(errhp, _NUMBER(lhs), &n, &r));
|
669
|
+
return oci8_make_ocinumber(&r, errhp);
|
578
670
|
}
|
579
671
|
|
580
672
|
/*
|
@@ -586,15 +678,16 @@ static VALUE onum_sub(VALUE lhs, VALUE rhs)
|
|
586
678
|
*/
|
587
679
|
static VALUE onum_mul(VALUE lhs, VALUE rhs)
|
588
680
|
{
|
681
|
+
OCIError *errhp = oci8_errhp;
|
589
682
|
OCINumber n;
|
590
683
|
OCINumber r;
|
591
684
|
|
592
685
|
/* change to OCINumber */
|
593
|
-
if (!set_oci_number_from_num(&n, rhs, 0))
|
686
|
+
if (!set_oci_number_from_num(&n, rhs, 0, errhp))
|
594
687
|
return rb_num_coerce_bin(lhs, rhs, '*');
|
595
688
|
/* multiply */
|
596
|
-
oci_lc(OCINumberMul(
|
597
|
-
return oci8_make_ocinumber(&r);
|
689
|
+
oci_lc(OCINumberMul(errhp, _NUMBER(lhs), &n, &r));
|
690
|
+
return oci8_make_ocinumber(&r, errhp);
|
598
691
|
}
|
599
692
|
|
600
693
|
/*
|
@@ -606,20 +699,21 @@ static VALUE onum_mul(VALUE lhs, VALUE rhs)
|
|
606
699
|
*/
|
607
700
|
static VALUE onum_div(VALUE lhs, VALUE rhs)
|
608
701
|
{
|
702
|
+
OCIError *errhp = oci8_errhp;
|
609
703
|
OCINumber n;
|
610
704
|
OCINumber r;
|
611
705
|
boolean is_zero;
|
612
706
|
|
613
707
|
/* change to OCINumber */
|
614
|
-
if (!set_oci_number_from_num(&n, rhs, 0))
|
708
|
+
if (!set_oci_number_from_num(&n, rhs, 0, errhp))
|
615
709
|
return rb_num_coerce_bin(lhs, rhs, '/');
|
616
710
|
/* check whether argument is not zero. */
|
617
|
-
oci_lc(OCINumberIsZero(
|
711
|
+
oci_lc(OCINumberIsZero(errhp, &n, &is_zero));
|
618
712
|
if (is_zero)
|
619
713
|
rb_num_zerodiv();
|
620
714
|
/* division */
|
621
|
-
oci_lc(OCINumberDiv(
|
622
|
-
return oci8_make_ocinumber(&r);
|
715
|
+
oci_lc(OCINumberDiv(errhp, _NUMBER(lhs), &n, &r));
|
716
|
+
return oci8_make_ocinumber(&r, errhp);
|
623
717
|
}
|
624
718
|
|
625
719
|
/*
|
@@ -630,20 +724,21 @@ static VALUE onum_div(VALUE lhs, VALUE rhs)
|
|
630
724
|
*/
|
631
725
|
static VALUE onum_mod(VALUE lhs, VALUE rhs)
|
632
726
|
{
|
727
|
+
OCIError *errhp = oci8_errhp;
|
633
728
|
OCINumber n;
|
634
729
|
OCINumber r;
|
635
730
|
boolean is_zero;
|
636
731
|
|
637
732
|
/* change to OCINumber */
|
638
|
-
if (!set_oci_number_from_num(&n, rhs, 0))
|
733
|
+
if (!set_oci_number_from_num(&n, rhs, 0, errhp))
|
639
734
|
return rb_num_coerce_bin(lhs, rhs, '%');
|
640
735
|
/* check whether argument is not zero. */
|
641
|
-
oci_lc(OCINumberIsZero(
|
736
|
+
oci_lc(OCINumberIsZero(errhp, &n, &is_zero));
|
642
737
|
if (is_zero)
|
643
738
|
rb_num_zerodiv();
|
644
739
|
/* modulo */
|
645
|
-
oci_lc(OCINumberMod(
|
646
|
-
return oci8_make_ocinumber(&r);
|
740
|
+
oci_lc(OCINumberMod(errhp, _NUMBER(lhs), &n, &r));
|
741
|
+
return oci8_make_ocinumber(&r, errhp);
|
647
742
|
}
|
648
743
|
|
649
744
|
/*
|
@@ -654,18 +749,19 @@ static VALUE onum_mod(VALUE lhs, VALUE rhs)
|
|
654
749
|
*/
|
655
750
|
static VALUE onum_power(VALUE lhs, VALUE rhs)
|
656
751
|
{
|
752
|
+
OCIError *errhp = oci8_errhp;
|
657
753
|
OCINumber n;
|
658
754
|
OCINumber r;
|
659
755
|
|
660
756
|
if (FIXNUM_P(rhs)) {
|
661
|
-
oci_lc(OCINumberIntPower(
|
757
|
+
oci_lc(OCINumberIntPower(errhp, _NUMBER(lhs), FIX2INT(rhs), &r));
|
662
758
|
} else {
|
663
759
|
/* change to OCINumber */
|
664
|
-
if (!set_oci_number_from_num(&n, rhs, 0))
|
760
|
+
if (!set_oci_number_from_num(&n, rhs, 0, errhp))
|
665
761
|
return rb_num_coerce_bin(lhs, rhs, id_power);
|
666
|
-
oci_lc(OCINumberPower(
|
762
|
+
oci_lc(OCINumberPower(errhp, _NUMBER(lhs), &n, &r));
|
667
763
|
}
|
668
|
-
return oci8_make_ocinumber(&r);
|
764
|
+
return oci8_make_ocinumber(&r, errhp);
|
669
765
|
}
|
670
766
|
|
671
767
|
/*
|
@@ -678,14 +774,15 @@ static VALUE onum_power(VALUE lhs, VALUE rhs)
|
|
678
774
|
*/
|
679
775
|
static VALUE onum_cmp(VALUE lhs, VALUE rhs)
|
680
776
|
{
|
777
|
+
OCIError *errhp = oci8_errhp;
|
681
778
|
OCINumber n;
|
682
779
|
sword r;
|
683
780
|
|
684
781
|
/* change to OCINumber */
|
685
|
-
if (!set_oci_number_from_num(&n, rhs, 0))
|
782
|
+
if (!set_oci_number_from_num(&n, rhs, 0, errhp))
|
686
783
|
return rb_num_coerce_cmp(lhs, rhs, id_cmp);
|
687
784
|
/* compare */
|
688
|
-
oci_lc(OCINumberCmp(
|
785
|
+
oci_lc(OCINumberCmp(errhp, _NUMBER(lhs), &n, &r));
|
689
786
|
if (r > 0) {
|
690
787
|
return INT2FIX(1);
|
691
788
|
} else if (r == 0) {
|
@@ -703,10 +800,11 @@ static VALUE onum_cmp(VALUE lhs, VALUE rhs)
|
|
703
800
|
*/
|
704
801
|
static VALUE onum_floor(VALUE self)
|
705
802
|
{
|
803
|
+
OCIError *errhp = oci8_errhp;
|
706
804
|
OCINumber r;
|
707
805
|
|
708
|
-
oci_lc(OCINumberFloor(
|
709
|
-
return oci8_make_integer(&r);
|
806
|
+
oci_lc(OCINumberFloor(errhp, _NUMBER(self), &r));
|
807
|
+
return oci8_make_integer(&r, errhp);
|
710
808
|
}
|
711
809
|
|
712
810
|
/*
|
@@ -718,10 +816,11 @@ static VALUE onum_floor(VALUE self)
|
|
718
816
|
*/
|
719
817
|
static VALUE onum_ceil(VALUE self)
|
720
818
|
{
|
819
|
+
OCIError *errhp = oci8_errhp;
|
721
820
|
OCINumber r;
|
722
821
|
|
723
|
-
oci_lc(OCINumberCeil(
|
724
|
-
return oci8_make_integer(&r);
|
822
|
+
oci_lc(OCINumberCeil(errhp, _NUMBER(self), &r));
|
823
|
+
return oci8_make_integer(&r, errhp);
|
725
824
|
}
|
726
825
|
|
727
826
|
/*
|
@@ -738,15 +837,16 @@ static VALUE onum_ceil(VALUE self)
|
|
738
837
|
*/
|
739
838
|
static VALUE onum_round(int argc, VALUE *argv, VALUE self)
|
740
839
|
{
|
840
|
+
OCIError *errhp = oci8_errhp;
|
741
841
|
VALUE decplace;
|
742
842
|
OCINumber r;
|
743
843
|
|
744
844
|
rb_scan_args(argc, argv, "01", &decplace /* 0 */);
|
745
|
-
oci_lc(OCINumberRound(
|
845
|
+
oci_lc(OCINumberRound(errhp, _NUMBER(self), NIL_P(decplace) ? 0 : NUM2INT(decplace), &r));
|
746
846
|
if (argc == 0) {
|
747
|
-
return oci8_make_integer(&r);
|
847
|
+
return oci8_make_integer(&r, errhp);
|
748
848
|
} else {
|
749
|
-
return oci8_make_ocinumber(&r);
|
849
|
+
return oci8_make_ocinumber(&r, errhp);
|
750
850
|
}
|
751
851
|
}
|
752
852
|
|
@@ -760,12 +860,13 @@ static VALUE onum_round(int argc, VALUE *argv, VALUE self)
|
|
760
860
|
*/
|
761
861
|
static VALUE onum_trunc(int argc, VALUE *argv, VALUE self)
|
762
862
|
{
|
863
|
+
OCIError *errhp = oci8_errhp;
|
763
864
|
VALUE decplace;
|
764
865
|
OCINumber r;
|
765
866
|
|
766
867
|
rb_scan_args(argc, argv, "01", &decplace /* 0 */);
|
767
|
-
oci_lc(OCINumberTrunc(
|
768
|
-
return oci8_make_ocinumber(&r);
|
868
|
+
oci_lc(OCINumberTrunc(errhp, _NUMBER(self), NIL_P(decplace) ? 0 : NUM2INT(decplace), &r));
|
869
|
+
return oci8_make_ocinumber(&r, errhp);
|
769
870
|
}
|
770
871
|
|
771
872
|
/*
|
@@ -781,10 +882,11 @@ static VALUE onum_trunc(int argc, VALUE *argv, VALUE self)
|
|
781
882
|
*/
|
782
883
|
static VALUE onum_round_prec(VALUE self, VALUE ndigs)
|
783
884
|
{
|
885
|
+
OCIError *errhp = oci8_errhp;
|
784
886
|
OCINumber r;
|
785
887
|
|
786
|
-
oci_lc(OCINumberPrec(
|
787
|
-
return oci8_make_ocinumber(&r);
|
888
|
+
oci_lc(OCINumberPrec(errhp, _NUMBER(self), NUM2INT(ndigs), &r));
|
889
|
+
return oci8_make_ocinumber(&r, errhp);
|
788
890
|
}
|
789
891
|
|
790
892
|
/*
|
@@ -797,6 +899,7 @@ static VALUE onum_round_prec(VALUE self, VALUE ndigs)
|
|
797
899
|
*/
|
798
900
|
static VALUE onum_to_char(int argc, VALUE *argv, VALUE self)
|
799
901
|
{
|
902
|
+
OCIError *errhp = oci8_errhp;
|
800
903
|
VALUE fmt;
|
801
904
|
VALUE nls_params;
|
802
905
|
char buf[512];
|
@@ -813,13 +916,13 @@ static VALUE onum_to_char(int argc, VALUE *argv, VALUE self)
|
|
813
916
|
sword sign;
|
814
917
|
boolean is_int;
|
815
918
|
|
816
|
-
oci_lc(OCINumberIsInt(
|
919
|
+
oci_lc(OCINumberIsInt(errhp, _NUMBER(self), &is_int));
|
817
920
|
if (is_int) {
|
818
921
|
fmt_ptr = NUMBER_FORMAT_INT;
|
819
922
|
fmt_len = NUMBER_FORMAT_INT_LEN;
|
820
923
|
} else {
|
821
|
-
oci_lc(OCINumberAbs(
|
822
|
-
oci_lc(OCINumberCmp(
|
924
|
+
oci_lc(OCINumberAbs(errhp, _NUMBER(self), &absval));
|
925
|
+
oci_lc(OCINumberCmp(errhp, &absval, &const_shreshold, &sign));
|
823
926
|
if (sign >= 0) {
|
824
927
|
fmt_ptr = NUMBER_FORMAT2;
|
825
928
|
fmt_len = NUMBER_FORMAT2_LEN;
|
@@ -841,18 +944,18 @@ static VALUE onum_to_char(int argc, VALUE *argv, VALUE self)
|
|
841
944
|
nls_params_ptr = RSTRING_ORATEXT(nls_params);
|
842
945
|
nls_params_len = RSTRING_LEN(nls_params);
|
843
946
|
}
|
844
|
-
rv = OCINumberToText(
|
947
|
+
rv = OCINumberToText(errhp, _NUMBER(self),
|
845
948
|
fmt_ptr, fmt_len, nls_params_ptr, nls_params_len,
|
846
949
|
&buf_size, TO_ORATEXT(buf));
|
847
950
|
if (rv == OCI_ERROR) {
|
848
951
|
sb4 errcode;
|
849
|
-
OCIErrorGet(
|
952
|
+
OCIErrorGet(errhp, 1, NULL, &errcode, NULL, 0, OCI_HTYPE_ERROR);
|
850
953
|
if (errcode == 22065) {
|
851
954
|
/* OCI-22065: number to text translation for the given format causes overflow */
|
852
955
|
if (NIL_P(fmt)) /* implicit conversion */
|
853
956
|
return rb_usascii_str_new_cstr("overflow");
|
854
957
|
}
|
855
|
-
oci8_raise(
|
958
|
+
oci8_raise(errhp, rv, NULL);
|
856
959
|
}
|
857
960
|
return rb_usascii_str_new(buf, buf_size);
|
858
961
|
}
|
@@ -876,10 +979,11 @@ static VALUE onum_to_s(VALUE self)
|
|
876
979
|
*/
|
877
980
|
static VALUE onum_to_i(VALUE self)
|
878
981
|
{
|
982
|
+
OCIError *errhp = oci8_errhp;
|
879
983
|
OCINumber num;
|
880
984
|
|
881
|
-
oci_lc(OCINumberTrunc(
|
882
|
-
return oci8_make_integer(&num);
|
985
|
+
oci_lc(OCINumberTrunc(errhp, _NUMBER(self), 0, &num));
|
986
|
+
return oci8_make_integer(&num, errhp);
|
883
987
|
}
|
884
988
|
|
885
989
|
/*
|
@@ -891,9 +995,10 @@ static VALUE onum_to_i(VALUE self)
|
|
891
995
|
*/
|
892
996
|
static VALUE onum_to_f(VALUE self)
|
893
997
|
{
|
998
|
+
OCIError *errhp = oci8_errhp;
|
894
999
|
double dbl;
|
895
1000
|
|
896
|
-
oci_lc(OCINumberToReal(
|
1001
|
+
oci_lc(OCINumberToReal(errhp, _NUMBER(self), sizeof(dbl), &dbl));
|
897
1002
|
return rb_float_new(dbl);
|
898
1003
|
}
|
899
1004
|
|
@@ -916,9 +1021,10 @@ static VALUE onum_to_onum(VALUE self)
|
|
916
1021
|
*/
|
917
1022
|
static VALUE onum_zero_p(VALUE self)
|
918
1023
|
{
|
1024
|
+
OCIError *errhp = oci8_errhp;
|
919
1025
|
boolean result;
|
920
1026
|
|
921
|
-
oci_lc(OCINumberIsZero(
|
1027
|
+
oci_lc(OCINumberIsZero(errhp, _NUMBER(self), &result));
|
922
1028
|
return result ? Qtrue : Qfalse;
|
923
1029
|
}
|
924
1030
|
|
@@ -931,10 +1037,11 @@ static VALUE onum_zero_p(VALUE self)
|
|
931
1037
|
*/
|
932
1038
|
static VALUE onum_abs(VALUE self)
|
933
1039
|
{
|
1040
|
+
OCIError *errhp = oci8_errhp;
|
934
1041
|
OCINumber result;
|
935
1042
|
|
936
|
-
oci_lc(OCINumberAbs(
|
937
|
-
return oci8_make_ocinumber(&result);
|
1043
|
+
oci_lc(OCINumberAbs(errhp, _NUMBER(self), &result));
|
1044
|
+
return oci8_make_ocinumber(&result, errhp);
|
938
1045
|
}
|
939
1046
|
|
940
1047
|
/*
|
@@ -946,10 +1053,11 @@ static VALUE onum_abs(VALUE self)
|
|
946
1053
|
*/
|
947
1054
|
static VALUE onum_shift(VALUE self, VALUE exp)
|
948
1055
|
{
|
1056
|
+
OCIError *errhp = oci8_errhp;
|
949
1057
|
OCINumber result;
|
950
1058
|
|
951
|
-
oci_lc(OCINumberShift(
|
952
|
-
return oci8_make_ocinumber(&result);
|
1059
|
+
oci_lc(OCINumberShift(errhp, _NUMBER(self), NUM2INT(exp), &result));
|
1060
|
+
return oci8_make_ocinumber(&result, errhp);
|
953
1061
|
}
|
954
1062
|
|
955
1063
|
static VALUE onum_hash(VALUE self)
|
@@ -1018,7 +1126,7 @@ onum_s_load(VALUE klass, VALUE str)
|
|
1018
1126
|
}
|
1019
1127
|
memset(&num, 0, sizeof(num));
|
1020
1128
|
memcpy(&num, c, size);
|
1021
|
-
return oci8_make_ocinumber(&num);
|
1129
|
+
return oci8_make_ocinumber(&num, oci8_errhp);
|
1022
1130
|
}
|
1023
1131
|
|
1024
1132
|
/*
|
@@ -1026,25 +1134,26 @@ onum_s_load(VALUE klass, VALUE str)
|
|
1026
1134
|
*/
|
1027
1135
|
static VALUE bind_ocinumber_get(oci8_bind_t *obind, void *data, void *null_struct)
|
1028
1136
|
{
|
1029
|
-
return oci8_make_ocinumber((OCINumber*)data);
|
1137
|
+
return oci8_make_ocinumber((OCINumber*)data, oci8_errhp);
|
1030
1138
|
}
|
1031
1139
|
|
1032
1140
|
static VALUE bind_integer_get(oci8_bind_t *obind, void *data, void *null_struct)
|
1033
1141
|
{
|
1034
|
-
return oci8_make_integer((OCINumber*)data);
|
1142
|
+
return oci8_make_integer((OCINumber*)data, oci8_errhp);
|
1035
1143
|
}
|
1036
1144
|
|
1037
1145
|
static void bind_ocinumber_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
|
1038
1146
|
{
|
1039
|
-
set_oci_number_from_num((OCINumber*)data, val, 1);
|
1147
|
+
set_oci_number_from_num((OCINumber*)data, val, 1, oci8_errhp);
|
1040
1148
|
}
|
1041
1149
|
|
1042
1150
|
static void bind_integer_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
|
1043
1151
|
{
|
1152
|
+
OCIError *errhp = oci8_errhp;
|
1044
1153
|
OCINumber num;
|
1045
1154
|
|
1046
|
-
set_oci_number_from_num(&num, val, 1);
|
1047
|
-
oci_lc(OCINumberTrunc(
|
1155
|
+
set_oci_number_from_num(&num, val, 1, errhp);
|
1156
|
+
oci_lc(OCINumberTrunc(errhp, &num, 0, (OCINumber*)data));
|
1048
1157
|
}
|
1049
1158
|
|
1050
1159
|
static void bind_ocinumber_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
|
@@ -1055,10 +1164,11 @@ static void bind_ocinumber_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE
|
|
1055
1164
|
|
1056
1165
|
static void bind_ocinumber_init_elem(oci8_bind_t *obind, VALUE svc)
|
1057
1166
|
{
|
1167
|
+
OCIError *errhp = oci8_errhp;
|
1058
1168
|
ub4 idx = 0;
|
1059
1169
|
|
1060
1170
|
do {
|
1061
|
-
OCINumberSetZero(
|
1171
|
+
OCINumberSetZero(errhp, (OCINumber*)obind->valuep + idx);
|
1062
1172
|
} while (++idx < obind->maxar_sz);
|
1063
1173
|
}
|
1064
1174
|
|
@@ -1095,7 +1205,7 @@ static const oci8_bind_class_t bind_integer_class = {
|
|
1095
1205
|
};
|
1096
1206
|
|
1097
1207
|
void
|
1098
|
-
Init_oci_number(VALUE cOCI8)
|
1208
|
+
Init_oci_number(VALUE cOCI8, OCIError *errhp)
|
1099
1209
|
{
|
1100
1210
|
VALUE mMath;
|
1101
1211
|
OCINumber num1, num2;
|
@@ -1104,6 +1214,10 @@ Init_oci_number(VALUE cOCI8)
|
|
1104
1214
|
|
1105
1215
|
id_power = rb_intern("**");
|
1106
1216
|
id_cmp = rb_intern("<=>");
|
1217
|
+
id_finite_p = rb_intern("finite?");
|
1218
|
+
id_split = rb_intern("split");
|
1219
|
+
id_numerator = rb_intern("numerator");
|
1220
|
+
id_denominator = rb_intern("denominator");
|
1107
1221
|
|
1108
1222
|
cOCINumber = rb_define_class("OraNumber", rb_cNumeric);
|
1109
1223
|
mMath = rb_define_module_under(cOCI8, "Math");
|
@@ -1111,27 +1225,27 @@ Init_oci_number(VALUE cOCI8)
|
|
1111
1225
|
/* constants for internal use. */
|
1112
1226
|
/* set const_p1 */
|
1113
1227
|
sl = 1;
|
1114
|
-
OCINumberFromInt(
|
1228
|
+
OCINumberFromInt(errhp, &sl, sizeof(sl), OCI_NUMBER_SIGNED, &const_p1);
|
1115
1229
|
/* set const_p10 */
|
1116
1230
|
sl = 10;
|
1117
|
-
OCINumberFromInt(
|
1231
|
+
OCINumberFromInt(errhp, &sl, sizeof(sl), OCI_NUMBER_SIGNED, &const_p10);
|
1118
1232
|
/* set const_m1 */
|
1119
1233
|
sl = -1;
|
1120
|
-
OCINumberFromInt(
|
1234
|
+
OCINumberFromInt(errhp, &sl, sizeof(sl), OCI_NUMBER_SIGNED, &const_m1);
|
1121
1235
|
/* set const_PI2 */
|
1122
1236
|
sl = 2;
|
1123
|
-
OCINumberSetPi(
|
1124
|
-
OCINumberFromInt(
|
1125
|
-
OCINumberDiv(
|
1237
|
+
OCINumberSetPi(errhp, &num1);
|
1238
|
+
OCINumberFromInt(errhp, &sl, sizeof(sl), OCI_NUMBER_SIGNED, &num2);
|
1239
|
+
OCINumberDiv(errhp, &num1 /* PI */, &num2 /* 2 */, &const_PI2);
|
1126
1240
|
/* set const_mPI2 */
|
1127
|
-
OCINumberNeg(
|
1241
|
+
OCINumberNeg(errhp, &const_PI2 /* PI/2 */, &const_mPI2);
|
1128
1242
|
/* set const_shreshold */
|
1129
|
-
OCINumberFromText(
|
1243
|
+
OCINumberFromText(errhp, SHRESHOLD_VAL, SHRESHOLD_VAL_LEN, SHRESHOLD_FMT, SHRESHOLD_FMT_LEN,
|
1130
1244
|
NULL, 0, &const_shreshold);
|
1131
1245
|
|
1132
1246
|
/* PI */
|
1133
|
-
OCINumberSetPi(
|
1134
|
-
obj_PI = oci8_make_ocinumber(&num1);
|
1247
|
+
OCINumberSetPi(errhp, &num1);
|
1248
|
+
obj_PI = oci8_make_ocinumber(&num1, errhp);
|
1135
1249
|
|
1136
1250
|
/* The ratio of the circumference of a circle to its diameter. */
|
1137
1251
|
rb_define_const(mMath, "PI", obj_PI);
|