ruby-oci8 2.0.6 → 2.1.0
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 +366 -19
- data/Makefile +2 -8
- data/NEWS +111 -0
- data/README +4 -85
- data/VERSION +1 -1
- data/dist-files +9 -2
- data/ext/oci8/.document +1 -0
- data/ext/oci8/apiwrap.c.tmpl +12 -2
- data/ext/oci8/apiwrap.yml +37 -21
- data/ext/oci8/attr.c +23 -74
- data/ext/oci8/bind.c +93 -225
- data/ext/oci8/connection_pool.c +201 -0
- data/ext/oci8/encoding.c +117 -24
- data/ext/oci8/env.c +5 -10
- data/ext/oci8/error.c +171 -189
- data/ext/oci8/extconf.rb +6 -2
- data/ext/oci8/lob.c +81 -79
- data/ext/oci8/metadata.c +42 -177
- data/ext/oci8/object.c +55 -28
- data/ext/oci8/oci8.c +426 -294
- data/ext/oci8/oci8.h +84 -51
- data/ext/oci8/oci8lib.c +75 -53
- data/ext/oci8/ocidatetime.c +67 -88
- data/ext/oci8/ocihandle.c +78 -37
- data/ext/oci8/ocinumber.c +166 -109
- data/ext/oci8/oraconf.rb +68 -157
- data/ext/oci8/oradate.c +2 -7
- data/ext/oci8/stmt.c +40 -183
- data/ext/oci8/thread_util.c +85 -0
- data/ext/oci8/thread_util.h +30 -0
- data/lib/oci8.rb.in +19 -13
- data/lib/oci8/.document +2 -0
- data/lib/oci8/bindtype.rb +62 -45
- data/lib/oci8/connection_pool.rb +118 -0
- data/lib/oci8/datetime.rb +304 -320
- data/lib/oci8/encoding-init.rb +62 -30
- data/lib/oci8/encoding.yml +3 -3
- data/lib/oci8/metadata.rb +552 -497
- data/lib/oci8/object.rb +9 -9
- data/lib/oci8/oci8.rb +161 -2
- data/lib/oci8/ocihandle.rb +427 -0
- data/lib/oci8/properties.rb +31 -1
- data/ruby-oci8.gemspec +10 -3
- data/test/README +41 -3
- data/test/config.rb +16 -0
- data/test/test_all.rb +3 -0
- data/test/test_bind_string.rb +106 -0
- data/test/test_break.rb +33 -7
- data/test/test_clob.rb +13 -10
- data/test/test_connection_pool.rb +125 -0
- data/test/test_connstr.rb +2 -2
- data/test/test_datetime.rb +26 -66
- data/test/test_encoding.rb +7 -3
- data/test/test_error.rb +88 -0
- data/test/test_metadata.rb +1356 -204
- data/test/test_oci8.rb +27 -8
- data/test/test_oranumber.rb +41 -0
- metadata +34 -9
- data/ext/oci8/xmldb.c +0 -383
data/test/test_oci8.rb
CHANGED
@@ -96,9 +96,9 @@ EOS
|
|
96
96
|
cursor = @conn.parse("INSERT INTO test_table VALUES (:C, :V, :N, :D1, :D2, :D3, :D4, :INT, :BIGNUM)")
|
97
97
|
1.upto(10) do |i|
|
98
98
|
if i == 1
|
99
|
-
|
99
|
+
dt = [nil, OraDate]
|
100
100
|
else
|
101
|
-
|
101
|
+
dt = OraDate.new(2000 + i, i % 2 == 0 ? 7 : 1, 3, 23, 59, 59)
|
102
102
|
end
|
103
103
|
cursor.exec(format("%10d", i * 10), i.to_s, i, dt, dt, dt, dt, i * 11111111111, i * 10000000000)
|
104
104
|
end
|
@@ -122,9 +122,10 @@ EOS
|
|
122
122
|
assert_nil(rv[5])
|
123
123
|
assert_nil(rv[6])
|
124
124
|
else
|
125
|
-
|
126
|
-
|
127
|
-
|
125
|
+
month = i % 2 == 0 ? 7 : 1
|
126
|
+
tm = Time.local(2000 + i, month, 3, 23, 59, 59)
|
127
|
+
dt = Date.civil(2000 + i, month, 3)
|
128
|
+
dttm = DateTime.civil(2000 + i, month, 3, 23, 59, 59, tm.utc_offset.to_r/86400)
|
128
129
|
assert_equal(tm, rv[3])
|
129
130
|
assert_equal(tm, rv[4])
|
130
131
|
assert_equal(dt, rv[5])
|
@@ -148,9 +149,10 @@ EOS
|
|
148
149
|
assert_nil(row['D3'])
|
149
150
|
assert_nil(row['D4'])
|
150
151
|
else
|
151
|
-
|
152
|
-
|
153
|
-
|
152
|
+
month = i % 2 == 0 ? 7 : 1
|
153
|
+
tm = Time.local(2000 + i, month, 3, 23, 59, 59)
|
154
|
+
dt = Date.civil(2000 + i, month, 3)
|
155
|
+
dttm = DateTime.civil(2000 + i, month, 3, 23, 59, 59, tm.utc_offset.to_r/86400)
|
154
156
|
assert_equal(tm, row['D1'])
|
155
157
|
assert_equal(tm, row['D2'])
|
156
158
|
assert_equal(dt, row['D3'])
|
@@ -431,4 +433,21 @@ EOS
|
|
431
433
|
end
|
432
434
|
end
|
433
435
|
|
436
|
+
def test_last_error
|
437
|
+
# OCI8#parse and OCI8#exec reset OCI8#last_error
|
438
|
+
@conn.last_error = 'dummy'
|
439
|
+
@conn.exec('begin null; end;')
|
440
|
+
assert_nil(@conn.last_error)
|
441
|
+
@conn.last_error = 'dummy'
|
442
|
+
cursor = @conn.parse('select col1, max(col2) from (select 1 as col1, null as col2 from dual) group by col1')
|
443
|
+
assert_nil(@conn.last_error)
|
444
|
+
|
445
|
+
# When an OCI function returns OCI_SUCCESS_WITH_INFO, OCI8#last_error is set.
|
446
|
+
@conn.last_error = 'dummy'
|
447
|
+
cursor.exec
|
448
|
+
assert_equal('dummy', @conn.last_error)
|
449
|
+
cursor.fetch
|
450
|
+
assert_kind_of(OCISuccessWithInfo, @conn.last_error)
|
451
|
+
assert_equal(24347, @conn.last_error.code)
|
452
|
+
end
|
434
453
|
end # TestOCI8
|
data/test/test_oranumber.rb
CHANGED
@@ -743,4 +743,45 @@ EOS
|
|
743
743
|
assert_equal(false, OraNumber(10.0).has_decimal_part?)
|
744
744
|
assert_equal(true, OraNumber(10.1).has_decimal_part?)
|
745
745
|
end
|
746
|
+
|
747
|
+
def test_float_conversion_type_ruby
|
748
|
+
orig = OCI8.properties[:float_conversion_type]
|
749
|
+
conn = get_oci8_connection
|
750
|
+
begin
|
751
|
+
OCI8.properties[:float_conversion_type] = :ruby
|
752
|
+
# Oracle Number -> Ruby Float
|
753
|
+
cursor = conn.parse('begin :out := :in; end;')
|
754
|
+
cursor.bind_param(:in, nil, String, 50)
|
755
|
+
cursor.bind_param(:out, nil, Float)
|
756
|
+
LARGE_RANGE_VALUES.each do |n|
|
757
|
+
cursor[:in] = n
|
758
|
+
cursor.exec
|
759
|
+
assert_equal(n.to_f, cursor[:out])
|
760
|
+
end
|
761
|
+
cursor.close
|
762
|
+
# Ruby Float -> Oracle Number
|
763
|
+
LARGE_RANGE_VALUES.each do |n|
|
764
|
+
float_val = n.to_f
|
765
|
+
expected_val = float_val.to_s
|
766
|
+
# convert
|
767
|
+
if /(-?)(\d).(\d+)e([+-]?\d+)/ =~ expected_val
|
768
|
+
sign = $1
|
769
|
+
int = $2
|
770
|
+
frac = $3
|
771
|
+
shift = $4.to_i
|
772
|
+
if frac.length <= shift
|
773
|
+
expected_val = sign + int + frac + '0' * (shift - frac.length)
|
774
|
+
elsif shift < 0
|
775
|
+
expected_val = sign + '0.' + '0' * (-shift - 1) + int + frac
|
776
|
+
expected_val.gsub!(/0+$/, '')
|
777
|
+
end
|
778
|
+
end
|
779
|
+
expected_val.gsub!(/\.0$/, '')
|
780
|
+
assert_equal(expected_val, OraNumber(float_val).to_s, "n = #{n}, float_val.to_s = #{float_val.to_s}")
|
781
|
+
end
|
782
|
+
ensure
|
783
|
+
OCI8.properties[:float_conversion_type] = orig
|
784
|
+
conn.logoff
|
785
|
+
end
|
786
|
+
end
|
746
787
|
end
|
metadata
CHANGED
@@ -1,7 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-oci8
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
hash: 11
|
5
|
+
prerelease: false
|
6
|
+
segments:
|
7
|
+
- 2
|
8
|
+
- 1
|
9
|
+
- 0
|
10
|
+
version: 2.1.0
|
5
11
|
platform: ruby
|
6
12
|
authors:
|
7
13
|
- KUBO Takehiro
|
@@ -9,11 +15,13 @@ autorequire:
|
|
9
15
|
bindir: bin
|
10
16
|
cert_chain: []
|
11
17
|
|
12
|
-
date: 2011-
|
18
|
+
date: 2011-12-13 00:00:00 +09:00
|
13
19
|
default_executable:
|
14
20
|
dependencies: []
|
15
21
|
|
16
|
-
description:
|
22
|
+
description: |
|
23
|
+
ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8, Oracle8i, Oracle9i, Oracle10g and Oracle Instant Client.
|
24
|
+
|
17
25
|
email: kubo@jiubao.org
|
18
26
|
executables: []
|
19
27
|
|
@@ -45,12 +53,14 @@ files:
|
|
45
53
|
- ext/oci8/apiwrap.yml
|
46
54
|
- ext/oci8/attr.c
|
47
55
|
- ext/oci8/bind.c
|
56
|
+
- ext/oci8/connection_pool.c
|
48
57
|
- ext/oci8/encoding.c
|
49
58
|
- ext/oci8/env.c
|
50
59
|
- ext/oci8/error.c
|
51
60
|
- ext/oci8/extconf.rb
|
52
61
|
- ext/oci8/lob.c
|
53
62
|
- ext/oci8/metadata.c
|
63
|
+
- ext/oci8/object.c
|
54
64
|
- ext/oci8/oci8.c
|
55
65
|
- ext/oci8/oci8.h
|
56
66
|
- ext/oci8/oci8lib.c
|
@@ -63,21 +73,23 @@ files:
|
|
63
73
|
- ext/oci8/oranumber_util.h
|
64
74
|
- ext/oci8/post-config.rb
|
65
75
|
- ext/oci8/stmt.c
|
66
|
-
- ext/oci8/
|
76
|
+
- ext/oci8/thread_util.c
|
77
|
+
- ext/oci8/thread_util.h
|
67
78
|
- ext/oci8/win32.c
|
68
|
-
- ext/oci8/xmldb.c
|
69
79
|
- lib/.document
|
70
80
|
- lib/oci8.rb.in
|
71
81
|
- lib/dbd/OCI8.rb
|
72
82
|
- lib/oci8/.document
|
73
83
|
- lib/oci8/bindtype.rb
|
74
84
|
- lib/oci8/compat.rb
|
85
|
+
- lib/oci8/connection_pool.rb
|
75
86
|
- lib/oci8/datetime.rb
|
76
87
|
- lib/oci8/encoding-init.rb
|
77
88
|
- lib/oci8/encoding.yml
|
78
89
|
- lib/oci8/metadata.rb
|
79
90
|
- lib/oci8/object.rb
|
80
91
|
- lib/oci8/oci8.rb
|
92
|
+
- lib/oci8/ocihandle.rb
|
81
93
|
- lib/oci8/oracle_version.rb
|
82
94
|
- lib/oci8/properties.rb
|
83
95
|
- test/README
|
@@ -86,14 +98,17 @@ files:
|
|
86
98
|
- test/test_appinfo.rb
|
87
99
|
- test/test_array_dml.rb
|
88
100
|
- test/test_bind_raw.rb
|
101
|
+
- test/test_bind_string.rb
|
89
102
|
- test/test_bind_time.rb
|
90
103
|
- test/test_break.rb
|
91
104
|
- test/test_clob.rb
|
105
|
+
- test/test_connection_pool.rb
|
92
106
|
- test/test_connstr.rb
|
93
107
|
- test/test_encoding.rb
|
94
108
|
- test/test_datetime.rb
|
95
109
|
- test/test_dbi.rb
|
96
110
|
- test/test_dbi_clob.rb
|
111
|
+
- test/test_error.rb
|
97
112
|
- test/test_metadata.rb
|
98
113
|
- test/test_oci8.rb
|
99
114
|
- test/test_oracle_version.rb
|
@@ -102,6 +117,8 @@ files:
|
|
102
117
|
- test/test_rowid.rb
|
103
118
|
has_rdoc: true
|
104
119
|
homepage: http://ruby-oci8.rubyforge.org
|
120
|
+
licenses: []
|
121
|
+
|
105
122
|
post_install_message:
|
106
123
|
rdoc_options:
|
107
124
|
- --main
|
@@ -109,23 +126,31 @@ rdoc_options:
|
|
109
126
|
require_paths:
|
110
127
|
- lib
|
111
128
|
required_ruby_version: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
112
130
|
requirements:
|
113
131
|
- - ">="
|
114
132
|
- !ruby/object:Gem::Version
|
133
|
+
hash: 55
|
134
|
+
segments:
|
135
|
+
- 1
|
136
|
+
- 8
|
137
|
+
- 0
|
115
138
|
version: 1.8.0
|
116
|
-
version:
|
117
139
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
118
141
|
requirements:
|
119
142
|
- - ">="
|
120
143
|
- !ruby/object:Gem::Version
|
144
|
+
hash: 3
|
145
|
+
segments:
|
146
|
+
- 0
|
121
147
|
version: "0"
|
122
|
-
version:
|
123
148
|
requirements: []
|
124
149
|
|
125
150
|
rubyforge_project: ruby-oci8
|
126
|
-
rubygems_version: 1.3.
|
151
|
+
rubygems_version: 1.3.7
|
127
152
|
signing_key:
|
128
|
-
specification_version:
|
153
|
+
specification_version: 3
|
129
154
|
summary: Ruby interface for Oracle using OCI8 API
|
130
155
|
test_files:
|
131
156
|
- test/test_all.rb
|
data/ext/oci8/xmldb.c
DELETED
@@ -1,383 +0,0 @@
|
|
1
|
-
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
|
-
#include "oci8.h"
|
3
|
-
|
4
|
-
#if 0 /* disabled for a while. */ && (ORACLE_CLIENT_VERSION >= ORAVER_10_1 || defined RUNTIME_API_CHECK)
|
5
|
-
|
6
|
-
#ifndef HAVE_XMLOTN_H
|
7
|
-
/* declarations in xmlproc.h of Oracle XML Development Kit */
|
8
|
-
typedef xmlnode xmlelemnode;
|
9
|
-
typedef xmlnode xmlpinode;
|
10
|
-
typedef xmlnode xmldocnode;
|
11
|
-
typedef xmlnode xmldtdnode;
|
12
|
-
typedef xmlnode xmlnotenode;
|
13
|
-
typedef xmlnode xmlnamedmap;
|
14
|
-
typedef xmlnode xmlattrnode;
|
15
|
-
|
16
|
-
typedef enum {
|
17
|
-
XMLERR_OK = 0,
|
18
|
-
} xmlerr;
|
19
|
-
|
20
|
-
typedef enum {
|
21
|
-
XMLDOM_NONE = 0, /* bogus node */
|
22
|
-
XMLDOM_ELEM = 1, /* element */
|
23
|
-
XMLDOM_ATTR = 2, /* attribute */
|
24
|
-
XMLDOM_TEXT = 3, /* char data not escaped by CDATA */
|
25
|
-
XMLDOM_CDATA = 4, /* char data escaped by CDATA */
|
26
|
-
XMLDOM_ENTREF = 5, /* entity reference */
|
27
|
-
XMLDOM_ENTITY = 6, /* entity */
|
28
|
-
XMLDOM_PI = 7, /* <?processing instructions?> */
|
29
|
-
XMLDOM_COMMENT = 8, /* <!-- Comments --> */
|
30
|
-
XMLDOM_DOC = 9, /* Document */
|
31
|
-
XMLDOM_DTD = 10, /* DTD */
|
32
|
-
XMLDOM_FRAG = 11, /* Document fragment */
|
33
|
-
XMLDOM_NOTATION = 12, /* notation */
|
34
|
-
XMLDOM_ELEMDECL = 13, /* DTD element declaration */
|
35
|
-
XMLDOM_ATTRDECL = 14, /* DTD attribute declaration */
|
36
|
-
XMLDOM_CPELEM = 15, /* element */
|
37
|
-
XMLDOM_CPCHOICE = 16, /* choice (a|b) */
|
38
|
-
XMLDOM_CPSEQ = 17, /* sequence (a,b) */
|
39
|
-
XMLDOM_CPPCDATA = 18, /* #PCDATA */
|
40
|
-
XMLDOM_CPSTAR = 19, /* '*' (zero or more) */
|
41
|
-
XMLDOM_CPPLUS = 20, /* '+' (one or more) */
|
42
|
-
XMLDOM_CPOPT = 21, /* '?' (optional) */
|
43
|
-
XMLDOM_CPEND = 22 /* end marker */
|
44
|
-
} xmlnodetype;
|
45
|
-
|
46
|
-
typedef struct xmldomcb {
|
47
|
-
void *cb[1];
|
48
|
-
} xmldomcb;
|
49
|
-
|
50
|
-
typedef struct xmlctxhead {
|
51
|
-
ub4 cw_xmlctxhead; /* checkword */
|
52
|
-
oratext *name_xmlctxhead; /* name for context */
|
53
|
-
void *cb_xmlctxhead; /* top-level function callbacks */
|
54
|
-
xmldomcb *domcb_xmlctxhead; /* DOM function callbacks */
|
55
|
-
} xmlctxhead;
|
56
|
-
#define XML_DOMCB(xctx) ((xmlctxhead *) xctx)->domcb_xmlctxhead
|
57
|
-
|
58
|
-
typedef xmlerr (*XmlDomGetDecl_t)(xmlctx *xctx, xmldocnode *doc, oratext **ver, oratext **enc, sb4 *std);
|
59
|
-
#define XmlDomGetDecl(xctx, doc, ver, enc, std) \
|
60
|
-
((XmlDomGetDecl_t)XML_DOMCB(xctx)->cb[0])((xctx), (doc), (ver), (enc), (std))
|
61
|
-
|
62
|
-
typedef xmldtdnode* (*XmlDomGetDTD_t)(xmlctx *xctx, xmldocnode *doc);
|
63
|
-
#define XmlDomGetDTD(xctx, doc) \
|
64
|
-
((XmlDomGetDTD_t)XML_DOMCB(xctx)->cb[3])((xctx), (doc))
|
65
|
-
|
66
|
-
typedef xmlnodetype (*XmlDomGetNodeType_t)(xmlctx *xctx, xmlnode *node);
|
67
|
-
#define XmlDomGetNodeType(xctx, node) \
|
68
|
-
((XmlDomGetNodeType_t)XML_DOMCB(xctx)->cb[34])((xctx), (node))
|
69
|
-
|
70
|
-
typedef xmlnode* (*XmlDomGetFirstChild_t)(xmlctx *xctx, xmlnode *node);
|
71
|
-
#define XmlDomGetFirstChild(xctx, node) \
|
72
|
-
((XmlDomGetFirstChild_t)XML_DOMCB(xctx)->cb[46])((xctx), (node))
|
73
|
-
|
74
|
-
typedef xmlnode* (*XmlDomGetNextSibling_t)(xmlctx *xctx, xmlnode *node);
|
75
|
-
#define XmlDomGetNextSibling(xctx, node) \
|
76
|
-
((XmlDomGetNextSibling_t)XML_DOMCB(xctx)->cb[53])((xctx), (node))
|
77
|
-
|
78
|
-
typedef xmlnamedmap* (*XmlDomGetAttrs_t)(xmlctx *xctx, xmlelemnode *elem);
|
79
|
-
#define XmlDomGetAttrs(xctx, node) \
|
80
|
-
((XmlDomGetAttrs_t)XML_DOMCB(xctx)->cb[55])((xctx), (node))
|
81
|
-
|
82
|
-
typedef xmlnode* (*XmlDomGetNodeMapItem_t)(xmlctx *xctx, xmlnamedmap *map, ub4 index);
|
83
|
-
#define XmlDomGetNodeMapItem(xctx, map, index) \
|
84
|
-
((XmlDomGetNodeMapItem_t)XML_DOMCB(xctx)->cb[82])((xctx), (map), (index))
|
85
|
-
|
86
|
-
typedef ub4 (*XmlDomGetNodeMapLength_t)(xmlctx *xctx, xmlnamedmap *map);
|
87
|
-
#define XmlDomGetNodeMapLength(xctx, map) \
|
88
|
-
((XmlDomGetNodeMapLength_t)XML_DOMCB(xctx)->cb[83])((xctx), (map))
|
89
|
-
|
90
|
-
typedef oratext* (*XmlDomGetCharData_t)(xmlctx *xctx, xmlnode *node);
|
91
|
-
#define XmlDomGetCharData(xctx, node) \
|
92
|
-
((XmlDomGetCharData_t)XML_DOMCB(xctx)->cb[90])((xctx), (node))
|
93
|
-
|
94
|
-
typedef oratext* (*XmlDomGetAttrName_t)(xmlctx *xctx, xmlattrnode *attr);
|
95
|
-
#define XmlDomGetAttrName(xctx, attr) \
|
96
|
-
((XmlDomGetAttrName_t)XML_DOMCB(xctx)->cb[98])((xctx), (attr))
|
97
|
-
|
98
|
-
typedef oratext* (*XmlDomGetAttrValue_t)(xmlctx *xctx, xmlattrnode *attr);
|
99
|
-
#define XmlDomGetAttrValue(xctx, attr) \
|
100
|
-
((XmlDomGetAttrValue_t)XML_DOMCB(xctx)->cb[106])((xctx), (attr))
|
101
|
-
|
102
|
-
typedef oratext* (*XmlDomGetTag_t)(xmlctx *xctx, xmlelemnode *elem);
|
103
|
-
#define XmlDomGetTag(xctx, elem) \
|
104
|
-
((XmlDomGetTag_t)XML_DOMCB(xctx)->cb[112])((xctx), (elem))
|
105
|
-
|
106
|
-
typedef oratext* (*XmlDomGetDTDName_t)(xmlctx *xctx, xmldtdnode *dtd);
|
107
|
-
#define XmlDomGetDTDName(xctx, dtd) \
|
108
|
-
((XmlDomGetDTDName_t)XML_DOMCB(xctx)->cb[131])((xctx), (dtd))
|
109
|
-
|
110
|
-
typedef xmlnamedmap* (*XmlDomGetDTDEntities_t)(xmlctx *xctx, xmldtdnode *dtd);
|
111
|
-
#define XmlDomGetDTDEntities(xctx, dtd) \
|
112
|
-
((XmlDomGetDTDEntities_t)XML_DOMCB(xctx)->cb[132])((xctx), (dtd))
|
113
|
-
|
114
|
-
typedef xmlnamedmap* (*XmlDomGetDTDNotations_t)(xmlctx *xctx, xmldtdnode *dtd);
|
115
|
-
#define XmlDomGetDTDNotations(xctx, dtd) \
|
116
|
-
((XmlDomGetDTDNotations_t)XML_DOMCB(xctx)->cb[133])((xctx), (dtd))
|
117
|
-
|
118
|
-
typedef oratext* (*XmlDomGetDTDPubID_t)(xmlctx *xctx, xmldtdnode *dtd);
|
119
|
-
#define XmlDomGetDTDPubID(xctx, dtd) \
|
120
|
-
((XmlDomGetDTDPubID_t)XML_DOMCB(xctx)->cb[134])((xctx), (dtd))
|
121
|
-
|
122
|
-
typedef oratext* (*XmlDomGetDTDSysID_t)(xmlctx *xctx, xmldtdnode *dtd);
|
123
|
-
#define XmlDomGetDTDSysID(xctx, dtd) \
|
124
|
-
((XmlDomGetDTDSysID_t)XML_DOMCB(xctx)->cb[135])((xctx), (dtd))
|
125
|
-
|
126
|
-
typedef oratext* (*XmlDomGetPITarget_t)(xmlctx *xctx, xmlpinode *pi);
|
127
|
-
#define XmlDomGetPITarget(xctx, pi) \
|
128
|
-
((XmlDomGetPITarget_t)XML_DOMCB(xctx)->cb[143])((xctx), (pi))
|
129
|
-
|
130
|
-
typedef oratext* (*XmlDomGetPIData_t)(xmlctx *xctx, xmlpinode *pi);
|
131
|
-
#define XmlDomGetPIData(xctx, pi) \
|
132
|
-
((XmlDomGetPIData_t)XML_DOMCB(xctx)->cb[144])((xctx), (pi))
|
133
|
-
|
134
|
-
/* end of declarations in xmlproc.h of Oracle XML Development Kit */
|
135
|
-
#endif /* HAVE_XMLOTN_H */
|
136
|
-
|
137
|
-
static ID id_add;
|
138
|
-
static ID id_add_attribute;
|
139
|
-
static VALUE REXML_Element;
|
140
|
-
static VALUE REXML_Text;
|
141
|
-
static VALUE REXML_CData;
|
142
|
-
static VALUE REXML_Instruction;
|
143
|
-
static VALUE REXML_Comment;
|
144
|
-
static VALUE REXML_Document;
|
145
|
-
static VALUE REXML_XMLDecl;
|
146
|
-
static VALUE REXML_DocType;
|
147
|
-
static VALUE REXML_NotationDecl;
|
148
|
-
|
149
|
-
static VALUE oci8_make_element(struct xmlctx *xctx, xmlelemnode *elem);
|
150
|
-
static VALUE oci8_make_cdata(struct xmlctx *xctx, xmlnode *node);
|
151
|
-
static VALUE oci8_make_text(struct xmlctx *xctx, xmlnode *node);
|
152
|
-
static VALUE oci8_make_pi(struct xmlctx *xctx, xmlpinode *pi);
|
153
|
-
static VALUE oci8_make_comment(struct xmlctx *xctx, xmlnode *node);
|
154
|
-
static VALUE oci8_make_document(struct xmlctx *xctx, xmldocnode *doc);
|
155
|
-
static VALUE oci8_make_dtd(struct xmlctx *xctx, xmldtdnode *dtd);
|
156
|
-
|
157
|
-
static VALUE add_child_nodes(VALUE obj, struct xmlctx *xctx, xmlnode *node);
|
158
|
-
static VALUE add_attributes(VALUE obj, struct xmlctx *xctx, xmlnode *node);
|
159
|
-
static VALUE add_nodemap(VALUE obj, struct xmlctx *xctx, xmlnamedmap *map);
|
160
|
-
|
161
|
-
void Init_oci_xmldb(void)
|
162
|
-
{
|
163
|
-
id_add = rb_intern("add");
|
164
|
-
id_add_attribute = rb_intern("add_attribute");
|
165
|
-
rb_require("rexml/document");
|
166
|
-
REXML_Document = rb_eval_string("REXML::Document");
|
167
|
-
REXML_Element = rb_eval_string("REXML::Element");
|
168
|
-
REXML_Text = rb_eval_string("REXML::Text");
|
169
|
-
REXML_CData = rb_eval_string("REXML::CData");
|
170
|
-
REXML_Instruction = rb_eval_string("REXML::Instruction");
|
171
|
-
REXML_Comment = rb_eval_string("REXML::Comment");
|
172
|
-
REXML_XMLDecl = rb_eval_string("REXML::XMLDecl");
|
173
|
-
REXML_DocType = rb_eval_string("REXML::DocType");
|
174
|
-
REXML_NotationDecl = rb_eval_string("REXML::NotationDecl");
|
175
|
-
}
|
176
|
-
|
177
|
-
VALUE oci8_make_rexml(struct xmlctx *xctx, xmlnode *node)
|
178
|
-
{
|
179
|
-
xmlnodetype nodetype = XmlDomGetNodeType(xctx, node);
|
180
|
-
|
181
|
-
switch (nodetype) {
|
182
|
-
case XMLDOM_NONE: /* 0 */
|
183
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_NONE");
|
184
|
-
case XMLDOM_ELEM: /* 1 */
|
185
|
-
return oci8_make_element(xctx, (xmlelemnode*)node);
|
186
|
-
case XMLDOM_ATTR: /* 2 */
|
187
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_ATTR");
|
188
|
-
case XMLDOM_TEXT: /* 3 */
|
189
|
-
return oci8_make_text(xctx, node);
|
190
|
-
case XMLDOM_CDATA: /* 4 */
|
191
|
-
return oci8_make_cdata(xctx, node);
|
192
|
-
case XMLDOM_ENTREF: /* 5 */
|
193
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_ENTREF");
|
194
|
-
case XMLDOM_ENTITY: /* 6 */
|
195
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_ENTITY");
|
196
|
-
case XMLDOM_PI: /* 7 */
|
197
|
-
return oci8_make_pi(xctx, (xmlpinode*)node);
|
198
|
-
case XMLDOM_COMMENT: /* 8 */
|
199
|
-
return oci8_make_comment(xctx, node);
|
200
|
-
case XMLDOM_DOC: /* 9 */
|
201
|
-
return oci8_make_document(xctx, (xmldocnode*)node);
|
202
|
-
case XMLDOM_DTD: /* 10 */
|
203
|
-
return oci8_make_dtd(xctx, (xmldtdnode*)node);
|
204
|
-
case XMLDOM_FRAG: /* 11 */
|
205
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_FRAG");
|
206
|
-
case XMLDOM_NOTATION: /* 12 */
|
207
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_NOTATION");
|
208
|
-
case XMLDOM_ELEMDECL: /* 13 */
|
209
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_ELEMDECL");
|
210
|
-
case XMLDOM_ATTRDECL: /* 14 */
|
211
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_ATTRDECL");
|
212
|
-
case XMLDOM_CPELEM: /* 15 */
|
213
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_CPELEM");
|
214
|
-
case XMLDOM_CPCHOICE: /* 16 */
|
215
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_CPCHOICE");
|
216
|
-
case XMLDOM_CPSEQ: /* 17 */
|
217
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_CPSEQ");
|
218
|
-
case XMLDOM_CPPCDATA: /* 18 */
|
219
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_CPPCDATA");
|
220
|
-
case XMLDOM_CPSTAR: /* 19 */
|
221
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_CPSTAR");
|
222
|
-
case XMLDOM_CPPLUS: /* 20 */
|
223
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_CPPLUS");
|
224
|
-
case XMLDOM_CPOPT: /* 21 */
|
225
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_CPOPT");
|
226
|
-
case XMLDOM_CPEND: /* 22 */
|
227
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: XMLDOM_CPEND");
|
228
|
-
}
|
229
|
-
rb_raise(rb_eRuntimeError, "unsupported XML node type: %d", nodetype);
|
230
|
-
}
|
231
|
-
|
232
|
-
static VALUE oci8_make_element(struct xmlctx *xctx, xmlelemnode *elem)
|
233
|
-
{
|
234
|
-
oratext *name;
|
235
|
-
VALUE obj;
|
236
|
-
|
237
|
-
name = XmlDomGetTag(xctx, elem);
|
238
|
-
obj = rb_funcall(REXML_Element, oci8_id_new, 1, rb_str_new2_ora(name));
|
239
|
-
add_attributes(obj, xctx, (xmlnode*)elem);
|
240
|
-
return add_child_nodes(obj, xctx, (xmlnode*)elem);
|
241
|
-
}
|
242
|
-
|
243
|
-
static VALUE oci8_make_text(struct xmlctx *xctx, xmlnode *node)
|
244
|
-
{
|
245
|
-
oratext *data = XmlDomGetCharData(xctx, node);
|
246
|
-
return rb_funcall(REXML_Text, oci8_id_new, 1, rb_str_new2_ora(data));
|
247
|
-
}
|
248
|
-
|
249
|
-
static VALUE oci8_make_cdata(struct xmlctx *xctx, xmlnode *node)
|
250
|
-
{
|
251
|
-
oratext *data = XmlDomGetCharData(xctx, node);
|
252
|
-
return rb_funcall(REXML_CData, oci8_id_new, 1, rb_str_new2_ora(data));
|
253
|
-
}
|
254
|
-
|
255
|
-
static VALUE oci8_make_pi(struct xmlctx *xctx, xmlpinode *pi)
|
256
|
-
{
|
257
|
-
oratext *target;
|
258
|
-
oratext *data;
|
259
|
-
|
260
|
-
target= XmlDomGetPITarget(xctx, pi);
|
261
|
-
data = XmlDomGetPIData(xctx, pi);
|
262
|
-
return rb_funcall(REXML_Instruction, oci8_id_new, 2, rb_str_new2_ora(target), data ? rb_str_new2_ora(data) : Qnil);
|
263
|
-
}
|
264
|
-
|
265
|
-
static VALUE oci8_make_comment(struct xmlctx *xctx, xmlnode *node)
|
266
|
-
{
|
267
|
-
oratext *data = XmlDomGetCharData(xctx, node);
|
268
|
-
return rb_funcall(REXML_Comment, oci8_id_new, 1, rb_str_new2_ora(data));
|
269
|
-
}
|
270
|
-
|
271
|
-
static VALUE oci8_make_document(struct xmlctx *xctx, xmldocnode *doc)
|
272
|
-
{
|
273
|
-
xmlerr err;
|
274
|
-
oratext *ver;
|
275
|
-
oratext *enc;
|
276
|
-
sb4 std;
|
277
|
-
#ifdef ENABLE_DTD
|
278
|
-
xmldtdnode* dtd;
|
279
|
-
#endif
|
280
|
-
VALUE obj;
|
281
|
-
VALUE decl;
|
282
|
-
|
283
|
-
obj = rb_funcall(REXML_Document, oci8_id_new, 0);
|
284
|
-
err = XmlDomGetDecl(xctx, doc, &ver, &enc, &std);
|
285
|
-
if (err == XMLERR_OK) {
|
286
|
-
decl = rb_funcall(REXML_XMLDecl, oci8_id_new, 3,
|
287
|
-
ver ? rb_str_new2_ora(ver) : Qnil,
|
288
|
-
enc ? rb_str_new2_ora(enc) : Qnil,
|
289
|
-
(std < 0) ? Qnil : ((std > 0) ? rb_str_new2("yes") : rb_str_new2("no")));
|
290
|
-
rb_funcall(obj, id_add, 1, decl);
|
291
|
-
}
|
292
|
-
#ifdef ENABLE_DTD
|
293
|
-
dtd = XmlDomGetDTD(xctx, doc);
|
294
|
-
if (dtd != NULL) {
|
295
|
-
rb_funcall(obj, id_add, 1, oci8_make_dtd(xctx, dtd));
|
296
|
-
}
|
297
|
-
#endif
|
298
|
-
return add_child_nodes(obj, xctx, (xmlnode*)doc);
|
299
|
-
}
|
300
|
-
|
301
|
-
static VALUE oci8_make_dtd(struct xmlctx *xctx, xmldtdnode *dtd)
|
302
|
-
{
|
303
|
-
/*
|
304
|
-
* DTD support is not finished.
|
305
|
-
* I don't know how to get full dtd data from xmldtdnode.
|
306
|
-
*/
|
307
|
-
oratext *name;
|
308
|
-
oratext *pubid;
|
309
|
-
oratext *sysid;
|
310
|
-
xmlnamedmap *entities;
|
311
|
-
xmlnamedmap *notations;
|
312
|
-
VALUE obj;
|
313
|
-
|
314
|
-
name = XmlDomGetDTDName(xctx, dtd);
|
315
|
-
pubid = XmlDomGetDTDPubID(xctx, dtd);
|
316
|
-
sysid = XmlDomGetDTDSysID(xctx, dtd);
|
317
|
-
entities = XmlDomGetDTDEntities(xctx, dtd);
|
318
|
-
notations = XmlDomGetDTDNotations(xctx, dtd);
|
319
|
-
|
320
|
-
obj = rb_funcall(REXML_DocType, oci8_id_new, 1, rb_str_new2_ora(name));
|
321
|
-
if (entities != NULL)
|
322
|
-
add_nodemap(obj, xctx, entities);
|
323
|
-
if (notations != NULL)
|
324
|
-
add_nodemap(obj, xctx, notations);
|
325
|
-
return obj;
|
326
|
-
}
|
327
|
-
|
328
|
-
static VALUE add_child_nodes(VALUE obj, struct xmlctx *xctx, xmlnode *node)
|
329
|
-
{
|
330
|
-
node = XmlDomGetFirstChild(xctx, node);
|
331
|
-
while (node != NULL) {
|
332
|
-
rb_funcall(obj, id_add, 1, oci8_make_rexml(xctx, node));
|
333
|
-
node = XmlDomGetNextSibling(xctx, node);
|
334
|
-
}
|
335
|
-
return obj;
|
336
|
-
}
|
337
|
-
|
338
|
-
static VALUE add_attributes(VALUE obj, struct xmlctx *xctx, xmlnode *node)
|
339
|
-
{
|
340
|
-
xmlnamedmap *attrs;
|
341
|
-
xmlnode *attr;
|
342
|
-
oratext *name;
|
343
|
-
oratext *value;
|
344
|
-
ub4 num;
|
345
|
-
ub4 idx;
|
346
|
-
|
347
|
-
attrs = XmlDomGetAttrs(xctx, node);
|
348
|
-
num = XmlDomGetNodeMapLength(xctx, attrs);
|
349
|
-
for (idx = 0; idx < num; idx++) {
|
350
|
-
attr = XmlDomGetNodeMapItem(xctx, attrs, idx);
|
351
|
-
name = XmlDomGetAttrName(xctx, attr);
|
352
|
-
value = XmlDomGetAttrValue(xctx, attr);
|
353
|
-
rb_funcall(obj, id_add_attribute, 2,
|
354
|
-
rb_str_new2_ora(name),
|
355
|
-
value ? rb_str_new2_ora(value) : Qnil);
|
356
|
-
}
|
357
|
-
return obj;
|
358
|
-
}
|
359
|
-
|
360
|
-
static VALUE add_nodemap(VALUE obj, struct xmlctx *xctx, xmlnamedmap *map)
|
361
|
-
{
|
362
|
-
xmlnode *node;
|
363
|
-
ub4 num;
|
364
|
-
ub4 idx;
|
365
|
-
|
366
|
-
num = XmlDomGetNodeMapLength(xctx, map);
|
367
|
-
for (idx = 0; idx < num; idx++) {
|
368
|
-
node = XmlDomGetNodeMapItem(xctx, map, idx);
|
369
|
-
rb_funcall(obj, id_add, 1, oci8_make_rexml(xctx, node));
|
370
|
-
}
|
371
|
-
return obj;
|
372
|
-
}
|
373
|
-
|
374
|
-
#else
|
375
|
-
void Init_oci_xmldb(void)
|
376
|
-
{
|
377
|
-
}
|
378
|
-
|
379
|
-
VALUE oci8_make_rexml(struct xmlctx *xctx, xmlnode *node)
|
380
|
-
{
|
381
|
-
rb_notimplement();
|
382
|
-
}
|
383
|
-
#endif
|