Class: OraNumber
- Includes:
- Comparable
- Defined in:
- ext/oci8/ocinumber.c,
lib/oci8/oci8.rb,
ext/oci8/ocinumber.c
Overview
OraNumber is a ruby representation of Oracle NUMBER data type. without precision and scale designators.
Class Method Summary collapse
-
._load(bytes) ⇒ OraNumber
Restores a byte stream serialized by #_dump.
Instance Method Summary collapse
-
#%(other) ⇒ OraNumber
Returns the modulo after division of self by other.
-
#*(other) ⇒ Numeric
Returns the product of self and other.
-
#**(other) ⇒ OraNumber
Raises self to the power of other.
-
#+(other) ⇒ Numeric
Returns the sum of self and other.
-
#-(other) ⇒ Numeric
Returns the difference of self and other.
-
#-@ ⇒ OraNumber
Returns a negated value of self.
-
#/(other) ⇒ Numeric
Returns the result of dividing self by other.
-
#<=>(other) ⇒ -1, 0 or +1
Returns -1, 0, or +1 depending on whether self is less than, equal to, or greater than other.
-
#_dump ⇒ String
Serializes self.
-
#abs ⇒ OraNumber
Returns the absolute value of self.
-
#ceil ⇒ Integer
Returns the smallest
Integergreater than or equal to self. -
#dump ⇒ String
Returns internal representation whose format is same with the return value of Oracle SQL function DUMP.
-
#floor ⇒ Integer
Returns the largest
Integerless than or equal to self. -
#has_decimal_part? ⇒ Boolean
Returns
trueif self has a decimal part. -
#initialize(expr = nil, fmt = nil, nlsparam = nil) ⇒ Object
constructor
Creates a value of OraNumber from expr.
-
#initialize_copy(obj) ⇒ Object
Replaces self with obj.
- #round(*args) ⇒ Object
-
#round_prec(digits) ⇒ OraNumber
Rounds self to a specified number of decimal digits.
-
#shift(ndigits) ⇒ OraNumber
Returns self shifted by ndigits This method is available on Oracle 8.1 client or upper.
-
#onum.to_char(fmt = nil, nlsparam = nil) ⇒ String
Returns a string containing a representation of self.
-
#to_d ⇒ BigDecimal
Returns self as a
BigDecimal. -
#to_f ⇒ Float
Converts self to
Float. -
#to_i ⇒ Integer
Returns self truncated to an
Integer. -
#to_onum ⇒ OraNumber
Returns self.
-
#to_r ⇒ Rational
Returns self as a
Rational. -
#to_s ⇒ String
Returns a string containing a representation of self.
-
#truncate(decplace = 0) ⇒ OraNumber
Truncates self to a specified decimal place decplace.
-
#zero? ⇒ Boolean
Returns
trueif self is zero.
Constructor Details
#initialize(expr = nil, fmt = nil, nlsparam = nil) ⇒ Object
797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 |
# File 'ext/oci8/ocinumber.c', line 797 static VALUE onum_initialize(int argc, VALUE *argv, VALUE self) { OCIError *errhp = oci8_errhp; VALUE val; VALUE fmt; VALUE nls_params; if (rb_scan_args(argc, argv, "03", &val /* 0 */, &fmt /* nil */, &nls_params /* nil */) == 0) { OCINumberSetZero(errhp, _NUMBER(self)); } else if (RTEST(rb_obj_is_kind_of(val, rb_cNumeric))) { set_oci_number_from_num(_NUMBER(self), val, 1, errhp); } else { set_oci_number_from_str(_NUMBER(self), val, fmt, nls_params, errhp); } return Qnil; } |
Class Method Details
._load(bytes) ⇒ OraNumber
1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 |
# File 'ext/oci8/ocinumber.c', line 1628 static VALUE onum_s_load(VALUE klass, VALUE str) { unsigned char *c; size_t size; OCINumber num; Check_Type(str, T_STRING); c = RSTRING_ORATEXT(str); size = RSTRING_LEN(str); if (size == 0 || size != c[0] + 1u || size > sizeof(num)) { rb_raise(rb_eTypeError, "marshaled OCI::Number format differ"); } memset(&num, 0, sizeof(num)); memcpy(&num, c, size); return oci8_make_ocinumber(&num, oci8_errhp); } |
Instance Method Details
#%(other) ⇒ OraNumber
1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077 1078 1079 1080 1081 1082 |
# File 'ext/oci8/ocinumber.c', line 1065 static VALUE onum_mod(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; OCINumber r; boolean is_zero; /* change to OCINumber */ if (!set_oci_number_from_num(&n, rhs, 0, errhp)) return rb_num_coerce_bin(lhs, rhs, '%'); /* check whether argument is not zero. */ chkerr(OCINumberIsZero(errhp, &n, &is_zero)); if (is_zero) rb_num_zerodiv(); /* modulo */ chkerr(OCINumberMod(errhp, _NUMBER(lhs), &n, &r)); return oci8_make_ocinumber(&r, errhp); } |
#*(other) ⇒ Numeric
976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 |
# File 'ext/oci8/ocinumber.c', line 976 static VALUE onum_mul(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; OCINumber r; switch (rboci8_type(rhs)) { case T_FIXNUM: case T_BIGNUM: if (set_oci_number_from_num(&n, rhs, 0, errhp)) { chkerr(OCINumberMul(errhp, _NUMBER(lhs), &n, &r)); return oci8_make_ocinumber(&r, errhp); } break; case RBOCI8_T_ORANUMBER: chkerr(OCINumberMul(errhp, _NUMBER(lhs), _NUMBER(rhs), &r)); return oci8_make_ocinumber(&r, errhp); case T_FLOAT: return rb_funcall(onum_to_f(lhs), oci8_id_mul_op, 1, rhs); case T_RATIONAL: return rb_funcall(onum_to_r(lhs), oci8_id_mul_op, 1, rhs); case RBOCI8_T_BIGDECIMAL: return rb_funcall(onum_to_d(lhs), oci8_id_mul_op, 1, rhs); } return rb_num_coerce_bin(lhs, rhs, oci8_id_mul_op); } |
#**(other) ⇒ OraNumber
1096 1097 1098 1099 1100 1101 1102 1103 1104 1105 1106 1107 1108 1109 1110 1111 |
# File 'ext/oci8/ocinumber.c', line 1096 static VALUE onum_power(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; OCINumber r; if (FIXNUM_P(rhs)) { chkerr(OCINumberIntPower(errhp, _NUMBER(lhs), FIX2INT(rhs), &r)); } else { /* change to OCINumber */ if (!set_oci_number_from_num(&n, rhs, 0, errhp)) return rb_num_coerce_bin(lhs, rhs, id_power); chkerr(OCINumberPower(errhp, _NUMBER(lhs), &n, &r)); } return oci8_make_ocinumber(&r, errhp); } |
#+(other) ⇒ Numeric
894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 |
# File 'ext/oci8/ocinumber.c', line 894 static VALUE onum_add(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; OCINumber r; switch (rboci8_type(rhs)) { case T_FIXNUM: case T_BIGNUM: if (set_oci_number_from_num(&n, rhs, 0, errhp)) { chkerr(OCINumberAdd(errhp, _NUMBER(lhs), &n, &r)); return oci8_make_ocinumber(&r, errhp); } break; case RBOCI8_T_ORANUMBER: chkerr(OCINumberAdd(errhp, _NUMBER(lhs), _NUMBER(rhs), &r)); return oci8_make_ocinumber(&r, errhp); case T_FLOAT: return rb_funcall(onum_to_f(lhs), oci8_id_add_op, 1, rhs); case T_RATIONAL: return rb_funcall(onum_to_r(lhs), oci8_id_add_op, 1, rhs); case RBOCI8_T_BIGDECIMAL: return rb_funcall(onum_to_d(lhs), oci8_id_add_op, 1, rhs); } return rb_num_coerce_bin(lhs, rhs, oci8_id_add_op); } |
#-(other) ⇒ Numeric
935 936 937 938 939 940 941 942 943 944 945 946 947 948 949 950 951 952 953 954 955 956 957 958 959 960 |
# File 'ext/oci8/ocinumber.c', line 935 static VALUE onum_sub(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; OCINumber r; switch (rboci8_type(rhs)) { case T_FIXNUM: case T_BIGNUM: if (set_oci_number_from_num(&n, rhs, 0, errhp)) { chkerr(OCINumberSub(errhp, _NUMBER(lhs), &n, &r)); return oci8_make_ocinumber(&r, errhp); } break; case RBOCI8_T_ORANUMBER: chkerr(OCINumberSub(errhp, _NUMBER(lhs), _NUMBER(rhs), &r)); return oci8_make_ocinumber(&r, errhp); case T_FLOAT: return rb_funcall(onum_to_f(lhs), oci8_id_sub_op, 1, rhs); case T_RATIONAL: return rb_funcall(onum_to_r(lhs), oci8_id_sub_op, 1, rhs); case RBOCI8_T_BIGDECIMAL: return rb_funcall(onum_to_d(lhs), oci8_id_sub_op, 1, rhs); } return rb_num_coerce_bin(lhs, rhs, oci8_id_sub_op); } |
#-@ ⇒ OraNumber
Returns a negated value of self
871 872 873 874 875 876 877 878 |
# File 'ext/oci8/ocinumber.c', line 871 static VALUE onum_neg(VALUE self) { OCIError *errhp = oci8_errhp; OCINumber r; chkerr(OCINumberNeg(errhp, _NUMBER(self), &r)); return oci8_make_ocinumber(&r, errhp); } |
#/(other) ⇒ Numeric
1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 |
# File 'ext/oci8/ocinumber.c', line 1017 static VALUE onum_div(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; OCINumber r; boolean is_zero; switch (rboci8_type(rhs)) { case T_FIXNUM: if (rhs == INT2FIX(0)) { rb_num_zerodiv(); } case T_BIGNUM: if (set_oci_number_from_num(&n, rhs, 0, errhp)) { chkerr(OCINumberDiv(errhp, _NUMBER(lhs), &n, &r)); return oci8_make_ocinumber(&r, errhp); } break; case RBOCI8_T_ORANUMBER: chkerr(OCINumberIsZero(errhp, _NUMBER(rhs), &is_zero)); if (is_zero) { rb_num_zerodiv(); } chkerr(OCINumberDiv(errhp, _NUMBER(lhs), _NUMBER(rhs), &r)); return oci8_make_ocinumber(&r, errhp); case T_FLOAT: return rb_funcall(onum_to_f(lhs), oci8_id_div_op, 1, rhs); case T_RATIONAL: return rb_funcall(onum_to_r(lhs), oci8_id_div_op, 1, rhs); case RBOCI8_T_BIGDECIMAL: return rb_funcall(onum_to_d(lhs), oci8_id_div_op, 1, rhs); } return rb_num_coerce_bin(lhs, rhs, oci8_id_div_op); } |
#<=>(other) ⇒ -1, 0 or +1
1128 1129 1130 1131 1132 1133 1134 1135 1136 1137 1138 1139 1140 1141 1142 1143 1144 1145 1146 |
# File 'ext/oci8/ocinumber.c', line 1128 static VALUE onum_cmp(VALUE lhs, VALUE rhs) { OCIError *errhp = oci8_errhp; OCINumber n; sword r; /* change to OCINumber */ if (!set_oci_number_from_num(&n, rhs, 0, errhp)) return rb_num_coerce_cmp(lhs, rhs, id_cmp); /* compare */ chkerr(OCINumberCmp(errhp, _NUMBER(lhs), &n, &r)); if (r > 0) { return INT2FIX(1); } else if (r == 0) { return INT2FIX(0); } else { return INT2FIX(-1); } } |
#_dump ⇒ String
1608 1609 1610 1611 1612 1613 1614 1615 1616 |
# File 'ext/oci8/ocinumber.c', line 1608 static VALUE onum__dump(int argc, VALUE *argv, VALUE self) { char *c = RTYPEDDATA_DATA(self); int size = c[0] + 1; VALUE dummy; rb_scan_args(argc, argv, "01", &dummy); return rb_str_new(c, size); } |
#abs ⇒ OraNumber
1512 1513 1514 1515 1516 1517 1518 1519 |
# File 'ext/oci8/ocinumber.c', line 1512 static VALUE onum_abs(VALUE self) { OCIError *errhp = oci8_errhp; OCINumber result; chkerr(OCINumberAbs(errhp, _NUMBER(self), &result)); return oci8_make_ocinumber(&result, errhp); } |
#ceil ⇒ Integer
1181 1182 1183 1184 1185 1186 1187 1188 |
# File 'ext/oci8/ocinumber.c', line 1181 static VALUE onum_ceil(VALUE self) { OCIError *errhp = oci8_errhp; OCINumber r; chkerr(OCINumberCeil(errhp, _NUMBER(self), &r)); return oci8_make_integer(&r, errhp); } |
#dump ⇒ String
1557 1558 1559 1560 1561 1562 |
# File 'ext/oci8/ocinumber.c', line 1557 static VALUE onum_dump(VALUE self) { char buf[ORANUMBER_DUMP_BUF_SIZ]; int rv = oranumber_dump(_NUMBER(self), buf); return rb_usascii_str_new(buf, rv); } |
#floor ⇒ Integer
1160 1161 1162 1163 1164 1165 1166 1167 |
# File 'ext/oci8/ocinumber.c', line 1160 static VALUE onum_floor(VALUE self) { OCIError *errhp = oci8_errhp; OCINumber r; chkerr(OCINumberFloor(errhp, _NUMBER(self), &r)); return oci8_make_integer(&r, errhp); } |
#has_decimal_part? ⇒ Boolean
1469 1470 1471 1472 1473 1474 1475 1476 |
# File 'ext/oci8/ocinumber.c', line 1469 static VALUE onum_has_decimal_part_p(VALUE self) { OCIError *errhp = oci8_errhp; boolean result; chkerr(OCINumberIsInt(errhp, _NUMBER(self), &result)); return result ? Qfalse : Qtrue; } |
#initialize_copy(obj) ⇒ Object
824 825 826 827 828 829 830 831 832 |
# File 'ext/oci8/ocinumber.c', line 824 static VALUE onum_initialize_copy(VALUE lhs, VALUE rhs) { if (!RTEST(rb_obj_is_instance_of(rhs, CLASS_OF(lhs)))) { rb_raise(rb_eTypeError, "invalid type: expected %s but %s", rb_class2name(CLASS_OF(lhs)), rb_class2name(CLASS_OF(rhs))); } chkerr(OCINumberAssign(oci8_errhp, _NUMBER(rhs), _NUMBER(lhs))); return lhs; } |
#round ⇒ Integer #round(decplace) ⇒ OraNumber
1216 1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 |
# File 'ext/oci8/ocinumber.c', line 1216 static VALUE onum_round(int argc, VALUE *argv, VALUE self) { OCIError *errhp = oci8_errhp; VALUE decplace; OCINumber r; rb_scan_args(argc, argv, "01", &decplace /* 0 */); chkerr(OCINumberRound(errhp, _NUMBER(self), NIL_P(decplace) ? 0 : NUM2INT(decplace), &r)); if (argc == 0) { return oci8_make_integer(&r, errhp); } else { return oci8_make_ocinumber(&r, errhp); } } |
#round_prec(digits) ⇒ OraNumber
1276 1277 1278 1279 1280 1281 1282 1283 |
# File 'ext/oci8/ocinumber.c', line 1276 static VALUE onum_round_prec(VALUE self, VALUE ndigs) { OCIError *errhp = oci8_errhp; OCINumber r; chkerr(OCINumberPrec(errhp, _NUMBER(self), NUM2INT(ndigs), &r)); return oci8_make_ocinumber(&r, errhp); } |
#shift(ndigits) ⇒ OraNumber
1534 1535 1536 1537 1538 1539 1540 1541 |
# File 'ext/oci8/ocinumber.c', line 1534 static VALUE onum_shift(VALUE self, VALUE exp) { OCIError *errhp = oci8_errhp; OCINumber result; chkerr(OCINumberShift(errhp, _NUMBER(self), NUM2INT(exp), &result)); return oci8_make_ocinumber(&result, errhp); } |
#onum.to_char(fmt = nil, nlsparam = nil) ⇒ String
1301 1302 1303 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339 1340 1341 1342 1343 1344 1345 1346 1347 1348 |
# File 'ext/oci8/ocinumber.c', line 1301 static VALUE onum_to_char(int argc, VALUE *argv, VALUE self) { OCIError *errhp = oci8_errhp; VALUE fmt; VALUE nls_params; char buf[512]; ub4 buf_size = sizeof(buf); oratext *fmt_ptr; oratext *nls_params_ptr; ub4 fmt_len; ub4 nls_params_len; sword rv; rb_scan_args(argc, argv, "02", &fmt /* nil */, &nls_params /* nil */); if (NIL_P(fmt)) { rv = oranumber_to_str(_NUMBER(self), buf, sizeof(buf)); if (rv > 0) { return rb_usascii_str_new(buf, rv); } oranumber_dump(_NUMBER(self), buf); rb_raise(eOCIException, "Invalid internal number format: %s", buf); } StringValue(fmt); fmt_ptr = RSTRING_ORATEXT(fmt); fmt_len = RSTRING_LEN(fmt); if (NIL_P(nls_params)) { nls_params_ptr = NULL; nls_params_len = 0; } else { StringValue(nls_params); nls_params_ptr = RSTRING_ORATEXT(nls_params); nls_params_len = RSTRING_LEN(nls_params); } rv = OCINumberToText(errhp, _NUMBER(self), fmt_ptr, fmt_len, nls_params_ptr, nls_params_len, &buf_size, TO_ORATEXT(buf)); if (rv == OCI_ERROR) { sb4 errcode; OCIErrorGet(errhp, 1, NULL, &errcode, NULL, 0, OCI_HTYPE_ERROR); if (errcode == 22065) { /* OCI-22065: number to text translation for the given format causes overflow */ if (NIL_P(fmt)) /* implicit conversion */ return rb_usascii_str_new_cstr("overflow"); } chkerr(rv); } return rb_usascii_str_new(buf, buf_size); } |
#to_d ⇒ BigDecimal
1437 1438 1439 1440 |
# File 'ext/oci8/ocinumber.c', line 1437 static VALUE onum_to_d(VALUE self) { return onum_to_d_real(_NUMBER(self), oci8_errhp); } |
#to_f ⇒ Float
Converts self to Float.
When OCI8.properties [:float_conversion_type] is :ruby, self is converted by self.to_s.to_f. When it is :oracle, self is converted by the Oracle OCI function OCINumberToReal().
1390 1391 1392 1393 |
# File 'ext/oci8/ocinumber.c', line 1390 static VALUE onum_to_f(VALUE self) { return rb_float_new(oci8_onum_to_dbl(_NUMBER(self), oci8_errhp)); } |
#to_i ⇒ Integer
1371 1372 1373 1374 1375 1376 1377 1378 |
# File 'ext/oci8/ocinumber.c', line 1371 static VALUE onum_to_i(VALUE self) { OCIError *errhp = oci8_errhp; OCINumber num; chkerr(OCINumberTrunc(errhp, _NUMBER(self), 0, &num)); return oci8_make_integer(&num, errhp); } |
#to_onum ⇒ OraNumber
1485 1486 1487 1488 |
# File 'ext/oci8/ocinumber.c', line 1485 static VALUE onum_to_onum(VALUE self) { return self; } |
#to_r ⇒ Rational
1402 1403 1404 1405 1406 1407 1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 |
# File 'ext/oci8/ocinumber.c', line 1402 static VALUE onum_to_r(VALUE self) { VALUE x, y; int nshift = 0; OCINumber onum[2]; int current = 0; boolean is_int; chkerr(OCINumberAssign(oci8_errhp, _NUMBER(self), &onum[0])); for (;;) { chkerr(OCINumberIsInt(oci8_errhp, &onum[current], &is_int)); if (is_int) { break; } nshift++; chkerr(OCINumberShift(oci8_errhp, &onum[current], 1, &onum[1 - current])); current = 1 - current; } x = oci8_make_integer(&onum[current], oci8_errhp); if (nshift == 0) { y = INT2FIX(1); } else { y = rb_funcall(INT2FIX(10), rb_intern("**"), 1, INT2FIX(nshift)); } return rb_Rational(x, y); } |
#to_s ⇒ String
1359 1360 1361 1362 |
# File 'ext/oci8/ocinumber.c', line 1359 static VALUE onum_to_s(VALUE self) { return onum_to_char(0, NULL, self); } |
#truncate(decplace = 0) ⇒ OraNumber
1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 |
# File 'ext/oci8/ocinumber.c', line 1251 static VALUE onum_trunc(int argc, VALUE *argv, VALUE self) { OCIError *errhp = oci8_errhp; VALUE decplace; OCINumber r; rb_scan_args(argc, argv, "01", &decplace /* 0 */); chkerr(OCINumberTrunc(errhp, _NUMBER(self), NIL_P(decplace) ? 0 : NUM2INT(decplace), &r)); return oci8_make_ocinumber(&r, errhp); } |
#zero? ⇒ Boolean
1496 1497 1498 1499 1500 1501 1502 1503 |
# File 'ext/oci8/ocinumber.c', line 1496 static VALUE onum_zero_p(VALUE self) { OCIError *errhp = oci8_errhp; boolean result; chkerr(OCINumberIsZero(errhp, _NUMBER(self), &result)); return result ? Qtrue : Qfalse; } |