ruby-oci8 1.0.7 → 2.0.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 +1254 -390
- data/Makefile +10 -13
- data/README +56 -385
- data/VERSION +1 -1
- data/dist-files +26 -27
- data/ext/oci8/.document +1 -0
- data/ext/oci8/MANIFEST +0 -4
- data/ext/oci8/apiwrap.c.tmpl +172 -0
- data/ext/oci8/apiwrap.h.tmpl +61 -0
- data/ext/oci8/apiwrap.rb +91 -0
- data/ext/oci8/apiwrap.yml +1243 -0
- data/ext/oci8/attr.c +124 -384
- data/ext/oci8/bind.c +472 -164
- data/ext/oci8/encoding.c +196 -0
- data/ext/oci8/env.c +84 -253
- data/ext/oci8/error.c +196 -127
- data/ext/oci8/extconf.rb +82 -59
- data/ext/oci8/lob.c +710 -370
- data/ext/oci8/metadata.c +359 -0
- data/ext/oci8/object.c +622 -0
- data/ext/oci8/oci8.c +577 -161
- data/ext/oci8/oci8.h +354 -258
- data/ext/oci8/oci8lib.c +493 -0
- data/ext/oci8/ocidatetime.c +473 -0
- data/ext/oci8/ocinumber.c +1123 -24
- data/ext/oci8/oraconf.rb +72 -106
- data/ext/oci8/oradate.c +511 -321
- data/ext/oci8/stmt.c +752 -572
- data/ext/oci8/win32.c +131 -0
- data/ext/oci8/xmldb.c +383 -0
- data/lib/.document +2 -0
- data/lib/dbd/OCI8.rb +2 -17
- data/lib/oci8.rb.in +41 -1622
- data/lib/oci8/.document +5 -0
- data/lib/oci8/compat.rb +108 -0
- data/lib/oci8/datetime.rb +489 -0
- data/lib/oci8/encoding-init.rb +40 -0
- data/lib/oci8/encoding.yml +537 -0
- data/lib/oci8/metadata.rb +2077 -0
- data/lib/oci8/object.rb +548 -0
- data/lib/oci8/oci8.rb +773 -0
- data/lib/oci8/oracle_version.rb +144 -0
- data/metaconfig +3 -3
- data/ruby-oci8.gemspec +5 -5
- data/setup.rb +4 -4
- data/test/config.rb +64 -84
- data/test/test_all.rb +14 -21
- data/test/test_array_dml.rb +317 -0
- data/test/test_bind_raw.rb +18 -25
- data/test/test_bind_time.rb +78 -91
- data/test/test_break.rb +37 -35
- data/test/test_clob.rb +33 -89
- data/test/test_connstr.rb +5 -4
- data/test/test_datetime.rb +469 -0
- data/test/test_dbi.rb +99 -60
- data/test/test_dbi_clob.rb +3 -8
- data/test/test_metadata.rb +65 -51
- data/test/test_oci8.rb +151 -55
- data/test/test_oracle_version.rb +70 -0
- data/test/test_oradate.rb +76 -83
- data/test/test_oranumber.rb +405 -71
- data/test/test_rowid.rb +6 -11
- metadata +31 -32
- data/NEWS +0 -420
- data/ext/oci8/const.c +0 -165
- data/ext/oci8/define.c +0 -53
- data/ext/oci8/describe.c +0 -81
- data/ext/oci8/descriptor.c +0 -39
- data/ext/oci8/handle.c +0 -273
- data/ext/oci8/oranumber.c +0 -445
- data/ext/oci8/param.c +0 -37
- data/ext/oci8/server.c +0 -182
- data/ext/oci8/session.c +0 -99
- data/ext/oci8/svcctx.c +0 -238
- data/ruby-oci8.spec +0 -62
- data/support/README +0 -4
- data/support/runit/assert.rb +0 -281
- data/support/runit/cui/testrunner.rb +0 -101
- data/support/runit/error.rb +0 -4
- data/support/runit/method_mappable.rb +0 -20
- data/support/runit/robserver.rb +0 -25
- data/support/runit/setuppable.rb +0 -15
- data/support/runit/teardownable.rb +0 -16
- data/support/runit/testcase.rb +0 -113
- data/support/runit/testfailure.rb +0 -25
- data/support/runit/testresult.rb +0 -121
- data/support/runit/testsuite.rb +0 -43
- data/support/runit/version.rb +0 -3
- data/test/test_describe.rb +0 -137
data/ext/oci8/win32.c
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
win32.c - part of ruby-oci8
|
4
|
+
|
5
|
+
Copyright (C) 2009 KUBO Takehiro <kubo@jiubao.org>
|
6
|
+
*/
|
7
|
+
#include "oci8.h"
|
8
|
+
#include <windows.h>
|
9
|
+
|
10
|
+
NORETURN(static void raise_error(void));
|
11
|
+
|
12
|
+
static void raise_error(void)
|
13
|
+
{
|
14
|
+
char msg[1024];
|
15
|
+
int err = GetLastError();
|
16
|
+
char *p;
|
17
|
+
|
18
|
+
sprintf(msg, "%d: ", err);
|
19
|
+
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
20
|
+
NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
|
21
|
+
msg + strlen(msg), sizeof(msg) - strlen(msg), NULL);
|
22
|
+
for (p = msg; *p != '\0'; p++) {
|
23
|
+
if (*p == '\n' || *p == '\r') {
|
24
|
+
*p = ' ';
|
25
|
+
}
|
26
|
+
}
|
27
|
+
rb_raise(rb_eRuntimeError, "%s", msg);
|
28
|
+
}
|
29
|
+
|
30
|
+
static VALUE dll_path(VALUE module)
|
31
|
+
{
|
32
|
+
HMODULE hModule;
|
33
|
+
DWORD len;
|
34
|
+
char path[1024];
|
35
|
+
|
36
|
+
hModule = GetModuleHandle("OCI.DLL");
|
37
|
+
if (hModule == NULL) {
|
38
|
+
raise_error();
|
39
|
+
}
|
40
|
+
len = GetModuleFileName(hModule, path, sizeof(path));
|
41
|
+
if (len == 0) {
|
42
|
+
raise_error();
|
43
|
+
}
|
44
|
+
return rb_external_str_new_with_enc(path, len, rb_filesystem_encoding());
|
45
|
+
}
|
46
|
+
|
47
|
+
|
48
|
+
typedef struct {
|
49
|
+
HKEY hKey;
|
50
|
+
HKEY hSubKey;
|
51
|
+
} enum_homes_arg_t;
|
52
|
+
|
53
|
+
static VALUE enum_homes_real(enum_homes_arg_t *arg)
|
54
|
+
{
|
55
|
+
LONG rv;
|
56
|
+
DWORD type;
|
57
|
+
DWORD idx;
|
58
|
+
char name[1024];
|
59
|
+
DWORD name_len;
|
60
|
+
FILETIME ft;
|
61
|
+
|
62
|
+
rv = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\ORACLE", 0, KEY_ENUMERATE_SUB_KEYS, &arg->hKey);
|
63
|
+
if (rv != ERROR_SUCCESS) {
|
64
|
+
return Qnil;
|
65
|
+
}
|
66
|
+
for (idx = 0; ; idx++) {
|
67
|
+
volatile VALUE oracle_home;
|
68
|
+
volatile VALUE nls_lang;
|
69
|
+
|
70
|
+
/* Get subkey name */
|
71
|
+
name_len = sizeof(name);
|
72
|
+
rv = RegEnumKeyEx(arg->hKey, idx, name, &name_len, NULL, NULL, NULL, &ft);
|
73
|
+
if (rv != ERROR_SUCCESS) {
|
74
|
+
break;
|
75
|
+
}
|
76
|
+
/* Open subkey */
|
77
|
+
if (arg->hSubKey != NULL) {
|
78
|
+
RegCloseKey(arg->hSubKey);
|
79
|
+
arg->hSubKey = NULL;
|
80
|
+
}
|
81
|
+
rv = RegOpenKeyEx(arg->hKey, name, 0, KEY_QUERY_VALUE, &arg->hSubKey);
|
82
|
+
if (rv != ERROR_SUCCESS) {
|
83
|
+
continue;
|
84
|
+
}
|
85
|
+
/* Get ORACLE_HOME */
|
86
|
+
name_len = sizeof(name);
|
87
|
+
rv = RegQueryValueEx(arg->hSubKey, "ORACLE_HOME", NULL, &type, name, &name_len);
|
88
|
+
if (rv != ERROR_SUCCESS || type != REG_SZ) {
|
89
|
+
continue;
|
90
|
+
}
|
91
|
+
oracle_home = rb_locale_str_new_cstr(name);
|
92
|
+
/* Get NLS_LANG */
|
93
|
+
name_len = sizeof(name);
|
94
|
+
rv = RegQueryValueEx(arg->hSubKey, "NLS_LANG", NULL, &type, name, &name_len);
|
95
|
+
if (rv != ERROR_SUCCESS || type != REG_SZ) {
|
96
|
+
continue;
|
97
|
+
}
|
98
|
+
nls_lang = rb_locale_str_new_cstr(name);
|
99
|
+
rb_yield_values(2, oracle_home, nls_lang);
|
100
|
+
}
|
101
|
+
return Qnil;
|
102
|
+
}
|
103
|
+
|
104
|
+
static VALUE enum_homes_ensure(enum_homes_arg_t *arg)
|
105
|
+
{
|
106
|
+
if (arg->hKey != NULL) {
|
107
|
+
RegCloseKey(arg->hKey);
|
108
|
+
arg->hKey = NULL;
|
109
|
+
}
|
110
|
+
if (arg->hSubKey != NULL) {
|
111
|
+
RegCloseKey(arg->hSubKey);
|
112
|
+
arg->hSubKey = NULL;
|
113
|
+
}
|
114
|
+
return Qnil;
|
115
|
+
}
|
116
|
+
|
117
|
+
static VALUE enum_homes(VALUE module)
|
118
|
+
{
|
119
|
+
enum_homes_arg_t arg;
|
120
|
+
arg.hKey = NULL;
|
121
|
+
arg.hSubKey = NULL;
|
122
|
+
return rb_ensure(enum_homes_real, (VALUE)&arg, enum_homes_ensure, (VALUE)&arg);
|
123
|
+
}
|
124
|
+
|
125
|
+
void Init_oci8_win32(VALUE cOCI8)
|
126
|
+
{
|
127
|
+
VALUE mWin32Util = rb_define_module_under(cOCI8, "Win32Util");
|
128
|
+
|
129
|
+
rb_define_module_function(mWin32Util, "dll_path", dll_path, 0);
|
130
|
+
rb_define_module_function(mWin32Util, "enum_homes", enum_homes, 0);
|
131
|
+
}
|
data/ext/oci8/xmldb.c
ADDED
@@ -0,0 +1,383 @@
|
|
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
|