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.
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