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,7 +1,8 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
1
2
  /*
2
3
  error.c - part of ruby-oci8
3
4
 
4
- Copyright (C) 2002 KUBO Takehiro <kubo@jiubao.org>
5
+ Copyright (C) 2002-2007 KUBO Takehiro <kubo@jiubao.org>
5
6
 
6
7
  =begin
7
8
  == OCIError
@@ -9,133 +10,173 @@
9
10
  */
10
11
  #include "oci8.h"
11
12
 
13
+ /* Exception */
14
+ VALUE eOCIException;
15
+ VALUE eOCIBreak;
16
+ static VALUE eOCINoData;
17
+ static VALUE eOCIError;
18
+ static VALUE eOCIInvalidHandle;
19
+ static VALUE eOCINeedData;
20
+ static VALUE eOCIStillExecuting;
21
+ static VALUE eOCIContinue;
22
+ static VALUE eOCISuccessWithInfo;
23
+
24
+ static ID oci8_id_code;
25
+ static ID oci8_id_message;
26
+ static ID oci8_id_parse_error_offset;
27
+ static ID oci8_id_sql;
12
28
  static ID oci8_id_caller;
13
29
  static ID oci8_id_set_backtrace;
14
30
 
15
- RBOCI_NORETURN(static void oci8_raise2(dvoid *errhp, sword status, ub4 type, OCIStmt *stmthp, const char *file, int line));
31
+ NORETURN(static void oci8_raise2(dvoid *errhp, sword status, ub4 type, OCIStmt *stmthp, const char *file, int line));
32
+ NORETURN(static void set_backtrace_and_raise(VALUE exc, const char *file, int line));
16
33
 
17
34
  static void oci8_raise2(dvoid *errhp, sword status, ub4 type, OCIStmt *stmthp, const char *file, int line)
