ruby-oci8 1.0.7 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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/attr.c
CHANGED
@@ -1,415 +1,155 @@
|
|
1
|
+
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
|
+
/*
|
3
|
+
* attr.c
|
4
|
+
*
|
5
|
+
* $Author: kubo $
|
6
|
+
* $Date: 2009-01-12 00:11:09 +0900 (Mon, 12 Jan 2009) $
|
7
|
+
*
|
8
|
+
* Copyright (C) 2002-2007 KUBO Takehiro <kubo@jiubao.org>
|
9
|
+
*/
|
1
10
|
#include "oci8.h"
|
2
11
|
|
3
|
-
|
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)
|
12
|
+
VALUE oci8_get_sb1_attr(oci8_base_t *base, ub4 attrtype)
|
182
13
|
{
|
183
|
-
|
184
|
-
|
185
|
-
sword rv;
|
14
|
+
sb1 val;
|
15
|
+
sword rv;
|
186
16
|
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
17
|
+
rv = OCIAttrGet(base->hp.ptr, base->type, &val, NULL, attrtype, oci8_errhp);
|
18
|
+
if (rv != OCI_SUCCESS)
|
19
|
+
oci8_raise(oci8_errhp, rv, NULL);
|
20
|
+
return INT2FIX(val);
|
191
21
|
}
|
192
22
|
|
193
|
-
|
23
|
+
VALUE oci8_get_ub2_attr(oci8_base_t *base, ub4 attrtype)
|
194
24
|
{
|
195
|
-
|
196
|
-
|
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
|
-
}
|
25
|
+
ub2 val;
|
26
|
+
sword rv;
|
211
27
|
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
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
|
-
}
|
28
|
+
rv = OCIAttrGet(base->hp.ptr, base->type, &val, NULL, attrtype, oci8_errhp);
|
29
|
+
if (rv != OCI_SUCCESS)
|
30
|
+
oci8_raise(oci8_errhp, rv, NULL);
|
31
|
+
return INT2FIX(val);
|
231
32
|
}
|
232
33
|
|
233
|
-
|
34
|
+
VALUE oci8_get_sb2_attr(oci8_base_t *base, ub4 attrtype)
|
234
35
|
{
|
235
|
-
|
236
|
-
|
237
|
-
sword rv;
|
36
|
+
sb2 val;
|
37
|
+
sword rv;
|
238
38
|
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
39
|
+
rv = OCIAttrGet(base->hp.ptr, base->type, &val, NULL, attrtype, oci8_errhp);
|
40
|
+
if (rv != OCI_SUCCESS)
|
41
|
+
oci8_raise(oci8_errhp, rv, NULL);
|
42
|
+
return INT2FIX(val);
|
243
43
|
}
|
244
44
|
|
245
|
-
|
45
|
+
VALUE oci8_get_ub4_attr(oci8_base_t *base, ub4 attrtype)
|
246
46
|
{
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
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);
|
47
|
+
ub4 val;
|
48
|
+
sword rv;
|
49
|
+
|
50
|
+
rv = OCIAttrGet(base->hp.ptr, base->type, &val, NULL, attrtype, oci8_errhp);
|
51
|
+
if (rv != OCI_SUCCESS)
|
52
|
+
oci8_raise(oci8_errhp, rv, NULL);
|
53
|
+
#if SIZEOF_LONG > 4
|
54
|
+
return LONG2FIX(val);
|
55
|
+
#else
|
56
|
+
return ULONG2NUM(val);
|
57
|
+
#endif
|
303
58
|
}
|
304
59
|
|
305
|
-
|
60
|
+
VALUE oci8_get_string_attr(oci8_base_t *base, ub4 attrtype)
|
306
61
|
{
|
307
|
-
|
308
|
-
|
62
|
+
text *val;
|
63
|
+
ub4 size;
|
64
|
+
sword rv;
|
309
65
|
|
310
|
-
|
311
|
-
|
312
|
-
|
313
|
-
|
66
|
+
rv = OCIAttrGet(base->hp.ptr, base->type, &val, &size, attrtype, oci8_errhp);
|
67
|
+
if (rv != OCI_SUCCESS)
|
68
|
+
oci8_raise(oci8_errhp, rv, NULL);
|
69
|
+
return rb_external_str_new_with_enc(TO_CHARPTR(val), size, oci8_encoding);
|
314
70
|
}
|
315
71
|
|
316
|
-
#define
|
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
|
-
}
|
72
|
+
#define MAX_ROWID_LEN 128
|
327
73
|
|
328
|
-
|
329
|
-
|
330
|
-
|
74
|
+
typedef struct {
|
75
|
+
oci8_base_t *base;
|
76
|
+
ub4 attrtype;
|
77
|
+
OCIRowid *ridp;
|
78
|
+
} rowid_arg_t;
|
331
79
|
|
332
|
-
static
|
80
|
+
static VALUE get_rowid_attr(rowid_arg_t *arg)
|
333
81
|
{
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
{
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
82
|
+
oci8_base_t *base = arg->base;
|
83
|
+
ub4 attrtype = arg->attrtype;
|
84
|
+
char buf[MAX_ROWID_LEN];
|
85
|
+
ub2 buflen;
|
86
|
+
sword rv;
|
87
|
+
|
88
|
+
/* get a rowid descriptor from OCIHandle */
|
89
|
+
rv = OCIDescriptorAlloc(oci8_envhp, (dvoid*)&arg->ridp, OCI_DTYPE_ROWID, 0, NULL);
|
90
|
+
if (rv != OCI_SUCCESS)
|
91
|
+
oci8_env_raise(oci8_envhp, rv);
|
92
|
+
rv = OCIAttrGet(base->hp.ptr, base->type, arg->ridp, 0, attrtype, oci8_errhp);
|
93
|
+
if (rv != OCI_SUCCESS) {
|
94
|
+
oci8_raise(oci8_errhp, rv, NULL);
|
95
|
+
}
|
96
|
+
/* convert the rowid descriptor to a string. */
|
97
|
+
if (have_OCIRowidToChar) {
|
98
|
+
/* If OCIRowidToChar is available, use it. */
|
99
|
+
buflen = MAX_ROWID_LEN;
|
100
|
+
rv = OCIRowidToChar(arg->ridp, TO_ORATEXT(buf), &buflen, oci8_errhp);
|
101
|
+
if (rv != OCI_SUCCESS) {
|
102
|
+
oci8_raise(oci8_errhp, rv, NULL);
|
103
|
+
}
|
104
|
+
} else {
|
105
|
+
/* If OCIRowidToChar is not available, convert it on
|
106
|
+
* Oracle Server.
|
107
|
+
*/
|
108
|
+
oci8_base_t *svc;
|
109
|
+
oci8_exec_sql_var_t bind_vars[2];
|
110
|
+
|
111
|
+
/* search a connection from the handle */
|
112
|
+
svc = base;
|
113
|
+
while (svc->type != OCI_HTYPE_SVCCTX) {
|
114
|
+
svc = svc->parent;
|
115
|
+
if (svc == NULL) {
|
116
|
+
rb_raise(rb_eRuntimeError, "No connection is found!!");
|
117
|
+
}
|
118
|
+
}
|
119
|
+
/* :strval */
|
120
|
+
bind_vars[0].valuep = buf;
|
121
|
+
bind_vars[0].value_sz = sizeof(buf);
|
122
|
+
bind_vars[0].dty = SQLT_CHR;
|
123
|
+
bind_vars[0].indp = NULL;
|
124
|
+
bind_vars[0].alenp = &buflen;
|
125
|
+
/* :rowid */
|
126
|
+
bind_vars[1].valuep = &arg->ridp;
|
127
|
+
bind_vars[1].value_sz = sizeof(void *);
|
128
|
+
bind_vars[1].dty = SQLT_RDD;
|
129
|
+
bind_vars[1].indp = NULL;
|
130
|
+
bind_vars[1].alenp = NULL;
|
131
|
+
/* convert the rowid descriptor to a string value by querying Oracle server. */
|
132
|
+
oci8_exec_sql((oci8_svcctx_t*)svc, "BEGIN :strval := :rowid; END;", 0, NULL, 2, bind_vars, 1);
|
133
|
+
if (buflen == 0) {
|
134
|
+
return Qnil;
|
135
|
+
}
|
136
|
+
}
|
137
|
+
return rb_external_str_new_with_enc(buf, buflen, rb_usascii_encoding());
|
352
138
|
}
|
353
139
|
|
354
|
-
VALUE
|
140
|
+
static VALUE rowid_ensure(rowid_arg_t *arg)
|
355
141
|
{
|
356
|
-
|
357
|
-
|
358
|
-
|
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;
|
142
|
+
if (arg->ridp != NULL) {
|
143
|
+
OCIDescriptorFree(arg->ridp, OCI_DTYPE_ROWID);
|
144
|
+
}
|
145
|
+
return Qnil;
|
389
146
|
}
|
390
147
|
|
391
|
-
VALUE
|
148
|
+
VALUE oci8_get_rowid_attr(oci8_base_t *base, ub4 attrtype)
|
392
149
|
{
|
393
|
-
|
394
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
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);
|
150
|
+
rowid_arg_t arg;
|
151
|
+
arg.base = base;
|
152
|
+
arg.attrtype = attrtype;
|
153
|
+
arg.ridp = NULL;
|
154
|
+
return rb_ensure(get_rowid_attr, (VALUE)&arg, rowid_ensure, (VALUE)&arg);
|
415
155
|
}
|