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.
Files changed (89) hide show
  1. data/ChangeLog +1254 -390
  2. data/Makefile +10 -13
  3. data/README +56 -385
  4. data/VERSION +1 -1
  5. data/dist-files +26 -27
  6. data/ext/oci8/.document +1 -0
  7. data/ext/oci8/MANIFEST +0 -4
  8. data/ext/oci8/apiwrap.c.tmpl +172 -0
  9. data/ext/oci8/apiwrap.h.tmpl +61 -0
  10. data/ext/oci8/apiwrap.rb +91 -0
  11. data/ext/oci8/apiwrap.yml +1243 -0
  12. data/ext/oci8/attr.c +124 -384
  13. data/ext/oci8/bind.c +472 -164
  14. data/ext/oci8/encoding.c +196 -0
  15. data/ext/oci8/env.c +84 -253
  16. data/ext/oci8/error.c +196 -127
  17. data/ext/oci8/extconf.rb +82 -59
  18. data/ext/oci8/lob.c +710 -370
  19. data/ext/oci8/metadata.c +359 -0
  20. data/ext/oci8/object.c +622 -0
  21. data/ext/oci8/oci8.c +577 -161
  22. data/ext/oci8/oci8.h +354 -258
  23. data/ext/oci8/oci8lib.c +493 -0
  24. data/ext/oci8/ocidatetime.c +473 -0
  25. data/ext/oci8/ocinumber.c +1123 -24
  26. data/ext/oci8/oraconf.rb +72 -106
  27. data/ext/oci8/oradate.c +511 -321
  28. data/ext/oci8/stmt.c +752 -572
  29. data/ext/oci8/win32.c +131 -0
  30. data/ext/oci8/xmldb.c +383 -0
  31. data/lib/.document +2 -0
  32. data/lib/dbd/OCI8.rb +2 -17
  33. data/lib/oci8.rb.in +41 -1622
  34. data/lib/oci8/.document +5 -0
  35. data/lib/oci8/compat.rb +108 -0
  36. data/lib/oci8/datetime.rb +489 -0
  37. data/lib/oci8/encoding-init.rb +40 -0
  38. data/lib/oci8/encoding.yml +537 -0
  39. data/lib/oci8/metadata.rb +2077 -0
  40. data/lib/oci8/object.rb +548 -0
  41. data/lib/oci8/oci8.rb +773 -0
  42. data/lib/oci8/oracle_version.rb +144 -0
  43. data/metaconfig +3 -3
  44. data/ruby-oci8.gemspec +5 -5
  45. data/setup.rb +4 -4
  46. data/test/config.rb +64 -84
  47. data/test/test_all.rb +14 -21
  48. data/test/test_array_dml.rb +317 -0
  49. data/test/test_bind_raw.rb +18 -25
  50. data/test/test_bind_time.rb +78 -91
  51. data/test/test_break.rb +37 -35
  52. data/test/test_clob.rb +33 -89
  53. data/test/test_connstr.rb +5 -4
  54. data/test/test_datetime.rb +469 -0
  55. data/test/test_dbi.rb +99 -60
  56. data/test/test_dbi_clob.rb +3 -8
  57. data/test/test_metadata.rb +65 -51
  58. data/test/test_oci8.rb +151 -55
  59. data/test/test_oracle_version.rb +70 -0
  60. data/test/test_oradate.rb +76 -83
  61. data/test/test_oranumber.rb +405 -71
  62. data/test/test_rowid.rb +6 -11
  63. metadata +31 -32
  64. data/NEWS +0 -420
  65. data/ext/oci8/const.c +0 -165
  66. data/ext/oci8/define.c +0 -53
  67. data/ext/oci8/describe.c +0 -81
  68. data/ext/oci8/descriptor.c +0 -39
  69. data/ext/oci8/handle.c +0 -273
  70. data/ext/oci8/oranumber.c +0 -445
  71. data/ext/oci8/param.c +0 -37
  72. data/ext/oci8/server.c +0 -182
  73. data/ext/oci8/session.c +0 -99
  74. data/ext/oci8/svcctx.c +0 -238
  75. data/ruby-oci8.spec +0 -62
  76. data/support/README +0 -4
  77. data/support/runit/assert.rb +0 -281
  78. data/support/runit/cui/testrunner.rb +0 -101
  79. data/support/runit/error.rb +0 -4
  80. data/support/runit/method_mappable.rb +0 -20
  81. data/support/runit/robserver.rb +0 -25
  82. data/support/runit/setuppable.rb +0 -15
  83. data/support/runit/teardownable.rb +0 -16
  84. data/support/runit/testcase.rb +0 -113
  85. data/support/runit/testfailure.rb +0 -25
  86. data/support/runit/testresult.rb +0 -121
  87. data/support/runit/testsuite.rb +0 -43
  88. data/support/runit/version.rb +0 -3
  89. data/test/test_describe.rb +0 -137