18
35
  {
19
- VALUE vcodes = Qnil;
20
- VALUE vmessages = Qnil;
21
- VALUE exc;
22
- char errmsg[1024];
23
- sb4 errcode;
24
- ub4 recodeno;
25
- VALUE msg;
36
+ VALUE vcodes = Qnil;
37
+ VALUE vmessages = Qnil;
38
+ VALUE exc;
39
+ char errmsg[1024];
40
+ sb4 errcode;
41
+ ub4 recodeno;
42
+ VALUE msg;
26
43
  #ifdef OCI_ATTR_PARSE_ERROR_OFFSET
27
- VALUE vparse_error_offset = Qnil;
44
+ VALUE vparse_error_offset = Qnil;
28
45
  #endif
29
46
  #ifdef OCI_ATTR_STATEMENT
30
- VALUE vsql = Qnil;
31
- #endif
32
- int i;
33
- int rv;
34
- VALUE backtrace;
35
- #if defined(_WIN32) || defined(WIN32)
36
- char *p = strrchr(file, '\\');
37
- if (p != NULL)
38
- file = p + 1;
47
+ VALUE vsql = Qnil;
39
48
  #endif
49
+ int i;
50
+ int rv;
40
51
 
41
- switch (status) {
42
- case OCI_ERROR:
43
- case OCI_SUCCESS_WITH_INFO:
44
- vcodes = rb_ary_new();
45
- vmessages = rb_ary_new();
46
- for (recodeno = 1;;recodeno++) {
47
- /* get error string */
48
- rv = OCIErrorGet(errhp, recodeno, NULL, &errcode, TO_ORATEXT(errmsg), sizeof(errmsg), type);
49
- if (rv != OCI_SUCCESS) {
52
+ switch (status) {
53
+ case OCI_ERROR:
54
+ case OCI_SUCCESS_WITH_INFO:
55
+ vcodes = rb_ary_new();
56
+ vmessages = rb_ary_new();
57
+ for (recodeno = 1;;recodeno++) {
58
+ /* get error string */
59
+ rv = OCIErrorGet(errhp, recodeno, NULL, &errcode, TO_ORATEXT(errmsg), sizeof(errmsg), type);
60
+ if (rv != OCI_SUCCESS) {
61
+ break;
62
+ }
63
+ /* chop error string */
64
+ for (i = strlen(errmsg) - 1;i >= 0;i--) {
65
+ if (errmsg[i] == '\n' || errmsg[i] == '\r') {
66
+ errmsg[i] = '\0';
67
+ } else {
68
+ break;
69
+ }
70
+ }
71
+ rb_ary_push(vcodes, INT2FIX(errcode));
72
+ rb_ary_push(vmessages, rb_external_str_new_with_enc(errmsg, strlen(errmsg), oci8_encoding));
73
+ }
74
+ if (RARRAY_LEN(vmessages) > 0) {
75
+ msg = RARRAY_PTR(vmessages)[0];
76
+ } else {
77
+ msg = rb_usascii_str_new_cstr("ERROR");
78
+ }
79
+ if (status == OCI_ERROR) {
80
+ exc = eOCIError;
81
+ } else {
82
+ exc = eOCISuccessWithInfo;
83
+ }
84
+ #ifdef OCI_ATTR_PARSE_ERROR_OFFSET
85
+ if (stmthp != NULL) {
86
+ ub2 offset;
87
+ rv = OCIAttrGet(stmthp, OCI_HTYPE_STMT, &offset, 0, OCI_ATTR_PARSE_ERROR_OFFSET, errhp);
88
+ if (rv == OCI_SUCCESS) {
89
+ vparse_error_offset = INT2FIX(offset);
90
+ }
91
+ }
92
+ #endif
93
+ #ifdef OCI_ATTR_STATEMENT
94
+ if (stmthp != NULL) {
95
+ text *sql;
96
+ ub4 size;
97
+ rv = OCIAttrGet(stmthp, OCI_HTYPE_STMT, &sql, &size, OCI_ATTR_STATEMENT, errhp);
98
+ if (rv == OCI_SUCCESS) {
99
+ vsql = rb_external_str_new_with_enc(TO_CHARPTR(sql), size, oci8_encoding);
100
+ }
101
+ }
102
+ #endif
103
+ break;
104
+ case OCI_NO_DATA:
105
+ exc = eOCINoData;
106
+ msg = rb_usascii_str_new_cstr("No Data");
107
+ break;
108
+ case OCI_INVALID_HANDLE:
109
+ exc = eOCIInvalidHandle;
110
+ msg = rb_usascii_str_new_cstr("Invalid Handle");
111
+ break;
112
+ case OCI_NEED_DATA:
113
+ exc = eOCINeedData;
114
+ msg = rb_usascii_str_new_cstr("Need Data");
50
115
  break;
51
- }
52
- /* chop error string */
53
- for (i = strlen(errmsg) - 1;i >= 0;i--) {
54
- if (errmsg[i] == '\n' || errmsg[i] == '\r') {
55
- errmsg[i] = '\0';
56
- } else {
57
- break;
58
- }
59
- }
60
- rb_ary_push(vcodes, INT2FIX(errcode));
61
- rb_ary_push(vmessages, rb_str_new2(errmsg));
116
+ case OCI_STILL_EXECUTING:
117
+ exc = eOCIStillExecuting;
118
+ msg = rb_usascii_str_new_cstr("Still Executing");
119
+ break;
120
+ case OCI_CONTINUE:
121
+ exc = eOCIContinue;
122
+ msg = rb_usascii_str_new_cstr("Continue");
123
+ break;
124
+ default:
125
+ sprintf(errmsg, "Unknown error (%d)", status);
126
+ exc = rb_eStandardError;
127
+ msg = rb_usascii_str_new_cstr(errmsg);
62
128
  }
63
- if (RARRAY_LEN(vmessages) > 0) {
64
- msg = RARRAY_PTR(vmessages)[0];
65
- } else {
66
- msg = rb_str_new2("ERROR");
129
+ exc = rb_funcall(exc, oci8_id_new, 1, msg);
130
+ if (!NIL_P(vcodes)) {
131
+ rb_ivar_set(exc, oci8_id_code, vcodes);
67
132
  }
68
- if (status == OCI_ERROR) {
69
- exc = eOCIError;
70
- } else {
71
- exc = eOCISuccessWithInfo;
133
+ if (!NIL_P(vmessages)) {
134
+ rb_ivar_set(exc, oci8_id_message, vmessages);
72
135
  }
73
- break;
74
- case OCI_NO_DATA:
75
- exc = eOCINoData;
76
- msg = rb_str_new2("No Data");
77
- break;
78
- case OCI_INVALID_HANDLE:
79
- exc = eOCIInvalidHandle;
80
- msg = rb_str_new2("Invalid Handle");
81
- break;
82
- case OCI_NEED_DATA:
83
- exc = eOCINeedData;
84
- msg = rb_str_new2("Need Data");
85
- break;
86
- case OCI_STILL_EXECUTING:
87
- exc = eOCIStillExecuting;
88
- msg = rb_str_new2("Still Executing");
89
- break;
90
- case OCI_CONTINUE:
91
- exc = eOCIContinue;
92
- msg = rb_str_new2("Continue");
93
- break;
94
- default:
95
- sprintf(errmsg, "Unknown error (%d)", status);
96
- exc = rb_eStandardError;
97
- msg = rb_str_new2(errmsg);
98
- }
99
- exc = rb_funcall(exc, oci8_id_new, 1, msg);
100
- if (!NIL_P(vcodes)) {
101
- rb_ivar_set(exc, oci8_id_code, vcodes);
102
- }
103
- if (!NIL_P(vmessages)) {
104
- rb_ivar_set(exc, oci8_id_message, vmessages);
105
- }
106
136
  #ifdef OCI_ATTR_PARSE_ERROR_OFFSET
107
- if (!NIL_P(vparse_error_offset)) {
108
- rb_ivar_set(exc, oci8_id_parse_error_offset, vparse_error_offset);
109
- }
137
+ if (!NIL_P(vparse_error_offset)) {
138
+ rb_ivar_set(exc, oci8_id_parse_error_offset, vparse_error_offset);
139
+ }
110
140
  #endif
111
141
  #ifdef OCI_ATTR_STATEMENT
112
- if (!NIL_P(vsql)) {
113
- rb_ivar_set(exc, oci8_id_sql, vsql);
114
- }
142
+ if (!NIL_P(vsql)) {
143
+ rb_ivar_set(exc, oci8_id_sql, vsql);
144
+ }
115
145
  #endif
116
- /*
117
- * make error line in C code.
118
- */
119
- backtrace = rb_funcall(rb_cObject, rb_intern("caller"), 0);
120
- sprintf(errmsg, "%s:%d:in oci8lib.so", file, line);
121
- rb_ary_unshift(backtrace, rb_str_new2(errmsg));
122
- rb_funcall(exc, rb_intern("set_backtrace"), 1, backtrace);
123
- rb_exc_raise(exc);
146
+ set_backtrace_and_raise(exc, file, line);
124
147
  }
125
148
 
126
- static VALUE oci8_error_initialize(int argc, VALUE *argv, VALUE self)
149
+ static void set_backtrace_and_raise(VALUE exc, const char *file, int line)
127
150
  {
128
- VALUE msg;
129
- VALUE code;
130
-
131
- rb_scan_args(argc, argv, "02", &msg, &code);
132
- rb_call_super(argc > 1 ? 1 : argc, argv);
133
- if (!NIL_P(code)) {
134
- rb_ivar_set(self, oci8_id_code, rb_ary_new3(1, code));
135
- }
136
- return Qnil;
151
+ char errmsg[64];
152
+ VALUE backtrace;
153
+ #ifdef _WIN32
154
+ char *p = strrchr(file, '\\');
155
+ if (p != NULL)
156
+ file = p + 1;
157
+ #endif
158
+ backtrace = rb_funcall(rb_cObject, oci8_id_caller, 0);
159
+ if (TYPE(backtrace) == T_ARRAY) {
160
+ snprintf(errmsg, sizeof(errmsg), "%s:%d:in oci8lib.so", file, line);
161
+ errmsg[sizeof(errmsg) - 1] = '\0';
162
+ rb_ary_unshift(backtrace, rb_usascii_str_new_cstr(errmsg));
163
+ rb_funcall(exc, oci8_id_set_backtrace, 1, backtrace);
164
+ }
165
+ rb_exc_raise(exc);
137
166
  }
138
167
 
168
+ static VALUE oci8_error_initialize(int argc, VALUE *argv, VALUE self)
169
+ {
170
+ VALUE msg;
171
+ VALUE code;
172
+
173
+ rb_scan_args(argc, argv, "02", &msg, &code);
174
+ rb_call_super(argc > 1 ? 1 : argc, argv);
175
+ if (!NIL_P(code)) {
176
+ rb_ivar_set(self, oci8_id_code, rb_ary_new3(1, code));
177
+ }
178
+ return Qnil;
179
+ }
139
180
 
140
181
  /*
141
182
  =begin
@@ -144,15 +185,11 @@ static VALUE oci8_error_initialize(int argc, VALUE *argv, VALUE self)
144
185
  */
145
186
  static VALUE oci8_error_code(VALUE self)
146
187
  {
147
- VALUE ary = rb_ivar_get(self, oci8_id_code);
148
- if (NIL_P(ary)) {
149
- return Qnil;
150
- }
151
- Check_Type(ary, T_ARRAY);
152
- if (RARRAY_LEN(ary) == 0) {
153
- return Qnil;
154
- }
155
- return RARRAY_PTR(ary)[0];
188
+ VALUE ary = rb_ivar_get(self, oci8_id_code);
189
+ if (RARRAY_LEN(ary) == 0) {
190
+ return Qnil;
191
+ }
192
+ return RARRAY_PTR(ary)[0];
156
193
  }
157
194
 
158
195
  /*
@@ -162,7 +199,7 @@ static VALUE oci8_error_code(VALUE self)
162
199
  */
163
200
  static VALUE oci8_error_code_array(VALUE self)
164
201
  {
165
- return rb_ivar_get(self, oci8_id_code);
202
+ return rb_ivar_get(self, oci8_id_code);
166
203
  }
167
204
 
168
205
  /*
@@ -178,7 +215,7 @@ static VALUE oci8_error_code_array(VALUE self)
178
215
  */
179
216
  static VALUE oci8_error_message_array(VALUE self)
180
217
  {
181
- return rb_ivar_get(self, oci8_id_message);
218
+ return rb_ivar_get(self, oci8_id_message);
182
219
  }
183
220
 
184
221
  #ifdef OCI_ATTR_PARSE_ERROR_OFFSET
@@ -189,7 +226,7 @@ static VALUE oci8_error_message_array(VALUE self)
189
226
  */
190
227
  static VALUE oci8_error_parse_error_offset(VALUE self)
191
228
  {
192
- return rb_ivar_get(self, oci8_id_parse_error_offset);
229
+ return rb_ivar_get(self, oci8_id_parse_error_offset);
193
230
  }
194
231
  #endif
195
232
 
@@ -202,33 +239,65 @@ static VALUE oci8_error_parse_error_offset(VALUE self)
202
239
  */
203
240
  static VALUE oci8_error_sql(VALUE self)
204
241
  {
205
- return rb_ivar_get(self, oci8_id_sql);
242
+ return rb_ivar_get(self, oci8_id_sql);
206
243
  }
207
244
  #endif
208
245
 
246
+ sb4 oci8_get_error_code(OCIError *errhp)
247
+ {
248
+ sb4 errcode = -1;
249
+ OCIErrorGet(oci8_errhp, 1, NULL, &errcode, NULL, 0, OCI_HTYPE_ERROR);
250
+ return errcode;
251
+ }
252
+
209
253
  void Init_oci8_error(void)
210
254
  {
211
- oci8_id_caller = rb_intern("caller");
212
- oci8_id_set_backtrace = rb_intern("set_backtrace");
255
+ oci8_id_code = rb_intern("code");
256
+ oci8_id_message = rb_intern("message");
257
+ oci8_id_parse_error_offset = rb_intern("parse_error_offset");
258
+ oci8_id_sql = rb_intern("sql");
259
+ oci8_id_caller = rb_intern("caller");
260
+ oci8_id_set_backtrace = rb_intern("set_backtrace");
261
+
262
+ eOCIException = rb_define_class("OCIException", rb_eStandardError);
263
+ eOCIBreak = rb_define_class("OCIBreak", eOCIException);
264
+
265
+ eOCINoData = rb_define_class("OCINoData", eOCIException);
266
+ eOCIError = rb_define_class("OCIError", eOCIException);
267
+ eOCIInvalidHandle = rb_define_class("OCIInvalidHandle", eOCIException);
268
+ eOCINeedData = rb_define_class("OCINeedData", eOCIException);
269
+ eOCIStillExecuting = rb_define_class("OCIStillExecuting", eOCIException);
270
+ eOCIContinue = rb_define_class("OCIContinue", eOCIException);
271
+ eOCISuccessWithInfo = rb_define_class("OCISuccessWithInfo", eOCIError);
213
272
 
214
- rb_define_method(eOCIError, "initialize", oci8_error_initialize, -1);
215
- rb_define_method(eOCIError, "code", oci8_error_code, 0);
216
- rb_define_method(eOCIError, "codes", oci8_error_code_array, 0);
217
- rb_define_method(eOCIError, "messages", oci8_error_message_array, 0);
273
+ rb_define_method(eOCIError, "initialize", oci8_error_initialize, -1);
274
+ rb_define_method(eOCIError, "code", oci8_error_code, 0);
275
+ rb_define_method(eOCIError, "codes", oci8_error_code_array, 0);
276
+ rb_define_method(eOCIError, "messages", oci8_error_message_array, 0);
218
277
  #ifdef OCI_ATTR_PARSE_ERROR_OFFSET
219
- rb_define_method(eOCIError, "parseErrorOffset", oci8_error_parse_error_offset, 0);
278
+ rb_define_method(eOCIError, "parseErrorOffset", oci8_error_parse_error_offset, 0);
220
279
  #endif
221
280
  #ifdef OCI_ATTR_STATEMENT
222
- rb_define_method(eOCIError, "sql", oci8_error_sql, 0);
281
+ rb_define_method(eOCIError, "sql", oci8_error_sql, 0);
223
282
  #endif
224
283
  }
225
284
 
226
285
  void oci8_do_raise(OCIError *errhp, sword status, OCIStmt *stmthp, const char *file, int line)
227
286
  {
228
- oci8_raise2(errhp, status, OCI_HTYPE_ERROR, stmthp, file, line);
287
+ oci8_raise2(errhp, status, OCI_HTYPE_ERROR, stmthp, file, line);
229
288
  }
230
289
 
231
290
  void oci8_do_env_raise(OCIEnv *envhp, sword status, const char *file, int line)
232
291
  {
233
- oci8_raise2(envhp, status, OCI_HTYPE_ENV, NULL, file, line);
292
+ oci8_raise2(envhp, status, OCI_HTYPE_ENV, NULL, file, line);
293
+ }
294
+
295
+ void oci8_do_raise_init_error(const char *file, int line)
296
+ {
297
+ VALUE msg = rb_usascii_str_new_cstr("OCI Library Initialization Error");
298
+ VALUE exc = rb_funcall(eOCIError, oci8_id_new, 1, msg);
299
+
300
+ rb_ivar_set(exc, oci8_id_code, rb_ary_new3(1, INT2FIX(-1)));
301
+ rb_ivar_set(exc, oci8_id_message, rb_ary_new3(1, msg));
302
+ set_backtrace_and_raise(exc, file, line);
234
303
  }
@@ -1,11 +1,3 @@
1
- raise <<EOS if RUBY_VERSION.index("1.9") == 0
2
- ---------------------------------------------------
3
- error message:
4
- ruby-oci8 1.0 is not supported by ruby #{RUBY_VERSION}.
5
- Use ruby-oci8 2.0 in SVN trunk.
6
- ---------------------------------------------------
7
- EOS
8
-
9
1
  begin
10
2
  require 'mkmf'
11
3
  rescue LoadError
@@ -18,8 +10,9 @@ EOS
18
10
  end
19
11
 
20
12
  require File.dirname(__FILE__) + '/oraconf'
13
+ require File.dirname(__FILE__) + '/apiwrap'
21
14
 
22
- RUBY_OCI8_VERSION = open("#{File.dirname(__FILE__)}/../../VERSION") {|f| f.read}.chomp
15
+ RUBY_OCI8_VERSION = File.read("#{File.dirname(__FILE__)}/../../VERSION").chomp
23
16
 
24
17
  oraconf = OraConf.get()
25
18
 
@@ -36,58 +29,81 @@ def replace_keyword(source, target, replace)
36
29
  }
37
30
  end
38
31
 
39
- $objs = ["oci8.o", "handle.o", "const.o", "env.o", "error.o", "svcctx.o",
40
- "server.o", "session.o", "stmt.o", "define.o", "bind.o",
41
- "describe.o", "descriptor.o", "param.o", "lob.o",
42
- "oradate.o", "oranumber.o", "ocinumber.o", "attr.o"]
43
-
44
32
  $CFLAGS += oraconf.cflags
33
+ saved_libs = $libs
45
34
  $libs += oraconf.libs
46
35
 
47
- have_type('oratext', 'ociap.h')
48
-
49
- # OCIEnvCreate
50
- # 8.0.5 - NG
51
- # 9.0.1 - OK
52
- have_func("OCIEnvCreate")
53
-
54
- # OCITerminate
55
- # 8.0.5 - NG
56
- # 9.0.1 - OK
57
- have_func("OCITerminate")
58
-
59
- # OCIServerRelease
60
- # 8.1.5 - NG
61
- # 8.1.7 - OK
62
- #have_func("OCIServerRelease")
63
-
64
- # OCILobOpen
65
- # 8.0.5 - NG
66
- # 9.0.1 - OK
67
- have_func("OCILobOpen")
68
-
69
- # OCILobClose
70
- # 8.0.5 - NG
71
- # 9.0.1 - OK
72
- have_func("OCILobClose")
36
+ oci_actual_client_version = 0x08000000
37
+ funcs = {}
38
+ YAML.load(open(File.dirname(__FILE__) + '/apiwrap.yml')).each do |key, val|
39
+ key = key[0..-4] if key[-3..-1] == '_nb'
40
+ ver = val[:version]
41
+ ver_major = (ver / 100)
42
+ ver_minor = (ver / 10) % 10
43
+ ver_update = ver % 10
44
+ ver = ((ver_major << 24) | (ver_minor << 20) | (ver_update << 12))
45
+ funcs[ver] ||= []
46
+ funcs[ver] << key
47
+ end
48
+ funcs.keys.sort.each do |version|
49
+ next if version == 0x08000000
50
+ verstr = format('%d.%d.%d', ((version >> 24) & 0xFF), ((version >> 20) & 0xF), ((version >> 12) & 0xFF))
51
+ puts "checking for Oracle #{verstr} API - start"
52
+ result = catch :result do
53
+ funcs[version].sort.each do |func|
54
+ unless have_func(func)
55
+ throw :result, "fail"
56
+ end
57
+ end
58
+ oci_actual_client_version = version
59
+ "pass"
60
+ end
61
+ puts "checking for Oracle #{verstr} API - #{result}"
62
+ break if result == 'fail'
63
+ end
64
+ $defs << "-DACTUAL_ORACLE_CLIENT_VERSION=#{format('0x%08x', oci_actual_client_version)}"
73
65
 
74
- # OCILobCreateTemporary
75
- # 8.0.5 - NG
76
- # 8.1.5 - OK
77
- have_func("OCILobCreateTemporary")
66
+ if with_config('oracle-version')
67
+ oci_client_version = with_config('oracle-version').to_i
68
+ else
69
+ oci_client_version = oci_actual_client_version
70
+ end
71
+ $defs << "-DORACLE_CLIENT_VERSION=#{format('0x%08x', oci_client_version)}"
78
72
 
79
- have_func("OCILobGetChunkSize")
80
- have_func("OCILobLocatorAssign")
73
+ if with_config('runtime-check')
74
+ $defs << "-DRUNTIME_API_CHECK=1"
75
+ $libs = saved_libs
76
+ end
81
77
 
82
- have_func("OCIRowidToChar")
78
+ $objs = ["oci8lib.o", "env.o", "error.o", "oci8.o",
79
+ "stmt.o", "bind.o", "metadata.o", "attr.o",
80
+ "lob.o", "oradate.o",
81
+ "ocinumber.o", "ocidatetime.o", "object.o", "apiwrap.o",
82
+ "encoding.o", "xmldb.o"]
83
83
 
84
- $defs.push("-DHAVE_OCIRESET") unless /80./ =~ oraconf.version
84
+ if RUBY_PLATFORM =~ /mswin32|cygwin|mingw32|bccwin32/
85
+ $defs << "-DUSE_WIN32_C"
86
+ $objs << "win32.o"
87
+ end
85
88
 
86
89
  # Checking gcc or not
87
90
  if oraconf.cc_is_gcc
88
91
  $CFLAGS += " -Wall"
89
92
  end
90
93
 
94
+ have_func("localtime_r")
95
+
96
+ # ruby 1.8 headers
97
+ have_header("intern.h")
98
+ have_header("util.h")
99
+ # ruby 1.9 headers
100
+ have_header("ruby/util.h")
101
+ have_type('rb_encoding', ['ruby/ruby.h', 'ruby/encoding.h'])
102
+
103
+ # $! in C API
104
+ have_var("ruby_errinfo", "ruby.h") # ruby 1.8
105
+ have_func("rb_errinfo", "ruby.h") # ruby 1.9
106
+
91
107
  # replace files
92
108
  replace = {
93
109
  'OCI8_CLIENT_VERSION' => oraconf.version,
@@ -98,25 +114,32 @@ replace = {
98
114
  replace_keyword(File.dirname(__FILE__) + '/../../lib/oci8.rb.in', '../../lib/oci8.rb', replace)
99
115
 
100
116
  create_header()
101
- $defs = []
102
117
 
103
118
  # make dependency file
104
119
  open("depend", "w") do |f|
105
- f.puts("Makefile: extconf.rb oraconf.rb")
106
- f.puts("\t$(RUBY) extconf.rb")
120
+ extconf_opt = ''
121
+ ['oracle-version', 'runtime-check'].each do |arg|
122
+ opt = with_config(arg)
123
+ case opt
124
+ when String
125
+ extconf_opt += " --with-#{arg}=#{opt}"
126
+ when true
127
+ extconf_opt += " --with-#{arg}=yes"
128
+ when false
129
+ extconf_opt += " --with-#{arg}=no"
130
+ end
131
+ end
132
+ f.puts("Makefile: $(srcdir)/extconf.rb $(srcdir)/oraconf.rb")
133
+ f.puts("\t$(RUBY) $(srcdir)/extconf.rb#{extconf_opt}")
107
134
  $objs.each do |obj|
108
- f.puts("#{obj}: $(srcdir)/#{obj.sub(/\.o$/, ".c")} $(srcdir)/oci8.h Makefile")
135
+ f.puts("#{obj}: $(srcdir)/#{obj.sub(/\.o$/, ".c")} $(srcdir)/oci8.h apiwrap.h Makefile")
109
136
  end
137
+ f.puts("apiwrap.c apiwrap.h: $(srcdir)/apiwrap.c.tmpl $(srcdir)/apiwrap.h.tmpl $(srcdir)/apiwrap.yml $(srcdir)/apiwrap.rb")
138
+ f.puts("\t$(RUBY) $(srcdir)/apiwrap.rb")
110
139
  end
111
140
 
141
+ create_apiwrap()
112
142
 
113
143
  create_makefile("oci8lib")
114
144
 
115
- # append version info to extconf.h
116
- open("extconf.h", "a") do |f|
117
- replace.each do |key, value|
118
- f.puts("#define #{key} \"#{value}\"")
119
- end
120
- end
121
-
122
145
  exit 0