ruby-oci8 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +569 -0
- data/Makefile +51 -0
- data/NEWS +322 -0
- data/README +415 -0
- data/VERSION +1 -0
- data/dist-files +70 -0
- data/doc/api.en.html +527 -0
- data/doc/api.en.rd +554 -0
- data/doc/api.ja.html +525 -0
- data/doc/api.ja.rd +557 -0
- data/doc/manual.css +35 -0
- data/ext/oci8/MANIFEST +22 -0
- data/ext/oci8/attr.c +415 -0
- data/ext/oci8/bind.c +194 -0
- data/ext/oci8/const.c +165 -0
- data/ext/oci8/define.c +53 -0
- data/ext/oci8/describe.c +81 -0
- data/ext/oci8/descriptor.c +39 -0
- data/ext/oci8/env.c +276 -0
- data/ext/oci8/error.c +234 -0
- data/ext/oci8/extconf.rb +118 -0
- data/ext/oci8/handle.c +262 -0
- data/ext/oci8/lob.c +386 -0
- data/ext/oci8/oci8.c +137 -0
- data/ext/oci8/oci8.h +345 -0
- data/ext/oci8/ocinumber.c +117 -0
- data/ext/oci8/oraconf.rb +1026 -0
- data/ext/oci8/oradate.c +426 -0
- data/ext/oci8/oranumber.c +445 -0
- data/ext/oci8/param.c +37 -0
- data/ext/oci8/post-config.rb +5 -0
- data/ext/oci8/server.c +182 -0
- data/ext/oci8/session.c +99 -0
- data/ext/oci8/stmt.c +624 -0
- data/ext/oci8/svcctx.c +229 -0
- data/lib/DBD/OCI8/OCI8.rb +549 -0
- data/lib/oci8.rb.in +1605 -0
- data/metaconfig +142 -0
- data/pre-distclean.rb +7 -0
- data/ruby-oci8.gemspec +54 -0
- data/ruby-oci8.spec +62 -0
- data/setup.rb +1331 -0
- data/support/README +4 -0
- data/support/runit/assert.rb +281 -0
- data/support/runit/cui/testrunner.rb +101 -0
- data/support/runit/error.rb +4 -0
- data/support/runit/method_mappable.rb +20 -0
- data/support/runit/robserver.rb +25 -0
- data/support/runit/setuppable.rb +15 -0
- data/support/runit/teardownable.rb +16 -0
- data/support/runit/testcase.rb +113 -0
- data/support/runit/testfailure.rb +25 -0
- data/support/runit/testresult.rb +121 -0
- data/support/runit/testsuite.rb +43 -0
- data/support/runit/version.rb +3 -0
- data/test/README +4 -0
- data/test/config.rb +129 -0
- data/test/test_all.rb +43 -0
- data/test/test_bind_raw.rb +53 -0
- data/test/test_bind_time.rb +191 -0
- data/test/test_break.rb +81 -0
- data/test/test_clob.rb +101 -0
- data/test/test_connstr.rb +80 -0
- data/test/test_dbi.rb +317 -0
- data/test/test_dbi_clob.rb +56 -0
- data/test/test_describe.rb +137 -0
- data/test/test_metadata.rb +243 -0
- data/test/test_oci8.rb +273 -0
- data/test/test_oradate.rb +263 -0
- data/test/test_oranumber.rb +149 -0
- metadata +118 -0
data/doc/manual.css
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
h1 {
|
2
|
+
color: #000080;
|
3
|
+
background: #e0e0ff;
|
4
|
+
border-color: #8080d0;
|
5
|
+
border-style: solid;
|
6
|
+
border-top-style: none;
|
7
|
+
border-left-style: none;
|
8
|
+
border-bottom-width: thick;
|
9
|
+
border-right-width: thin;
|
10
|
+
padding-top: 0.2em;
|
11
|
+
padding-bottom: 0.2em;
|
12
|
+
text-align: center
|
13
|
+
}
|
14
|
+
h2 {
|
15
|
+
color: #000080;
|
16
|
+
background: #e0e0ff;
|
17
|
+
border-color: #8080d0;
|
18
|
+
border-style: solid;
|
19
|
+
border-top-style: none;
|
20
|
+
border-left-style: none;
|
21
|
+
border-bottom-width: thick;
|
22
|
+
border-right-width: thin;
|
23
|
+
}
|
24
|
+
code {
|
25
|
+
color: blue
|
26
|
+
}
|
27
|
+
var {
|
28
|
+
color: brown
|
29
|
+
}
|
30
|
+
dt {
|
31
|
+
color: red
|
32
|
+
}
|
33
|
+
pre {
|
34
|
+
background: #e0ffff
|
35
|
+
}
|
data/ext/oci8/MANIFEST
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
MANIFEST
|
2
|
+
attr.c
|
3
|
+
bind.c
|
4
|
+
const.c
|
5
|
+
define.c
|
6
|
+
describe.c
|
7
|
+
descriptor.c
|
8
|
+
env.c
|
9
|
+
error.c
|
10
|
+
extconf.rb
|
11
|
+
handle.c
|
12
|
+
lob.c
|
13
|
+
oci8.c
|
14
|
+
oci8.h
|
15
|
+
oraconf.rb
|
16
|
+
oradate.c
|
17
|
+
oranumber.c
|
18
|
+
param.c
|
19
|
+
server.c
|
20
|
+
session.c
|
21
|
+
stmt.c
|
22
|
+
svcctx.c
|
data/ext/oci8/attr.c
ADDED
@@ -0,0 +1,415 @@
|
|
1
|
+
#include "oci8.h"
|
2
|
+
|
3
|
+
#define ENTRY(name, type, setter, getter) \
|
4
|
+
{"OCI_ATTR_" #name, OCI_ATTR_##name, type, setter, getter}
|
5
|
+
|
6
|
+
static VALUE get_param(oci8_handle_t *hp, ub4 attr);
|
7
|
+
static VALUE get_ub4(oci8_handle_t *hp, ub4 attr);
|
8
|
+
static VALUE get_ub2(oci8_handle_t *hp, ub4 attr);
|
9
|
+
static VALUE get_ub1(oci8_handle_t *hp, ub4 attr);
|
10
|
+
static VALUE get_sb1(oci8_handle_t *hp, ub4 attr);
|
11
|
+
static VALUE get_boolean(oci8_handle_t *hp, ub4 attr);
|
12
|
+
static VALUE get_precision(oci8_handle_t *hp, ub4 attr);
|
13
|
+
static VALUE get_string(oci8_handle_t *hp, ub4 attr);
|
14
|
+
static VALUE get_rowid(oci8_handle_t *hp, ub4 attr);
|
15
|
+
static VALUE get_oranum_as_int(oci8_handle_t *hp, ub4 attr);
|
16
|
+
static VALUE get_server(oci8_handle_t *hp, ub4 attr);
|
17
|
+
|
18
|
+
static void set_server(oci8_handle_t *hp, ub4 attr, VALUE value);
|
19
|
+
static void set_session(oci8_handle_t *hp, ub4 attr, VALUE value);
|
20
|
+
static void set_ub4(oci8_handle_t *hp, ub4 attr, VALUE value);
|
21
|
+
static void set_ub2(oci8_handle_t *hp, ub4 attr, VALUE value);
|
22
|
+
static void set_ub1(oci8_handle_t *hp, ub4 attr, VALUE value);
|
23
|
+
static void set_no_arg(oci8_handle_t *hp, ub4 attr, VALUE value);
|
24
|
+
static void set_string(oci8_handle_t *hp, ub4 attr, VALUE value);
|
25
|
+
|
26
|
+
oci8_attr_t oci8_attr_list[] = {
|
27
|
+
/* Attribute Types */
|
28
|
+
ENTRY(NONBLOCKING_MODE, ATTR_FOR_HNDL, get_boolean, set_no_arg), /* 3 */
|
29
|
+
ENTRY(SERVER, ATTR_FOR_HNDL, get_server, set_server), /* 6 */
|
30
|
+
ENTRY(SESSION, ATTR_FOR_HNDL, NULL, set_session), /* 7 */
|
31
|
+
ENTRY(ROW_COUNT, ATTR_FOR_HNDL, get_ub4, NULL), /* 9 */
|
32
|
+
ENTRY(PREFETCH_ROWS, ATTR_FOR_HNDL, NULL, set_ub4), /* 11 */
|
33
|
+
ENTRY(PREFETCH_MEMORY, ATTR_FOR_HNDL, NULL, set_ub4), /* 13 */
|
34
|
+
#ifdef OCI_ATTR_FSPRECISION
|
35
|
+
ENTRY(FSPRECISION, ATTR_FOR_DESC, get_ub1, NULL), /* 16 */
|
36
|
+
#endif
|
37
|
+
#ifdef OCI_ATTR_LFPRECISION
|
38
|
+
ENTRY(LFPRECISION, ATTR_FOR_DESC, get_ub1, NULL), /* 17 */
|
39
|
+
#endif
|
40
|
+
ENTRY(PARAM_COUNT, ATTR_FOR_HNDL, get_ub4, NULL), /* 18 */
|
41
|
+
ENTRY(ROWID, ATTR_FOR_HNDL, get_rowid, NULL), /* 19 */
|
42
|
+
ENTRY(USERNAME, ATTR_FOR_HNDL, NULL, set_string), /* 22 */
|
43
|
+
ENTRY(PASSWORD, ATTR_FOR_HNDL, NULL, set_string), /* 23 */
|
44
|
+
ENTRY(STMT_TYPE, ATTR_FOR_HNDL, get_ub2, NULL), /* 24 */
|
45
|
+
ENTRY(CHARSET_ID, ATTR_FOR_BOTH, get_ub2, set_ub2), /* 31 */
|
46
|
+
ENTRY(CHARSET_FORM, ATTR_FOR_BOTH, get_ub1, set_ub1), /* 32 */
|
47
|
+
ENTRY(MAXDATA_SIZE, ATTR_FOR_HNDL, get_ub2, NULL), /* 33 */
|
48
|
+
ENTRY(ROWS_RETURNED, ATTR_FOR_HNDL, get_ub4, NULL), /* 42 */
|
49
|
+
ENTRY(LOBEMPTY, ATTR_FOR_DESC, NULL, set_ub4), /* 45 */
|
50
|
+
ENTRY(NUM_COLS, ATTR_FOR_DESC, get_ub2, NULL), /* 102 */
|
51
|
+
ENTRY(LIST_COLUMNS, ATTR_FOR_DESC, get_param, NULL), /* 103 */
|
52
|
+
ENTRY(CLUSTERED, ATTR_FOR_DESC, get_boolean, NULL), /* 105 */
|
53
|
+
ENTRY(PARTITIONED, ATTR_FOR_DESC, get_boolean, NULL), /* 106 */
|
54
|
+
ENTRY(INDEX_ONLY, ATTR_FOR_DESC, get_boolean, NULL), /* 107 */
|
55
|
+
ENTRY(LIST_ARGUMENTS, ATTR_FOR_DESC, get_param, NULL), /* 108 */
|
56
|
+
ENTRY(LIST_SUBPROGRAMS, ATTR_FOR_DESC, get_param, NULL), /* 109 */
|
57
|
+
ENTRY(LINK, ATTR_FOR_DESC, get_string, NULL), /* 111 */
|
58
|
+
ENTRY(MIN, ATTR_FOR_DESC, get_oranum_as_int, NULL), /* 112 */
|
59
|
+
ENTRY(MAX, ATTR_FOR_DESC, get_oranum_as_int, NULL), /* 113 */
|
60
|
+
ENTRY(INCR, ATTR_FOR_DESC, get_oranum_as_int, NULL), /* 114 */
|
61
|
+
ENTRY(CACHE, ATTR_FOR_DESC, get_oranum_as_int, NULL), /* 115 */
|
62
|
+
ENTRY(ORDER, ATTR_FOR_DESC, get_boolean, NULL), /* 116 */
|
63
|
+
ENTRY(HW_MARK, ATTR_FOR_DESC, get_oranum_as_int, NULL), /* 117 */
|
64
|
+
ENTRY(NUM_PARAMS, ATTR_FOR_DESC, get_ub2, NULL), /* 121 */
|
65
|
+
ENTRY(OBJID, ATTR_FOR_DESC, get_ub4, NULL), /* 121 */
|
66
|
+
ENTRY(PTYPE, ATTR_FOR_DESC, get_ub1, NULL), /* 123 */
|
67
|
+
ENTRY(PARAM, ATTR_FOR_HNDL, get_param, NULL), /* 124 */
|
68
|
+
/* ENTRY(PARSE_ERROR_OFFSET, ATTR_FOR_HNDL, get_ub2, NULL), */ /* 129 */
|
69
|
+
#ifdef OCI_ATTR_IS_TEMPORARY
|
70
|
+
ENTRY(IS_TEMPORARY, ATTR_FOR_DESC, get_boolean, NULL), /* 130 */
|
71
|
+
#endif
|
72
|
+
#ifdef OCI_ATTR_IS_INVOKER_RIGHTS
|
73
|
+
ENTRY(IS_INVOKER_RIGHTS, ATTR_FOR_DESC, get_boolean, NULL), /* 133 */
|
74
|
+
#endif
|
75
|
+
#ifdef OCI_ATTR_OBJ_NAME
|
76
|
+
ENTRY(OBJ_NAME, ATTR_FOR_DESC, get_string, NULL), /* 134 */
|
77
|
+
#endif
|
78
|
+
#ifdef OCI_ATTR_OBJ_SCHEMA
|
79
|
+
ENTRY(OBJ_SCHEMA, ATTR_FOR_DESC, get_string, NULL), /* 135 */
|
80
|
+
#endif
|
81
|
+
#ifdef OCI_ATTR_OBJ_ID
|
82
|
+
ENTRY(OBJ_ID, ATTR_FOR_DESC, get_ub4, NULL), /* 136 */
|
83
|
+
#endif
|
84
|
+
#ifdef OCI_ATTR_STATEMENT
|
85
|
+
ENTRY(STATEMENT, ATTR_FOR_HNDL, get_string, NULL), /* 144 */
|
86
|
+
#endif
|
87
|
+
#ifdef OCI_ATTR_MAXCHAR_SIZE
|
88
|
+
ENTRY(MAXCHAR_SIZE, ATTR_FOR_HNDL, get_ub2, set_ub2), /* 163 */
|
89
|
+
#endif
|
90
|
+
#ifdef OCI_ATTR_CURRENT_POSITION
|
91
|
+
ENTRY(CURRENT_POSITION, ATTR_FOR_HNDL, get_ub4, NULL), /* 164 */
|
92
|
+
#endif
|
93
|
+
#ifdef OCI_ATTR_ROWS_FETCHED
|
94
|
+
ENTRY(ROWS_FETCHED, ATTR_FOR_HNDL, get_ub4, NULL), /* 197 */
|
95
|
+
#endif
|
96
|
+
ENTRY(DESC_PUBLIC, ATTR_FOR_HNDL, NULL, set_ub4), /* 250 */
|
97
|
+
|
98
|
+
/* Describe Handle Parameter Attributes */
|
99
|
+
ENTRY(DATA_SIZE, ATTR_FOR_DESC, get_ub2, NULL), /* 1 */
|
100
|
+
ENTRY(DATA_TYPE, ATTR_FOR_DESC, get_ub2, NULL), /* 2 */
|
101
|
+
ENTRY(NAME, ATTR_FOR_DESC, get_string, NULL), /* 4 */
|
102
|
+
ENTRY(PRECISION, ATTR_FOR_DESC, get_precision, NULL), /* 5 */
|
103
|
+
ENTRY(SCALE, ATTR_FOR_DESC, get_sb1, NULL), /* 6 */
|
104
|
+
ENTRY(IS_NULL, ATTR_FOR_DESC, get_boolean, NULL), /* 7 */
|
105
|
+
ENTRY(TYPE_NAME, ATTR_FOR_DESC, get_string, NULL), /* 8 */
|
106
|
+
ENTRY(SCHEMA_NAME, ATTR_FOR_DESC, get_string, NULL), /* 9 */
|
107
|
+
#ifdef OCI_ATTR_CHAR_USED
|
108
|
+
ENTRY(CHAR_USED, ATTR_FOR_DESC, get_boolean, NULL), /* 285 */
|
109
|
+
#endif
|
110
|
+
#ifdef OCI_ATTR_CHAR_SIZE
|
111
|
+
ENTRY(CHAR_SIZE, ATTR_FOR_DESC, get_ub2, NULL), /* 286 */
|
112
|
+
#endif
|
113
|
+
};
|
114
|
+
size_t oci8_attr_size = sizeof(oci8_attr_list) / sizeof(oci8_attr_list[0]);
|
115
|
+
|
116
|
+
static VALUE get_param(oci8_handle_t *hp, ub4 attr)
|
117
|
+
{
|
118
|
+
OCIParam *parmhp;
|
119
|
+
ub4 as = 0;
|
120
|
+
oci8_handle_t *parmh;
|
121
|
+
oci8_handle_t *parenth;
|
122
|
+
sword rv;
|
123
|
+
|
124
|
+
rv = OCIAttrGet(hp->hp, hp->type, &parmhp, &as, attr, hp->errhp);
|
125
|
+
if (rv != OCI_SUCCESS)
|
126
|
+
oci8_raise(hp->errhp, rv, NULL);
|
127
|
+
|
128
|
+
for (parenth = hp;parenth->type == OCI_DTYPE_PARAM;parenth = parenth->parent);
|
129
|
+
parmh = oci8_make_handle(OCI_DTYPE_PARAM, parmhp, hp->errhp, parenth, 0);
|
130
|
+
return parmh->self;
|
131
|
+
}
|
132
|
+
|
133
|
+
#if 0
|
134
|
+
#define DEFINE_GETTER_FUNC_FOR_NUMBER(attrtype) \
|
135
|
+
static VALUE get_##attrtype(oci8_handle_t *h, ub4 attr) \
|
136
|
+
{ \
|
137
|
+
attrtype av;
|
138
|
+
ub4 as = 0; \
|
139
|
+
sword rv; \
|
140
|
+
\
|
141
|
+
rv = OCIAttrGet(h->hp, h->type, &av, &as, attr, h->errhp); \
|
142
|
+
if (rv != OCI_SUCCESS) \
|
143
|
+
oci8_raise(h->errhp, rv, NULL); \
|
144
|
+
return INT2FIX(av); \
|
145
|
+
}
|
146
|
+
#else
|
147
|
+
#define MARKER_1 0xFE
|
148
|
+
#define MARKER_2 0xEF
|
149
|
+
#define DEFINE_GETTER_FUNC_FOR_NUMBER(attrtype) \
|
150
|
+
static VALUE get_##attrtype(oci8_handle_t *h, ub4 attr) \
|
151
|
+
{ \
|
152
|
+
union { \
|
153
|
+
attrtype v; \
|
154
|
+
unsigned char s[sizeof(attrtype) + 1]; \
|
155
|
+
} av; \
|
156
|
+
ub4 as = 0; \
|
157
|
+
sword rv; \
|
158
|
+
\
|
159
|
+
memset(&av, MARKER_1, sizeof(av)); \
|
160
|
+
rv = OCIAttrGet(h->hp, h->type, &av, &as, attr, h->errhp); \
|
161
|
+
if (rv != OCI_SUCCESS) \
|
162
|
+
oci8_raise(h->errhp, rv, NULL); \
|
163
|
+
if (av.s[sizeof(attrtype)] != MARKER_1) \
|
164
|
+
rb_bug("overwrite in get_" #attrtype " for %d", attr); \
|
165
|
+
if (av.s[sizeof(attrtype) -1] == MARKER_1) { \
|
166
|
+
/* if not overwrited, set another value and retry */ \
|
167
|
+
av.s[sizeof(attrtype) -1] = MARKER_2; \
|
168
|
+
rv = OCIAttrGet(h->hp, h->type, &av, &as, attr, h->errhp); \
|
169
|
+
if (av.s[sizeof(attrtype) -1] == MARKER_2) \
|
170
|
+
rb_bug("specified size is too small in get_" #attrtype " for %d", attr); \
|
171
|
+
} \
|
172
|
+
return INT2FIX(av.v); \
|
173
|
+
}
|
174
|
+
#endif
|
175
|
+
|
176
|
+
DEFINE_GETTER_FUNC_FOR_NUMBER(ub4)
|
177
|
+
DEFINE_GETTER_FUNC_FOR_NUMBER(ub2)
|
178
|
+
DEFINE_GETTER_FUNC_FOR_NUMBER(ub1)
|
179
|
+
DEFINE_GETTER_FUNC_FOR_NUMBER(sb1)
|
180
|
+
|
181
|
+
static VALUE get_boolean(oci8_handle_t *h, ub4 attr)
|
182
|
+
{
|
183
|
+
sb1 av;
|
184
|
+
ub4 as = 0;
|
185
|
+
sword rv;
|
186
|
+
|
187
|
+
rv = OCIAttrGet(h->hp, h->type, &av, &as, attr, h->errhp);
|
188
|
+
if (rv != OCI_SUCCESS)
|
189
|
+
oci8_raise(h->errhp, rv, NULL);
|
190
|
+
return av ? Qtrue : Qfalse;
|
191
|
+
}
|
192
|
+
|
193
|
+
static VALUE get_precision(oci8_handle_t *h, ub4 attr)
|
194
|
+
{
|
195
|
+
union {
|
196
|
+
sb1 _sb1;
|
197
|
+
sb2 _sb2;
|
198
|
+
unsigned char s[sizeof(sb2) + 1];
|
199
|
+
} av;
|
200
|
+
ub4 as = 0;
|
201
|
+
int size = sizeof(sb1);
|
202
|
+
int is_implicit = 0;
|
203
|
+
sword rv;
|
204
|
+
|
205
|
+
if (h->type == OCI_DTYPE_PARAM) {
|
206
|
+
if (h->u.param.is_implicit) {
|
207
|
+
is_implicit = 1;
|
208
|
+
size = sizeof(sb2);
|
209
|
+
}
|
210
|
+
}
|
211
|
+
|
212
|
+
/* runtime check */
|
213
|
+
memset(&av, MARKER_1, sizeof(av));
|
214
|
+
rv = OCIAttrGet(h->hp, h->type, &av, &as, attr, h->errhp);
|
215
|
+
if (rv != OCI_SUCCESS)
|
216
|
+
oci8_raise(h->errhp, rv, NULL);
|
217
|
+
if (av.s[size] != MARKER_1)
|
218
|
+
rb_bug("overwrite in get_precision for %d(%s)", attr, is_implicit ? "implicit" : "explicit");
|
219
|
+
if (av.s[size -1] == MARKER_1) {
|
220
|
+
/* if not overwrited, set another value and retry */
|
221
|
+
av.s[size -1] = MARKER_2;
|
222
|
+
rv = OCIAttrGet(h->hp, h->type, &av, &as, attr, h->errhp);
|
223
|
+
if (av.s[size -1] == MARKER_2)
|
224
|
+
rb_bug("specified size is too small in get_precision for %d(%s)", attr, is_implicit ? "implicit" : "explicit");
|
225
|
+
}
|
226
|
+
if (!is_implicit) {
|
227
|
+
return INT2FIX(av._sb1);
|
228
|
+
} else {
|
229
|
+
return INT2FIX(av._sb2);
|
230
|
+
}
|
231
|
+
}
|
232
|
+
|
233
|
+
static VALUE get_string(oci8_handle_t *h, ub4 attr)
|
234
|
+
{
|
235
|
+
text *txt;
|
236
|
+
ub4 size;
|
237
|
+
sword rv;
|
238
|
+
|
239
|
+
rv = OCIAttrGet(h->hp, h->type, &txt, &size, attr, h->errhp);
|
240
|
+
if (rv != OCI_SUCCESS)
|
241
|
+
oci8_raise(h->errhp, rv, NULL);
|
242
|
+
return rb_str_new(TO_CHARPTR(txt), size);
|
243
|
+
}
|
244
|
+
|
245
|
+
static VALUE get_rowid(oci8_handle_t *h, ub4 attr)
|
246
|
+
{
|
247
|
+
OCIRowid *rowidhp;
|
248
|
+
oci8_handle_t *rowidh;
|
249
|
+
oci8_handle_t *envh;
|
250
|
+
sword rv;
|
251
|
+
|
252
|
+
/* get environment handle */
|
253
|
+
for (envh = h; envh->type != OCI_HTYPE_ENV; envh = envh->parent);
|
254
|
+
rv = OCIDescriptorAlloc(envh->hp, (void *)&rowidhp, OCI_DTYPE_ROWID, 0, NULL);
|
255
|
+
if (rv != OCI_SUCCESS) {
|
256
|
+
oci8_env_raise(envh->hp, rv);
|
257
|
+
}
|
258
|
+
rv = OCIAttrGet(h->hp, h->type, rowidhp, 0, attr, h->errhp);
|
259
|
+
if (rv != OCI_SUCCESS) {
|
260
|
+
OCIDescriptorFree(rowidhp, OCI_DTYPE_ROWID);
|
261
|
+
oci8_raise(h->errhp, rv, NULL);
|
262
|
+
}
|
263
|
+
rowidh = oci8_make_handle(OCI_DTYPE_ROWID, rowidhp, h->errhp, envh, 0);
|
264
|
+
return rowidh->self;
|
265
|
+
}
|
266
|
+
|
267
|
+
static VALUE get_oranum_as_int(oci8_handle_t *h, ub4 attr) {
|
268
|
+
ora_number_t *av;
|
269
|
+
ub4 as = 0;
|
270
|
+
sword rv;
|
271
|
+
char buf[ORA_NUMBER_BUF_SIZE];
|
272
|
+
size_t len;
|
273
|
+
|
274
|
+
rv = OCIAttrGet(h->hp, h->type, &av, &as, attr, h->errhp);
|
275
|
+
if (rv != OCI_SUCCESS)
|
276
|
+
oci8_raise(h->errhp, rv, NULL);
|
277
|
+
ora_number_to_str(TO_ORATEXT(buf), &len, av, as);
|
278
|
+
return rb_cstr2inum(buf, 10);
|
279
|
+
}
|
280
|
+
|
281
|
+
static VALUE get_server(oci8_handle_t *h, ub4 attr)
|
282
|
+
{
|
283
|
+
oci8_handle_t *hv;
|
284
|
+
void *hp;
|
285
|
+
sword rv;
|
286
|
+
|
287
|
+
rv = OCIAttrGet(h->hp, h->type, &hp, 0, attr, h->errhp);
|
288
|
+
if (rv != OCI_SUCCESS)
|
289
|
+
oci8_raise(h->errhp, rv, NULL);
|
290
|
+
hv = oci8_make_handle(OCI_HTYPE_SERVER, hp, h->errhp, h, 0);
|
291
|
+
return hv->self;
|
292
|
+
}
|
293
|
+
|
294
|
+
static void set_server(oci8_handle_t *h, ub4 attr, VALUE value)
|
295
|
+
{
|
296
|
+
oci8_handle_t *hv;
|
297
|
+
sword rv;
|
298
|
+
|
299
|
+
Check_Handle(value, OCIServer, hv);
|
300
|
+
rv = OCIAttrSet(h->hp, h->type, hv->hp, 0, attr, h->errhp);
|
301
|
+
if (rv != OCI_SUCCESS)
|
302
|
+
oci8_raise(h->errhp, rv, NULL);
|
303
|
+
}
|
304
|
+
|
305
|
+
static void set_session(oci8_handle_t *h, ub4 attr, VALUE value)
|
306
|
+
{
|
307
|
+
oci8_handle_t *hv;
|
308
|
+
sword rv;
|
309
|
+
|
310
|
+
Check_Handle(value, OCISession, hv);
|
311
|
+
rv = OCIAttrSet(h->hp, h->type, hv->hp, 0, attr, h->errhp);
|
312
|
+
if (rv != OCI_SUCCESS)
|
313
|
+
oci8_raise(h->errhp, rv, NULL);
|
314
|
+
}
|
315
|
+
|
316
|
+
#define DEFINE_SETTER_FUNC_FOR_NUMBER(attrtype) \
|
317
|
+
static void set_##attrtype(oci8_handle_t *h, ub4 attr, VALUE value) \
|
318
|
+
{ \
|
319
|
+
attrtype hv; \
|
320
|
+
sword rv; \
|
321
|
+
\
|
322
|
+
hv = NUM2INT(value); \
|
323
|
+
rv = OCIAttrSet(h->hp, h->type, &hv, sizeof(attrtype), attr, h->errhp); \
|
324
|
+
if (rv != OCI_SUCCESS) \
|
325
|
+
oci8_raise(h->errhp, rv, NULL); \
|
326
|
+
}
|
327
|
+
|
328
|
+
DEFINE_SETTER_FUNC_FOR_NUMBER(ub4)
|
329
|
+
DEFINE_SETTER_FUNC_FOR_NUMBER(ub2)
|
330
|
+
DEFINE_SETTER_FUNC_FOR_NUMBER(ub1)
|
331
|
+
|
332
|
+
static void set_no_arg(oci8_handle_t *h, ub4 attr, VALUE value)
|
333
|
+
{
|
334
|
+
sword rv;
|
335
|
+
|
336
|
+
if (!NIL_P(value)) {
|
337
|
+
rb_raise(rb_eArgError, "invalid argument %s (expect nil: this attribute value is ignored, so set nil)", rb_class2name(CLASS_OF(value)));
|
338
|
+
}
|
339
|
+
rv = OCIAttrSet(h->hp, h->type, 0, 0, attr, h->errhp);
|
340
|
+
if (rv != OCI_SUCCESS)
|
341
|
+
oci8_raise(h->errhp, rv, NULL);
|
342
|
+
}
|
343
|
+
|
344
|
+
static void set_string(oci8_handle_t *h, ub4 attr, VALUE value)
|
345
|
+
{
|
346
|
+
sword rv;
|
347
|
+
|
348
|
+
Check_Type(value, T_STRING);
|
349
|
+
rv = OCIAttrSet(h->hp, h->type, RSTRING_PTR(value), RSTRING_LEN(value), attr, h->errhp);
|
350
|
+
if (rv != OCI_SUCCESS)
|
351
|
+
oci8_raise(h->errhp, rv, NULL);
|
352
|
+
}
|
353
|
+
|
354
|
+
VALUE oci8_attr_set(VALUE self, VALUE vtype, VALUE value)
|
355
|
+
{
|
356
|
+
oci8_handle_t *h;
|
357
|
+
ub4 type;
|
358
|
+
char attr_type_flag;
|
359
|
+
|
360
|
+
Get_Handle(self, h); /* 0 */
|
361
|
+
type = NUM2UINT(vtype); /* 1 */
|
362
|
+
|
363
|
+
/* check range. */
|
364
|
+
if (oci8_attr_size <= type)
|
365
|
+
rb_raise(rb_eArgError, "invalid OCI_ATTR_ type");
|
366
|
+
|
367
|
+
/* check attribute type */
|
368
|
+
if (h->type < OCI_DTYPE_FIRST)
|
369
|
+
attr_type_flag = ATTR_FOR_HNDL;
|
370
|
+
else
|
371
|
+
attr_type_flag = ATTR_FOR_DESC;
|
372
|
+
if (!(oci8_attr_list[type].attr_type & attr_type_flag))
|
373
|
+
rb_raise(rb_eArgError, "invalid OCI_ATTR_ type");
|
374
|
+
|
375
|
+
if (oci8_attr_list[type].set == NULL)
|
376
|
+
rb_raise(rb_eArgError, "attrSet is not permitted for %s", oci8_attr_list[type].name);
|
377
|
+
|
378
|
+
oci8_attr_list[type].set(h, oci8_attr_list[type].attr, value);
|
379
|
+
|
380
|
+
switch (oci8_attr_list[type].attr) {
|
381
|
+
case OCI_ATTR_SERVER:
|
382
|
+
rb_ivar_set(self, oci8_id_server, value);
|
383
|
+
break;
|
384
|
+
case OCI_ATTR_SESSION:
|
385
|
+
rb_ivar_set(self, oci8_id_session, value);
|
386
|
+
break;
|
387
|
+
}
|
388
|
+
return self;
|
389
|
+
}
|
390
|
+
|
391
|
+
VALUE oci8_attr_get(VALUE self, VALUE vtype)
|
392
|
+
{
|
393
|
+
oci8_handle_t *h;
|
394
|
+
ub4 type;
|
395
|
+
char attr_type_flag;
|
396
|
+
|
397
|
+
Get_Handle(self, h); /* 0 */
|
398
|
+
type = NUM2UINT(vtype); /* 1 */
|
399
|
+
|
400
|
+
/* check range. */
|
401
|
+
if (oci8_attr_size <= type)
|
402
|
+
rb_raise(rb_eArgError, "invalid OCI_ATTR_ type");
|
403
|
+
|
404
|
+
/* check attribute type */
|
405
|
+
if (h->type < OCI_DTYPE_FIRST)
|
406
|
+
attr_type_flag = ATTR_FOR_HNDL;
|
407
|
+
else
|
408
|
+
attr_type_flag = ATTR_FOR_DESC;
|
409
|
+
if (!(oci8_attr_list[type].attr_type & attr_type_flag))
|
410
|
+
rb_raise(rb_eArgError, "invalid OCI_ATTR_ type");
|
411
|
+
|
412
|
+
if (oci8_attr_list[type].get == NULL)
|
413
|
+
rb_raise(rb_eArgError, "attrGet is not permitted for %s", oci8_attr_list[type].name);
|
414
|
+
return oci8_attr_list[type].get(h, oci8_attr_list[type].attr);
|
415
|
+
}
|