@@ -1,14 +1,13 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
1
2
  /*
2
3
  oci8.h - part of ruby-oci8
3
4
 
4
- Copyright (C) 2002-2006 KUBO Takehiro <kubo@jiubao.org>
5
+ Copyright (C) 2002-2009 KUBO Takehiro <kubo@jiubao.org>
5
6
  */
6
7
  #ifndef _RUBY_OCI_H_
7
8
  #define _RUBY_OCI_H_ 1
8
9
 
9
10
  #include "ruby.h"
10
- #include "rubyio.h"
11
- #include "intern.h"
12
11
 
13
12
  #ifndef rb_pid_t
14
13
  #ifdef WIN32
@@ -20,31 +19,49 @@
20
19
 
21
20
  #include <stdio.h>
22
21
  #include <stdlib.h>
22
+ #include <assert.h>
23
+
23
24
  #ifdef __cplusplus
24
- extern "C" {
25
+ extern "C"
26
+ {
25
27
  #endif
26
28
  #include <oci.h>
27
29
  #ifdef __cplusplus
28
30
  }
29
31
  #endif
32
+ #ifdef HAVE_XMLOTN_H
33
+ #include "xmlotn.h"
34
+ #endif
35
+
36
+ #define ORAVERNUM(major, minor, update, patch, port_update) \
37
+ (((major) << 24) | ((minor) << 20) | ((update) << 12) | ((patch) << 8) | (port_update))
38
+
39
+ #define ORAVER_8_0 ORAVERNUM(8, 0, 0, 0, 0)
40
+ #define ORAVER_8_1 ORAVERNUM(8, 1, 0, 0, 0)
41
+ #define ORAVER_9_0 ORAVERNUM(9, 0, 0, 0, 0)
42
+ #define ORAVER_9_2 ORAVERNUM(9, 2, 0, 0, 0)
43
+ #define ORAVER_10_1 ORAVERNUM(10, 1, 0, 0, 0)
44
+ #define ORAVER_10_2 ORAVERNUM(10, 2, 0, 0, 0)
45
+ #define ORAVER_11_1 ORAVERNUM(11, 1, 0, 0, 0)
46
+
30
47
  #include "extconf.h"
48
+ #ifdef HAVE_TYPE_RB_ENCODING
49
+ #include <ruby/encoding.h>
50
+ #endif
31
51
 
32
- #ifdef StringValue
33
- /* ruby 1.8 or later */
34
- #define RBOCI_NORETURN(x) NORETURN(x)
35
- #else
36
- /* ruby 1.6 */
37
- #define RBOCI_NORETURN(x) x NORETURN
38
- #define rb_cstr_to_dbl(p, ignore) strtod((p), 0)
52
+ #if ACTUAL_ORACLE_CLIENT_VERSION < ORAVER_10_2
53
+ typedef struct OCIAdmin OCIAdmin;
39
54
  #endif
40
55
 
56
+ /* new macros in ruby 1.8.6.
57
+ * define compatible macros for ruby 1.8.5 or lower.
58
+ */
41
59
  #ifndef RSTRING_PTR
42
60
  #define RSTRING_PTR(obj) RSTRING(obj)->ptr
43
61
  #endif
44
62
  #ifndef RSTRING_LEN
45
63
  #define RSTRING_LEN(obj) RSTRING(obj)->len
46
64
  #endif
47
-
48
65
  #ifndef RARRAY_PTR
49
66
  #define RARRAY_PTR(obj) RARRAY(obj)->ptr
50
67
  #endif
@@ -52,16 +69,49 @@ extern "C" {
52
69
  #define RARRAY_LEN(obj) RARRAY(obj)->len
53
70
  #endif
54
71
 
55
- #ifndef RB_GC_GUARD
56
- #define RB_GC_GUARD(v) (*(volatile VALUE *)&(v))
72
+ /* new macros in ruby 1.9.
73
+ * define compatible macros for ruby 1.8 or lower.
74
+ */
75
+ #ifndef RCLASS_SUPER
76
+ #define RCLASS_SUPER(c) RCLASS(c)->super
77
+ #endif
78
+ #ifndef RFLOAT_VALUE
79
+ #define RFLOAT_VALUE(obj) RFLOAT(obj)->value
57
80
  #endif
58
81
 
59
- #ifndef HAVE_TYPE_ORATEXT
60
- typedef unsigned char oratext;
82
+ /* new functions in ruby 1.9.
83
+ * define compatible macros for ruby 1.8 or lower.
84
+ */
85
+ #if !defined(HAVE_RB_ERRINFO) && defined(HAVE_RUBY_ERRINFO)
86
+ #define rb_errinfo() ruby_errinfo
87
+ #endif
88
+ #ifndef RUBY_VM
89
+ typedef VALUE rb_blocking_function_t(void *);
61
90
  #endif
62
91
 
63
- #define IS_OCI_ERROR(v) (((v) != OCI_SUCCESS) && ((v) != OCI_SUCCESS_WITH_INFO))
92
+ #ifndef HAVE_TYPE_RB_ENCODING
93
+ #define rb_enc_associate(str, enc) do {} while(0)
94
+ #define rb_external_str_new_with_enc(ptr, len, enc) rb_tainted_str_new((ptr), (len))
95
+ #define rb_locale_str_new_cstr(ptr) rb_str_new2(ptr)
96
+ #define rb_str_conv_enc(str, from, to) (str)
97
+ #define rb_usascii_str_new(ptr, len) rb_str_new((ptr), (len))
98
+ #define rb_usascii_str_new_cstr(ptr) rb_str_new2(ptr)
99
+ #endif
64
100
 
101
+ /* macros depends on the compiler.
102
+ * LIKELY(x) hint for the compiler that 'x' is 1(TRUE) in many cases.
103
+ * UNLIKELY(x) hint for the compiler that 'x' is 0(FALSE) in many cases.
104
+ * ALWAYS_INLINE forcely inline the function.
105
+ */
106
+ #if defined(__GNUC__) && ((__GNUC__ > 2) || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
107
+ /* gcc version >= 2.96 */
108
+ #define LIKELY(x) (__builtin_expect((x), 1))
109
+ #define UNLIKELY(x) (__builtin_expect((x), 0))
110
+ #else
111
+ /* other compilers */
112
+ #define LIKELY(x) (x)
113
+ #define UNLIKELY(x) (x)
114
+ #endif
65
115
  #if defined(__GNUC__) && ((__GNUC__ > 3) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1))
66
116
  /* gcc version >= 3.1 */
67
117
  #define ALWAYS_INLINE inline __attribute__((always_inline))
@@ -71,294 +121,340 @@ typedef unsigned char oratext;
71
121
  #define ALWAYS_INLINE __forceinline
72
122
  #endif
73
123
 
74
- #ifdef ALWAYS_INLINE
75
- /*
76
- * I don't like cast because it can suppress warnings but may hide bugs.
77
- * These macros make warnings when the source type is invalid.
124
+ /* macros to access thread-local storage.
125
+ *
126
+ * int oci8_tls_key_init(oci8_tls_key_t *key);
127
+ * initialie a key to access thread-local storege
128
+ * This returns 0 on success or error number.
129
+ *
130
+ * void *oci8_tls_get(oci8_tls_key_t key);
131
+ * get a value associated with the key.
132
+ *
133
+ * void oci8_tls_set(oci8_tls_key_t key, void *value);
134
+ * set a value to the key.
135
+ *
136
+ */
137
+ #ifdef RUBY_VM
138
+ /* ruby 1.9 */
139
+ #if defined(_WIN32)
140
+ #include <windows.h>
141
+ #define oci8_tls_key_t DWORD
142
+ #define oci8_tls_key_init(key_p) \
143
+ ((*(key_p) = TlsAlloc()), \
144
+ (*(key_p) == 0xFFFFFFFF) ? GetLastError() : 0)
145
+ #define oci8_tls_get(key) TlsGetValue(key)
146
+ #define oci8_tls_set(key, val) TlsSetValue((key), (val))
147
+ #elif defined(HAVE_PTHREAD_H)
148
+ #include <pthread.h>
149
+ #define oci8_tls_key_t pthread_key_t
150
+ #define oci8_tls_key_init(key_p) pthread_key_create((key_p), NULL)
151
+ #define oci8_tls_get(key) pthread_getspecific(key)
152
+ #define oci8_tls_set(key, val) pthread_setspecific((key), (val))
153
+ #else
154
+ #error unsupported thread API
155
+ #endif
156
+ #endif /* RUBY_VM */
157
+
158
+ /* utility macros
78
159
  */
160
+ #define IS_OCI_ERROR(v) (((v) != OCI_SUCCESS) && ((v) != OCI_SUCCESS_WITH_INFO))
161
+ #ifdef ALWAYS_INLINE
79
162
  #define TO_ORATEXT to_oratext
80
163
  #define TO_CHARPTR to_charptr
81
164
  static ALWAYS_INLINE OraText *to_oratext(char *c)
82
165
  {
83
- return (OraText*)c;
166
+ return (OraText*)c;
84
167
  }
85
168
  static ALWAYS_INLINE char *to_charptr(OraText *c)
86
169
  {
87
- return (char*)c;
170
+ return (char*)c;
88
171
  }
89
172
  #else
90
- /* if not gcc, use normal cast. */
91
173
  #define TO_ORATEXT(c) ((OraText*)(c))
92
174
  #define TO_CHARPTR(c) ((char*)(c))
93
175
  #endif
94
176
  #define RSTRING_ORATEXT(obj) TO_ORATEXT(RSTRING_PTR(obj))
177
+ #define rb_str_new2_ora(str) rb_str_new2(TO_CHARPTR(str))
95
178
 
96
- enum oci8_bind_type {
97
- BIND_STRING,
98
- BIND_FIXNUM,
99
- BIND_INTEGER_VIA_ORA_NUMBER,
100
- BIND_TIME_VIA_ORA_DATE,
101
- BIND_FLOAT,
102
- BIND_BINARY_DOUBLE,
103
- BIND_ORA_DATE,
104
- BIND_ORA_NUMBER,
105
- BIND_HANDLE
106
- };
179
+ /*
180
+ * prevent rdoc from gathering the specified method.
181
+ */
182
+ #define rb_define_method_nodoc rb_define_method
183
+ #define rb_define_singleton_method_nodoc rb_define_singleton_method
107
184
 
108
- /* OraDate - Internal format of DATE */
109
- struct ora_date {
110
- unsigned char century;
111
- unsigned char year;
112
- unsigned char month;
113
- unsigned char day;
114
- unsigned char hour;
115
- unsigned char minute;
116
- unsigned char second;
117
- };
118
- typedef struct ora_date ora_date_t;
185
+ /* data structure for SQLT_LVC and SQLT_LVB. */
186
+ typedef struct {
187
+ sb4 size;
188
+ char buf[1];
189
+ } oci8_vstr_t;
119
190
 
120
- /* Member of ora_vnumber_t and ora_bind_handle_t - Internal format of NUMBER */
121
- struct ora_number {
122
- unsigned char exponent;
123
- unsigned char mantissa[20];
124
- };
125
- typedef struct ora_number ora_number_t;
191
+ typedef struct oci8_base_class oci8_base_class_t;
192
+ typedef struct oci8_bind_class oci8_bind_class_t;
126
193
 
127
- /* OraNumber - Internal format of VARNUM */
128
- struct ora_vnumber {
129
- unsigned char size;
130
- struct ora_number num;
194
+ typedef struct oci8_base oci8_base_t;
195
+ typedef struct oci8_bind oci8_bind_t;
196
+
197
+ struct oci8_base_class {
198
+ void (*mark)(oci8_base_t *base);
199
+ void (*free)(oci8_base_t *base);
200
+ size_t size;
131
201
  };
132
- typedef struct ora_vnumber ora_vnumber_t;
133
-
134
- /* OCIEnv, OCISvcCtx, OCIServer, OCISession, OCIStmt, OCIDescribe, OCIParam */
135
- struct oci8_handle {
136
- ub4 type;
137
- dvoid *hp;
138
- OCIError *errhp;
139
- VALUE self;
140
- struct oci8_handle *parent;
141
- size_t size;
142
- struct oci8_handle **children;
143
- /* End of common part */
144
- union {
145
- struct {
146
- char is_implicit;
147
- } param;
148
- #ifndef OCI8_USE_CALLBACK_LOB_READ
149
- struct {
150
- int char_width;
151
- } lob_locator;
152
- #endif
153
- struct {
154
- rb_pid_t pid;
155
- } svcctx;
156
- } u;
202
+
203
+ struct oci8_bind_class {
204
+ oci8_base_class_t base;
205
+ VALUE (*get)(oci8_bind_t *obind, void *data, void *null_struct);
206
+ void (*set)(oci8_bind_t *obind, void *data, void **null_structp, VALUE val);
207
+ void (*init)(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length);
208
+ void (*init_elem)(oci8_bind_t *obind, VALUE svc);
209
+ ub1 (*in)(oci8_bind_t *obind, ub4 idx, ub1 piece, void **valuepp, ub4 **alenpp, void **indpp);
210
+ void (*out)(oci8_bind_t *obind, ub4 idx, ub1 piece, void **valuepp, ub4 **alenpp, void **indpp);
211
+ void (*pre_fetch_hook)(oci8_bind_t *obind, VALUE svc);
212
+ ub2 dty;
213
+ ub1 csfrm;
157
214
  };
158
- typedef struct oci8_handle oci8_handle_t;
159
-
160
- /* OCIBind, OCIDefine */
161
- struct oci8_bind_handle {
162
- ub4 type;
163
- dvoid *hp;
164
- OCIError *errhp;
165
- VALUE self;
166
- struct oci8_handle *parent;
167
- size_t size;
168
- struct oci8_handle **children;
169
- /* End of common part */
170
- enum oci8_bind_type bind_type;
171
- sb2 ind;
172
- ub2 rlen;
173
- sb4 value_sz; /* sizeof value */
174
- union {
175
- struct {
176
- sb4 len;
177
- char buf[1];
178
- } str;
179
- long lng;
180
- double dbl;
181
- ora_date_t od;
182
- ora_number_t on;
183
- struct {
184
- void *hp;
185
- VALUE v;
186
- VALUE klass;
187
- } handle;
188
- } value;
215
+
216
+ struct oci8_base {
217
+ ub4 type;
218
+ union {
219
+ dvoid *ptr;
220
+ OCISvcCtx *svc;
221
+ OCIStmt *stmt;
222
+ OCIDefine *dfn;
223
+ OCIBind *bnd;
224
+ OCIParam *prm;
225
+ OCILobLocator *lob;
226
+ OCIType *tdo;
227
+ OCIDescribe *dschp;
228
+ } hp;
229
+ VALUE self;
230
+ const oci8_base_class_t *klass;
231
+ oci8_base_t *parent;
232
+ oci8_base_t *next;
233
+ oci8_base_t *prev;
234
+ oci8_base_t *children;
189
235
  };
190
- typedef struct oci8_bind_handle oci8_bind_handle_t;
191
236
 
192
- #define Get_Handle(obj, hp) do { \
193
- Data_Get_Struct(obj, oci8_handle_t, hp); \
194
- } while (0);
237
+ struct oci8_bind {
238
+ oci8_base_t base;
239
+ void *valuep;
240
+ sb4 value_sz; /* size to define or bind. */
241
+ sb4 alloc_sz; /* size of a element. */
242
+ ub4 maxar_sz; /* maximum array size. */
243
+ ub4 curar_sz; /* current array size. */
244
+ VALUE tdo;
245
+ union {
246
+ void **null_structs;
247
+ sb2 *inds;
248
+ } u;
249
+ };
195
250
 
196
- #define Check_Handle(obj, name, hp) do {\
197
- if (!rb_obj_is_instance_of(obj, c##name)) { \
198
- rb_raise(rb_eTypeError, "invalid argument %s (expect " #name ")", rb_class2name(CLASS_OF(obj))); \
199
- } \
200
- Data_Get_Struct(obj, oci8_handle_t, hp); \
251
+ enum logon_type_t {T_NOT_LOGIN = 0, T_IMPLICIT, T_EXPLICIT};
252
+
253
+ typedef struct {
254
+ oci8_base_t base;
255
+ volatile VALUE executing_thread;
256
+ enum logon_type_t logon_type;
257
+ OCISession *authhp;
258
+ OCIServer *srvhp;
259
+ rb_pid_t pid;
260
+ char is_autocommit;
261
+ #ifdef RUBY_VM
262
+ char non_blocking;
263
+ #endif
264
+ VALUE long_read_len;
265
+ } oci8_svcctx_t;
266
+
267
+ typedef struct {
268
+ dvoid *hp; /* OCIBind* or OCIDefine* */
269
+ dvoid *valuep;
270
+ sb4 value_sz;
271
+ ub2 dty;
272
+ sb2 *indp;
273
+ ub2 *alenp;
274
+ } oci8_exec_sql_var_t;
275
+
276
+ #define Check_Handle(obj, klass, hp) do { \
277
+ if (!rb_obj_is_kind_of(obj, klass)) { \
278
+ rb_raise(rb_eTypeError, "invalid argument %s (expect %s)", rb_class2name(CLASS_OF(obj)), rb_class2name(klass)); \
279
+ } \
280
+ Data_Get_Struct(obj, oci8_base_t, hp); \
201
281
  } while (0)
202
282
 
203
- struct oci8_string {
204
- OraText *ptr;
205
- ub4 len;
206
- };
207
- typedef struct oci8_string oci8_string_t;
208
-
209
- #define Get_String(obj, s) do { \
210
- if (!NIL_P(obj)) { \
211
- Check_Type(obj, T_STRING); \
212
- s.ptr = RSTRING_ORATEXT(obj); \
213
- s.len = RSTRING_LEN(obj); \
214
- } else { \
215
- s.ptr = NULL; \
216
- s.len = 0; \
283
+ #define Check_Object(obj, klass) do {\
284
+ if (!rb_obj_is_kind_of(obj, klass)) { \
285
+ rb_raise(rb_eTypeError, "invalid argument %s (expect %s)", rb_class2name(CLASS_OF(obj)), rb_class2name(klass)); \
217
286
  } \
218
287
  } while (0)
219
288
 
220
- #define Get_Int_With_Default(argc, pos, vval, cval, def) do { \
221
- if (argc >= pos) { \
222
- Check_Type(vval, T_FIXNUM); \
223
- cval = FIX2INT(vval); \
224
- } else { \
225
- cval = def; \
226
- } \
227
- } while (0)
289
+ #define oci8_raise(err, status, stmt) oci8_do_raise(err, status, stmt, __FILE__, __LINE__)
290
+ #define oci8_env_raise(err, status) oci8_do_env_raise(err, status, __FILE__, __LINE__)
291
+ #define oci8_raise_init_error() oci8_do_raise_init_error(__FILE__, __LINE__)
228
292
 
229
- #define ATTR_FOR_HNDL 1
230
- #define ATTR_FOR_DESC 2
231
- #define ATTR_FOR_BOTH (ATTR_FOR_HNDL | ATTR_FOR_DESC)
232
- struct oci8_attr {
233
- const char *name;
234
- ub4 attr;
235
- char attr_type;
236
- VALUE (*get)(oci8_handle_t *hp, ub4 attr);
237
- void (*set)(oci8_handle_t *hp, ub4 attr, VALUE value);
238
- };
239
- typedef struct oci8_attr oci8_attr_t;
240
-
241
- /* Handle */
242
- extern VALUE cOCIHandle;
243
- extern VALUE cOCIEnv;
244
- extern VALUE cOCISvcCtx;
245
- extern VALUE cOCIServer;
246
- extern VALUE cOCISession;
247
- extern VALUE cOCIStmt;
248
- extern VALUE cOCIDefine;
249
- extern VALUE cOCIBind;
250
- extern VALUE cOCIDescribe;
251
-
252
- /* Descriptor */
253
- extern VALUE cOCIDescriptor;
254
- extern VALUE cOCILobLocator;
255
- extern VALUE cOCIFileLocator;
256
- extern VALUE cOCIParam;
257
- extern VALUE cOCIRowid;
258
-
259
- /* Exception */
260
- extern VALUE eOCIException;
261
- extern VALUE eOCINoData;
262
- extern VALUE eOCIError;
263
- extern VALUE eOCIInvalidHandle;
264
- extern VALUE eOCINeedData;
265
- extern VALUE eOCIStillExecuting;
266
- extern VALUE eOCIContinue;
267
- extern VALUE eOCISuccessWithInfo;
268
-
269
- /* oracle specific type */
270
- extern VALUE cOraDate;
271
- extern VALUE cOraNumber;
272
-
273
- /* const.c */
274
- void Init_oci8_const(void);
275
- extern ID oci8_id_code;
276
- extern ID oci8_id_define_array;
277
- extern ID oci8_id_bind_hash;
278
- extern ID oci8_id_message;
279
- extern ID oci8_id_new;
280
- extern ID oci8_id_parse_error_offset;
281
- extern ID oci8_id_server;
282
- extern ID oci8_id_session;
283
- extern ID oci8_id_sql;
284
-
285
- /* handle.c */
286
- void Init_oci8_handle(void);
287
- VALUE oci8_handle_free(VALUE self);
288
- void oci8_handle_cleanup(oci8_handle_t *);
289
- VALUE oci8_s_new(VALUE self);
290
- oci8_handle_t *oci8_make_handle(ub4 type, dvoid *hp, OCIError *errhp, oci8_handle_t *chp, sb4 value_sz);
291
- void oci8_link(oci8_handle_t *parent, oci8_handle_t *child);
292
- void oci8_unlink(oci8_handle_t *self);
293
+ /* raise on error */
294
+ #define oci_lc(rv) do { \
295
+ sword __rv = (rv); \
296
+ if (__rv != OCI_SUCCESS) { \
297
+ oci8_raise(oci8_errhp, __rv, NULL); \
298
+ } \
299
+ } while(0)
300
+
301
+ #if SIZEOF_LONG > 4
302
+ #define UB4_TO_NUM INT2FIX
303
+ #else
304
+ #define UB4_TO_NUM UINT2NUM
305
+ #endif
293
306
 
294
307
  /* env.c */
308
+ extern OCIEnv *oci8_envhp;
309
+ #ifdef RUBY_VM
310
+ /* oci8_errhp is a thread local object in ruby 1.9. */
311
+ #define oci8_errhp oci8_get_errhp()
312
+
313
+ extern oci8_tls_key_t oci8_tls_key; /* native thread key */
314
+ OCIError *oci8_make_errhp(void);
315
+
316
+ static inline OCIError *oci8_get_errhp()
317
+ {
318
+ OCIError *errhp = (OCIError *)oci8_tls_get(oci8_tls_key);
319
+ return LIKELY(errhp != NULL) ? errhp : oci8_make_errhp();
320
+ }
321
+
322
+ #else
323
+ /* oci8_errhp is global in ruby 1.8. */
324
+ extern OCIError *oci8_errhp;
325
+ #endif
295
326
  void Init_oci8_env(void);
296
327
 
297
- /* error.c */
298
- void Init_oci8_error(void);
299
- #define oci8_raise(errhp, status, stmthp) oci8_do_raise((errhp), (status), (stmthp), __FILE__, __LINE__)
300
- #define oci8_env_raise(envhp, status) oci8_do_env_raise((envhp), (status), __FILE__, __LINE__)
301
- RBOCI_NORETURN(void oci8_do_raise(OCIError *, sword status, OCIStmt *, const char *file, int line));
302
- RBOCI_NORETURN(void oci8_do_env_raise(OCIEnv *, sword status, const char *file, int line));
303
-
304
- /* svcctx.c */
305
- void Init_oci8_svcctx(void);
306
-
307
- /* server.c */
308
- void Init_oci8_server(void);
309
- VALUE oci8_server_version(VALUE self);
310
- #ifdef HAVE_OCISERVERRELEASE
311
- VALUE oci8_server_release(VALUE self);
328
+ /* oci8lib.c */
329
+ extern ID oci8_id_new;
330
+ extern ID oci8_id_get;
331
+ extern ID oci8_id_set;
332
+ extern ID oci8_id_keys;
333
+ extern int oci8_in_finalizer;
334
+ extern VALUE oci8_cOCIHandle;
335
+ void oci8_base_free(oci8_base_t *base);
336
+ VALUE oci8_define_class(const char *name, oci8_base_class_t *klass);
337
+ VALUE oci8_define_class_under(VALUE outer, const char *name, oci8_base_class_t *klass);
338
+ VALUE oci8_define_bind_class(const char *name, const oci8_bind_class_t *oci8_bind_class);
339
+ void oci8_link_to_parent(oci8_base_t *base, oci8_base_t *parent);
340
+ void oci8_unlink_from_parent(oci8_base_t *base);
341
+ sword oci8_blocking_region(oci8_svcctx_t *svcctx, rb_blocking_function_t func, void *data);
342
+ sword oci8_exec_sql(oci8_svcctx_t *svcctx, const char *sql_text, ub4 num_define_vars, oci8_exec_sql_var_t *define_vars, ub4 num_bind_vars, oci8_exec_sql_var_t *bind_vars, int raise_on_error);
343
+ #if defined RUNTIME_API_CHECK
344
+ void *oci8_find_symbol(const char *symbol_name);
312
345
  #endif
313
- VALUE oci8_break(VALUE self);
314
- VALUE oci8_reset(VALUE self);
315
346
 
316
- /* session.c */
317
- void Init_oci8_session(void);
347
+ /* error.c */
348
+ extern VALUE eOCIException;
349
+ extern VALUE eOCIBreak;
350
+ void Init_oci8_error(void);
351
+ NORETURN(void oci8_do_raise(OCIError *, sword status, OCIStmt *, const char *file, int line));
352
+ NORETURN(void oci8_do_env_raise(OCIEnv *, sword status, const char *file, int line));
353
+ NORETURN(void oci8_do_raise_init_error(const char *file, int line));
354
+ sb4 oci8_get_error_code(OCIError *errhp);
355
+
356
+ /* oci8.c */
357
+ VALUE Init_oci8(void);
358
+ oci8_svcctx_t *oci8_get_svcctx(VALUE obj);
359
+ OCISvcCtx *oci8_get_oci_svcctx(VALUE obj);
360
+ OCISession *oci8_get_oci_session(VALUE obj);
361
+ void oci8_check_pid_consistency(oci8_svcctx_t *svcctx);
362
+ #define TO_SVCCTX oci8_get_oci_svcctx
363
+ #define TO_SESSION oci8_get_oci_session
318
364
 
319
365
  /* stmt.c */
320
- void Init_oci8_stmt(void);
366
+ extern VALUE cOCIStmt;
367
+ void Init_oci8_stmt(VALUE cOCI8);
321
368
 
322
369
  /* bind.c */
323
- void Init_oci8_bind(void);
324
- void oci8_set_value(oci8_bind_handle_t *, VALUE);
325
- VALUE oci8_get_value(oci8_bind_handle_t *);
326
-
327
- /* define.c */
328
- void Init_oci8_define(void);
329
-
330
- /* describe.c */
331
- void Init_oci8_describe(void);
332
-
333
- /* descriptor.c */
334
- void Init_oci8_descriptor(void);
335
- VALUE oci8_param_get(VALUE self, VALUE pos);
336
-
337
- /* param.c */
338
- void Init_oci8_param(void);
370
+ typedef struct {
371
+ void *hp;
372
+ VALUE obj;
373
+ } oci8_hp_obj_t;
374
+ void oci8_bind_free(oci8_base_t *base);
375
+ void oci8_bind_hp_obj_mark(oci8_base_t *base);
376
+ void Init_oci8_bind(VALUE cOCI8BindTypeBase);
377
+ oci8_bind_t *oci8_get_bind(VALUE obj);
378
+
379
+ /* metadata.c */
380
+ extern VALUE cOCI8MetadataBase;
381
+ void Init_oci8_metadata(VALUE cOCI8);
382
+ VALUE oci8_metadata_create(OCIParam *parmhp, VALUE svc, VALUE parent);
339
383
 
340
384
  /* lob.c */
341
- void Init_oci8_lob(void);
385
+ void Init_oci8_lob(VALUE cOCI8);
386
+ VALUE oci8_make_clob(oci8_svcctx_t *svcctx, OCILobLocator *s);
387
+ VALUE oci8_make_nclob(oci8_svcctx_t *svcctx, OCILobLocator *s);
388
+ VALUE oci8_make_blob(oci8_svcctx_t *svcctx, OCILobLocator *s);
389
+ VALUE oci8_make_bfile(oci8_svcctx_t *svcctx, OCILobLocator *s);
342
390
 
343
391
  /* oradate.c */
344
392
  void Init_ora_date(void);
345
- void oci8_set_ora_date(ora_date_t *, int year, int month, int day, int hour, int minute, int second);
346
- void oci8_get_ora_date(ora_date_t *, int *year, int *month, int *day, int *hour, int *minute, int *second);
347
-
348
- /* oranumber.c */
349
- #define ORA_NUMBER_BUF_SIZE (128 /* max scale */ + 38 /* max precision */ + 1 /* sign */ + 1 /* comma */ + 1 /* nul */)
350
- void Init_ora_number(void);
351
- void ora_number_to_str(unsigned char *buf, size_t *lenp, ora_number_t *on, unsigned char size);
352
393
 
353
394
  /* ocinumber.c */
354
- int set_oci_vnumber(ora_vnumber_t *result, VALUE num, OCIError *errhp);
395
+ void Init_oci_number(VALUE mOCI);
396
+ OCINumber *oci8_get_ocinumber(VALUE num);
397
+ VALUE oci8_make_ocinumber(OCINumber *s);
398
+ VALUE oci8_make_integer(OCINumber *s);
399
+ VALUE oci8_make_float(OCINumber *s);
400
+ OCINumber *oci8_set_ocinumber(OCINumber *result, VALUE self);
401
+ OCINumber *oci8_set_integer(OCINumber *result, VALUE self);
402
+
403
+ /* ocidatetim.c */
404
+ void Init_oci_datetime(void);
405
+ VALUE oci8_make_ocidate(OCIDate *od);
406
+ OCIDate *oci8_set_ocidate(OCIDate *od, VALUE val);
407
+ VALUE oci8_make_ocidatetime(OCIDateTime *dttm);
408
+ OCIDateTime *oci8_set_ocidatetime(OCIDateTime *dttm, VALUE val);
409
+ VALUE oci8_make_interval_ym(OCIInterval *s);
410
+ VALUE oci8_make_interval_ds(OCIInterval *s);
411
+
412
+ /* object.c */
413
+ void Init_oci_object(VALUE mOCI);
414
+
415
+ /* xmldb.c */
416
+ #ifndef XMLCTX_DEFINED
417
+ #define XMLCTX_DEFINED
418
+ struct xmlctx;
419
+ typedef struct xmlctx xmlctx;
420
+ #endif
421
+ #ifndef XML_TYPES
422
+ typedef struct xmlnode xmlnode;
423
+ #endif
424
+ void Init_oci_xmldb(void);
425
+ VALUE oci8_make_rexml(struct xmlctx *xctx, xmlnode *node);
355
426
 
356
427
  /* attr.c */
357
- void Init_oci8_attr(void);
358
- VALUE oci8_attr_get(VALUE self, VALUE vtype);
359
- VALUE oci8_attr_set(VALUE self, VALUE vtype, VALUE vvalue);
360
- extern oci8_attr_t oci8_attr_list[];
361
- extern size_t oci8_attr_size;
428
+ VALUE oci8_get_sb1_attr(oci8_base_t *base, ub4 attrtype);
429
+ VALUE oci8_get_ub2_attr(oci8_base_t *base, ub4 attrtype);
430
+ VALUE oci8_get_sb2_attr(oci8_base_t *base, ub4 attrtype);
431
+ VALUE oci8_get_ub4_attr(oci8_base_t *base, ub4 attrtype);
432
+ VALUE oci8_get_string_attr(oci8_base_t *base, ub4 attrtype);
433
+ VALUE oci8_get_rowid_attr(oci8_base_t *base, ub4 attrtype);
434
+
435
+ /* encoding.c */
436
+ void Init_oci8_encoding(VALUE cOCI8);
437
+ VALUE oci8_charset_id2name(VALUE svc, VALUE charset_id);
438
+
439
+ /* win32.c */
440
+ void Init_oci8_win32(VALUE cOCI8);
441
+
442
+ #ifdef HAVE_TYPE_RB_ENCODING
443
+ extern rb_encoding *oci8_encoding;
444
+
445
+ #define OCI8StringValue(v) do { \
446
+ StringValue(v); \
447
+ (v) = rb_str_export_to_enc(v, oci8_encoding); \
448
+ } while (0)
449
+ #define OCI8SafeStringValue(v) do { \
450
+ SafeStringValue(v); \
451
+ (v) = rb_str_export_to_enc(v, oci8_encoding); \
452
+ } while (0)
453
+ #else
454
+ #define OCI8StringValue(v) StringValue(v)
455
+ #define OCI8SafeStringValue(v) SafeStringValue(v)
456
+ #endif
457
+
458
+ #include "apiwrap.h"
362
459
 
363
- #define _D_ fprintf(stderr, "%s:%d - %s\n", __FILE__, __LINE__, __FUNCTION__)
364
460
  #endif