ruby-oci8 2.0.3 → 2.0.4
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +80 -0
- data/NEWS +56 -1
- data/VERSION +1 -1
- data/dist-files +3 -0
- data/ext/oci8/.document +1 -0
- data/ext/oci8/apiwrap.yml +17 -0
- data/ext/oci8/attr.c +1 -1
- data/ext/oci8/bind.c +1 -1
- data/ext/oci8/error.c +91 -2
- data/ext/oci8/extconf.rb +3 -2
- data/ext/oci8/object.c +20 -13
- data/ext/oci8/oci8.c +25 -0
- data/ext/oci8/oci8.h +12 -0
- data/ext/oci8/oci8lib.c +6 -72
- data/ext/oci8/ocidatetime.c +1 -1
- data/ext/oci8/ocihandle.c +702 -0
- data/ext/oci8/ocinumber.c +67 -71
- data/ext/oci8/oradate.c +1 -1
- data/ext/oci8/oranumber_util.c +315 -0
- data/ext/oci8/oranumber_util.h +24 -0
- data/ext/oci8/stmt.c +11 -9
- data/lib/oci8/datetime.rb +5 -1
- data/test/test_oranumber.rb +144 -1
- metadata +23 -7
@@ -0,0 +1,24 @@
|
|
1
|
+
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
* oranumber_util.h - part of ruby-oci8
|
4
|
+
*
|
5
|
+
* Copyright (C) 2010 KUBO Takehiro <kubo@jiubao.org>
|
6
|
+
*/
|
7
|
+
#ifndef ORANUMBER_UTIL_H
|
8
|
+
#define ORANUMBER_UTIL_H 1
|
9
|
+
#include <orl.h>
|
10
|
+
|
11
|
+
#define ORANUMBER_INVALID_INTERNAL_FORMAT -1
|
12
|
+
#define ORANUMBER_TOO_SHORT_BUFFER -2
|
13
|
+
|
14
|
+
#define ORANUMBER_SUCCESS 0
|
15
|
+
#define ORANUMBER_INVALID_NUMBER 1722
|
16
|
+
#define ORANUMBER_NUMERIC_OVERFLOW 1426
|
17
|
+
|
18
|
+
int oranumber_to_str(const OCINumber *on, char *buf, int buflen);
|
19
|
+
int oranumber_from_str(OCINumber *on, const char *buf, int buflen);
|
20
|
+
|
21
|
+
#define ORANUMBER_DUMP_BUF_SIZ 99
|
22
|
+
int oranumber_dump(const OCINumber *on, char *buf);
|
23
|
+
|
24
|
+
#endif
|
data/ext/oci8/stmt.c
CHANGED
@@ -342,16 +342,18 @@ static VALUE oci8_stmt_do_fetch(oci8_stmt_t *stmt, oci8_svcctx_t *svcctx)
|
|
342
342
|
oci8_bind_t *obind;
|
343
343
|
const oci8_bind_class_t *bind_class;
|
344
344
|
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
bind_class->pre_fetch_hook
|
345
|
+
if (stmt->base.children != NULL) {
|
346
|
+
obind = (oci8_bind_t *)stmt->base.children;
|
347
|
+
do {
|
348
|
+
if (obind->base.type == OCI_HTYPE_DEFINE) {
|
349
|
+
bind_class = (const oci8_bind_class_t *)obind->base.klass;
|
350
|
+
if (bind_class->pre_fetch_hook != NULL) {
|
351
|
+
bind_class->pre_fetch_hook(obind, stmt->svc);
|
352
|
+
}
|
351
353
|
}
|
352
|
-
|
353
|
-
obind
|
354
|
-
}
|
354
|
+
obind = (oci8_bind_t *)obind->base.next;
|
355
|
+
} while (obind != (oci8_bind_t*)stmt->base.children);
|
356
|
+
}
|
355
357
|
rv = OCIStmtFetch_nb(svcctx, stmt->base.hp.stmt, oci8_errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
|
356
358
|
#ifdef USE_DYNAMIC_FETCH
|
357
359
|
while (rv == OCI_NEED_DATA) {
|
data/lib/oci8/datetime.rb
CHANGED
@@ -92,9 +92,13 @@ class OCI8
|
|
92
92
|
end
|
93
93
|
return [year, month, day, hour, minute, sec] unless full
|
94
94
|
|
95
|
-
#
|
95
|
+
# fractional second
|
96
96
|
if val.respond_to? :sec_fraction
|
97
97
|
fsec = (val.sec_fraction * @@datetime_fsec_base).to_i
|
98
|
+
elsif val.respond_to? :nsec
|
99
|
+
fsec = val.nsec
|
100
|
+
elsif val.respond_to? :usec
|
101
|
+
fsec = val.usec * 1000
|
98
102
|
else
|
99
103
|
fsec = 0
|
100
104
|
end
|
data/test/test_oranumber.rb
CHANGED
@@ -473,6 +473,45 @@ class TestOraNumber < Test::Unit::TestCase
|
|
473
473
|
actual_val = OraNumber.new(x).to_s
|
474
474
|
assert_equal(expected_val, actual_val, x)
|
475
475
|
end
|
476
|
+
|
477
|
+
conn = get_oci8_connection()
|
478
|
+
begin
|
479
|
+
cursor = conn.parse('select to_number(:1) from dual')
|
480
|
+
cursor.define(1, OraNumber)
|
481
|
+
cursor.bind_param(1, nil, String, 200)
|
482
|
+
[
|
483
|
+
"100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", # 1E125
|
484
|
+
"10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", # 1E124
|
485
|
+
"234567890234567890234567890234567890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
486
|
+
"23456789023456789023456789023456789000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
487
|
+
"2345678902345678902345678902345678900",
|
488
|
+
"234567890234567890234567890234567890",
|
489
|
+
"23456789023456789023456789023456789",
|
490
|
+
"2345678902345678902345678902345678.9",
|
491
|
+
"234567890234567890234567890234567.89",
|
492
|
+
"23.456789023456789023456789023456789",
|
493
|
+
"2.3456789023456789023456789023456789",
|
494
|
+
"0.23456789023456789023456789023456789", # 2.34..snip..E-1
|
495
|
+
"0.023456789023456789023456789023456789", # 2.34..snip..E-2
|
496
|
+
"0.0023456789023456789023456789023456789", # 2.34..snip..E-3
|
497
|
+
"0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023456789023456789023456789023456789", # 2.34..snip..E-130
|
498
|
+
"0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", # 1E-129
|
499
|
+
"0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", # 1E-130
|
500
|
+
].each do |str|
|
501
|
+
cursor[1] = str
|
502
|
+
cursor.exec
|
503
|
+
onum = cursor.fetch[0]
|
504
|
+
assert_equal(str, onum.to_s, "test data: " + str)
|
505
|
+
|
506
|
+
str = '-' + str
|
507
|
+
cursor[1] = str
|
508
|
+
cursor.exec
|
509
|
+
onum = cursor.fetch[0]
|
510
|
+
assert_equal(str, onum.to_s, "test data: " + str)
|
511
|
+
end
|
512
|
+
ensure
|
513
|
+
conn.logoff
|
514
|
+
end
|
476
515
|
end
|
477
516
|
|
478
517
|
# onum.truncate -> integer
|
@@ -488,6 +527,109 @@ class TestOraNumber < Test::Unit::TestCase
|
|
488
527
|
end
|
489
528
|
end
|
490
529
|
|
530
|
+
def test_new_from_string
|
531
|
+
conn = get_oci8_connection()
|
532
|
+
begin
|
533
|
+
cursor = conn.parse('select to_number(:1) from dual')
|
534
|
+
cursor.define(1, OraNumber)
|
535
|
+
cursor.bind_param(1, nil, String, 200)
|
536
|
+
[
|
537
|
+
"100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", # 1E125
|
538
|
+
"10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", # 1E124
|
539
|
+
"234567890234567890234567890234567890000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
540
|
+
"23456789023456789023456789023456789000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
|
541
|
+
"2345678902345678902345678902345678900",
|
542
|
+
"234567890234567890234567890234567890",
|
543
|
+
"23456789023456789023456789023456789",
|
544
|
+
"2345678902345678902345678902345678.9",
|
545
|
+
"234567890234567890234567890234567.89",
|
546
|
+
"23.456789023456789023456789023456789",
|
547
|
+
"2.3456789023456789023456789023456789",
|
548
|
+
"0.23456789023456789023456789023456789", # 2.34..snip..E-1
|
549
|
+
"0.023456789023456789023456789023456789", # 2.34..snip..E-2
|
550
|
+
"0.0023456789023456789023456789023456789", # 2.34..snip..E-3
|
551
|
+
"0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000023456789023456789023456789023456789", # 2.34..snip..E-130
|
552
|
+
"0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", # 1E-129
|
553
|
+
"0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001", # 1E-130
|
554
|
+
|
555
|
+
# leading spaces
|
556
|
+
" 123",
|
557
|
+
# trailing spaces
|
558
|
+
"123 ",
|
559
|
+
"123.456 ",
|
560
|
+
"123E10 ",
|
561
|
+
"123.456E10 ",
|
562
|
+
# scientific notation
|
563
|
+
"1234567890000e-9",
|
564
|
+
"123456789000e-8",
|
565
|
+
"123456789e-5",
|
566
|
+
"12345.6789e-1",
|
567
|
+
"12.3456789e+1",
|
568
|
+
"0.0000123456789E7",
|
569
|
+
# round to zero
|
570
|
+
"1E-131",
|
571
|
+
# overflow
|
572
|
+
"1E126",
|
573
|
+
"10E125",
|
574
|
+
"100000000000E115",
|
575
|
+
"1E+126",
|
576
|
+
# invalid number
|
577
|
+
"",
|
578
|
+
" ",
|
579
|
+
"abc",
|
580
|
+
"1E10a",
|
581
|
+
"11E10a",
|
582
|
+
"1.1.1",
|
583
|
+
# round down
|
584
|
+
"444444444444444444444444444444444444444444444444440000",
|
585
|
+
"44444444444444444444444444444444444444444444444444000",
|
586
|
+
"44444444444444444444444444.444444444444444444444444",
|
587
|
+
"4444444444444444444444444.4444444444444444444444444",
|
588
|
+
"0.000000044444444444444444444444444444444444444444444444444",
|
589
|
+
"0.00000044444444444444444444444444444444444444444444444444",
|
590
|
+
# round up
|
591
|
+
"555555555555555555555555555555555555555555555555550000",
|
592
|
+
"55555555555555555555555555555555555555555555555555000",
|
593
|
+
"55555555555555555555555555.555555555555555555555555",
|
594
|
+
"5555555555555555555555555.5555555555555555555555555",
|
595
|
+
"0.000000055555555555555555555555555555555555555555555555555",
|
596
|
+
"0.00000055555555555555555555555555555555555555555555555555",
|
597
|
+
"999999999999999999999999999999999999999999999999990000",
|
598
|
+
"99999999999999999999999999999999999999999999999999000",
|
599
|
+
"99999999999999999999999999.999999999999999999999999",
|
600
|
+
"9999999999999999999999999.9999999999999999999999999",
|
601
|
+
"0.000000099999999999999999999999999999999999999999999999999",
|
602
|
+
"0.00000099999999999999999999999999999999999999999999999999",
|
603
|
+
# overflow by round up
|
604
|
+
"999999999999999999999999999999999999999999999999999999999900000000000000000000000000000000000000000000000000000000000000000000",
|
605
|
+
].each do |str|
|
606
|
+
run_test_new_from_string(cursor, str)
|
607
|
+
run_test_new_from_string(cursor, '-' + str)
|
608
|
+
end
|
609
|
+
ensure
|
610
|
+
conn.logoff
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
614
|
+
def run_test_new_from_string(cursor, str)
|
615
|
+
cursor[1] = str
|
616
|
+
onum = nil
|
617
|
+
begin
|
618
|
+
cursor.exec
|
619
|
+
onum = cursor.fetch[0]
|
620
|
+
rescue OCIError => oraerr
|
621
|
+
begin
|
622
|
+
OraNumber.new(str)
|
623
|
+
flunk("exception expected but none was thrown. test data: " + str)
|
624
|
+
rescue
|
625
|
+
assert_equal(oraerr.to_s, $!.to_s, "test data: " + str)
|
626
|
+
end
|
627
|
+
end
|
628
|
+
if onum
|
629
|
+
assert_equal(onum.dump, OraNumber.new(str).dump, "test data: " + str)
|
630
|
+
end
|
631
|
+
end
|
632
|
+
|
491
633
|
def test_new_from_bigdecimal
|
492
634
|
["+Infinity", "-Infinity", "NaN"].each do |n|
|
493
635
|
assert_raise TypeError do
|
@@ -504,7 +646,8 @@ class TestOraNumber < Test::Unit::TestCase
|
|
504
646
|
[
|
505
647
|
[Rational(1, 2), "0.5"],
|
506
648
|
[Rational(3, 5), "0.6"],
|
507
|
-
[Rational(10, 3), "3.
|
649
|
+
[Rational(10, 3), "3.33333333333333333333333333333333333333"],
|
650
|
+
[Rational(20, 3), "6.66666666666666666666666666666666666667"],
|
508
651
|
].each do |ary|
|
509
652
|
assert_equal(ary[1], OraNumber.new(ary[0]).to_s)
|
510
653
|
end
|
metadata
CHANGED
@@ -1,7 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-oci8
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 2
|
7
|
+
- 0
|
8
|
+
- 4
|
9
|
+
version: 2.0.4
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- KUBO Takehiro
|
@@ -9,11 +14,13 @@ autorequire:
|
|
9
14
|
bindir: bin
|
10
15
|
cert_chain: []
|
11
16
|
|
12
|
-
date:
|
17
|
+
date: 2010-02-28 00:00:00 +09:00
|
13
18
|
default_executable:
|
14
19
|
dependencies: []
|
15
20
|
|
16
|
-
description:
|
21
|
+
description: |
|
22
|
+
ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8, Oracle8i, Oracle9i, Oracle10g and Oracle Instant Client.
|
23
|
+
|
17
24
|
email: kubo@jiubao.org
|
18
25
|
executables: []
|
19
26
|
|
@@ -55,9 +62,12 @@ files:
|
|
55
62
|
- ext/oci8/oci8.h
|
56
63
|
- ext/oci8/oci8lib.c
|
57
64
|
- ext/oci8/ocidatetime.c
|
65
|
+
- ext/oci8/ocihandle.c
|
58
66
|
- ext/oci8/ocinumber.c
|
59
67
|
- ext/oci8/oraconf.rb
|
60
68
|
- ext/oci8/oradate.c
|
69
|
+
- ext/oci8/oranumber_util.c
|
70
|
+
- ext/oci8/oranumber_util.h
|
61
71
|
- ext/oci8/post-config.rb
|
62
72
|
- ext/oci8/stmt.c
|
63
73
|
- ext/oci8/object.c
|
@@ -98,6 +108,8 @@ files:
|
|
98
108
|
- test/test_rowid.rb
|
99
109
|
has_rdoc: true
|
100
110
|
homepage: http://ruby-oci8.rubyforge.org
|
111
|
+
licenses: []
|
112
|
+
|
101
113
|
post_install_message:
|
102
114
|
rdoc_options:
|
103
115
|
- --main
|
@@ -108,20 +120,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
120
|
requirements:
|
109
121
|
- - ">="
|
110
122
|
- !ruby/object:Gem::Version
|
123
|
+
segments:
|
124
|
+
- 1
|
125
|
+
- 8
|
126
|
+
- 0
|
111
127
|
version: 1.8.0
|
112
|
-
version:
|
113
128
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
114
129
|
requirements:
|
115
130
|
- - ">="
|
116
131
|
- !ruby/object:Gem::Version
|
132
|
+
segments:
|
133
|
+
- 0
|
117
134
|
version: "0"
|
118
|
-
version:
|
119
135
|
requirements: []
|
120
136
|
|
121
137
|
rubyforge_project: ruby-oci8
|
122
|
-
rubygems_version: 1.
|
138
|
+
rubygems_version: 1.3.6
|
123
139
|
signing_key:
|
124
|
-
specification_version:
|
140
|
+
specification_version: 3
|
125
141
|
summary: Ruby interface for Oracle using OCI8 API
|
126
142
|
test_files:
|
127
143
|
- test/test_all.rb
|