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.
Files changed (59) hide show
  1. data/ChangeLog +366 -19
  2. data/Makefile +2 -8
  3. data/NEWS +111 -0
  4. data/README +4 -85
  5. data/VERSION +1 -1
  6. data/dist-files +9 -2
  7. data/ext/oci8/.document +1 -0
  8. data/ext/oci8/apiwrap.c.tmpl +12 -2
  9. data/ext/oci8/apiwrap.yml +37 -21
  10. data/ext/oci8/attr.c +23 -74
  11. data/ext/oci8/bind.c +93 -225
  12. data/ext/oci8/connection_pool.c +201 -0
  13. data/ext/oci8/encoding.c +117 -24
  14. data/ext/oci8/env.c +5 -10
  15. data/ext/oci8/error.c +171 -189
  16. data/ext/oci8/extconf.rb +6 -2
  17. data/ext/oci8/lob.c +81 -79
  18. data/ext/oci8/metadata.c +42 -177
  19. data/ext/oci8/object.c +55 -28
  20. data/ext/oci8/oci8.c +426 -294
  21. data/ext/oci8/oci8.h +84 -51
  22. data/ext/oci8/oci8lib.c +75 -53
  23. data/ext/oci8/ocidatetime.c +67 -88
  24. data/ext/oci8/ocihandle.c +78 -37
  25. data/ext/oci8/ocinumber.c +166 -109
  26. data/ext/oci8/oraconf.rb +68 -157
  27. data/ext/oci8/oradate.c +2 -7
  28. data/ext/oci8/stmt.c +40 -183
  29. data/ext/oci8/thread_util.c +85 -0
  30. data/ext/oci8/thread_util.h +30 -0
  31. data/lib/oci8.rb.in +19 -13
  32. data/lib/oci8/.document +2 -0
  33. data/lib/oci8/bindtype.rb +62 -45
  34. data/lib/oci8/connection_pool.rb +118 -0
  35. data/lib/oci8/datetime.rb +304 -320
  36. data/lib/oci8/encoding-init.rb +62 -30
  37. data/lib/oci8/encoding.yml +3 -3
  38. data/lib/oci8/metadata.rb +552 -497
  39. data/lib/oci8/object.rb +9 -9
  40. data/lib/oci8/oci8.rb +161 -2
  41. data/lib/oci8/ocihandle.rb +427 -0
  42. data/lib/oci8/properties.rb +31 -1
  43. data/ruby-oci8.gemspec +10 -3
  44. data/test/README +41 -3
  45. data/test/config.rb +16 -0
  46. data/test/test_all.rb +3 -0
  47. data/test/test_bind_string.rb +106 -0
  48. data/test/test_break.rb +33 -7
  49. data/test/test_clob.rb +13 -10
  50. data/test/test_connection_pool.rb +125 -0
  51. data/test/test_connstr.rb +2 -2
  52. data/test/test_datetime.rb +26 -66
  53. data/test/test_encoding.rb +7 -3
  54. data/test/test_error.rb +88 -0
  55. data/test/test_metadata.rb +1356 -204
  56. data/test/test_oci8.rb +27 -8
  57. data/test/test_oranumber.rb +41 -0
  58. metadata +34 -9
  59. data/ext/oci8/xmldb.c +0 -383
@@ -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
- dt = [nil, OraDate]
99
+ dt = [nil, OraDate]
100
100
  else
101
- dt = OraDate.new(2000 + i, 8, 3, 23, 59, 59)
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
- tm = Time.local(2000 + i, 8, 3, 23, 59, 59)
126
- dt = Date.civil(2000 + i, 8, 3)
127
- dttm = DateTime.civil(2000 + i, 8, 3, 23, 59, 59, Time.now.utc_offset.to_r/86400)
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
- tm = Time.local(2000 + i, 8, 3, 23, 59, 59)
152
- dt = Date.civil(2000 + i, 8, 3)
153
- dttm = DateTime.civil(2000 + i, 8, 3, 23, 59, 59, Time.now.utc_offset.to_r/86400)
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
@@ -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
- version: 2.0.6
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-06-14 00:00:00 +09:00
18
+ date: 2011-12-13 00:00:00 +09:00
13
19
  default_executable:
14
20
  dependencies: []
15
21
 
16
- description: ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8, Oracle8i, Oracle9i, Oracle10g and Oracle Instant Client.
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/object.c
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.1
151
+ rubygems_version: 1.3.7
127
152
  signing_key:
128
- specification_version: 2
153
+ specification_version: 3
129
154
  summary: Ruby interface for Oracle using OCI8 API
130
155
  test_files:
131
156
  - test/test_all.rb
@@ -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