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
@@ -0,0 +1,473 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * ocidatetime.c
4
+ *
5
+ * $Author: kubo $
6
+ * $Date: 2008-09-10 23:07:07 +0900 (Wed, 10 Sep 2008) $
7
+ *
8
+ * Copyright (C) 2005-2008 KUBO Takehiro <kubo@jiubao.org>
9
+ *
10
+ */
11
+ #include "oci8.h"
12
+
13
+ VALUE oci8_make_ocidate(OCIDate *od)
14
+ {
15
+ return rb_ary_new3(6,
16
+ INT2FIX(od->OCIDateYYYY),
17
+ INT2FIX(od->OCIDateMM),
18
+ INT2FIX(od->OCIDateDD),
19
+ INT2FIX(od->OCIDateTime.OCITimeHH),
20
+ INT2FIX(od->OCIDateTime.OCITimeMI),
21
+ INT2FIX(od->OCIDateTime.OCITimeSS));
22
+ }
23
+
24
+ OCIDate *oci8_set_ocidate(OCIDate *od, VALUE val)
25
+ {
26
+ long year, month, day, hour, minute, second;
27
+
28
+ Check_Type(val, T_ARRAY);
29
+ if (RARRAY_LEN(val) != 6) {
30
+ rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
31
+ }
32
+ /* year */
33
+ year = NUM2LONG(RARRAY_PTR(val)[0]);
34
+ if (year < -4712 || 9999 < year) {
35
+ rb_raise(rb_eRuntimeError, "out of year range: %ld", year);
36
+ }
37
+ od->OCIDateYYYY = (sb2)year;
38
+ /* month */
39
+ month = NUM2LONG(RARRAY_PTR(val)[1]);
40
+ if (month < 0 || 12 < month) {
41
+ rb_raise(rb_eRuntimeError, "out of month range: %ld", month);
42
+ }
43
+ od->OCIDateMM = (ub1)month;
44
+ /* day */
45
+ day = NUM2LONG(RARRAY_PTR(val)[2]);
46
+ if (day < 0 || 31 < day) {
47
+ rb_raise(rb_eRuntimeError, "out of day range: %ld", day);
48
+ }
49
+ od->OCIDateDD = (ub1)day;
50
+ /* hour */
51
+ hour = NUM2LONG(RARRAY_PTR(val)[3]);
52
+ if (hour < 0 || 23 < hour) {
53
+ rb_raise(rb_eRuntimeError, "out of hour range: %ld", hour);
54
+ }
55
+ od->OCIDateTime.OCITimeHH = (ub1)hour;
56
+ /* minute */
57
+ minute = NUM2LONG(RARRAY_PTR(val)[4]);
58
+ if (minute < 0 || 59 < minute) {
59
+ rb_raise(rb_eRuntimeError, "out of minute range: %ld", minute);
60
+ }
61
+ od->OCIDateTime.OCITimeMI = (ub1)minute;
62
+ /* second */
63
+ second = NUM2LONG(RARRAY_PTR(val)[5]);
64
+ if (second < 0 || 59 < second) {
65
+ rb_raise(rb_eRuntimeError, "out of second range: %ld", second);
66
+ }
67
+ od->OCIDateTime.OCITimeSS = (ub1)second;
68
+ return od;
69
+ }
70
+
71
+ static VALUE bind_ocidate_get(oci8_bind_t *obind, void *data, void *null_struct)
72
+ {
73
+ return oci8_make_ocidate((OCIDate *)data);
74
+ }
75
+
76
+ static void bind_ocidate_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
77
+ {
78
+ oci8_set_ocidate((OCIDate *)data, val);
79
+ }
80
+
81
+ static void bind_ocidate_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
82
+ {
83
+ obind->value_sz = sizeof(OCIDate);
84
+ obind->alloc_sz = sizeof(OCIDate);
85
+ }
86
+
87
+ static const oci8_bind_class_t bind_ocidate_class = {
88
+ {
89
+ NULL,
90
+ oci8_bind_free,
91
+ sizeof(oci8_bind_t)
92
+ },
93
+ bind_ocidate_get,
94
+ bind_ocidate_set,
95
+ bind_ocidate_init,
96
+ NULL,
97
+ NULL,
98
+ NULL,
99
+ NULL,
100
+ SQLT_ODT,
101
+ };
102
+
103
+ #if defined RUNTIME_API_CHECK || ORACLE_CLIENT_VERSION >= ORAVER_9_0
104
+
105
+ VALUE oci8_make_ocitimestamp(OCIDateTime *dttm)
106
+ {
107
+ sb2 year;
108
+ ub1 month;
109
+ ub1 day;
110
+ ub1 hour;
111
+ ub1 minute;
112
+ ub1 sec;
113
+ ub4 fsec;
114
+ sb1 tz_hour;
115
+ sb1 tz_minute;
116
+ sword rv;
117
+ int have_tz;
118
+
119
+ oci_lc(OCIDateTimeGetDate(oci8_envhp, oci8_errhp, dttm, &year, &month, &day));
120
+ oci_lc(OCIDateTimeGetTime(oci8_envhp, oci8_errhp, dttm, &hour, &minute, &sec, &fsec));
121
+ rv = OCIDateTimeGetTimeZoneOffset(oci8_envhp, oci8_errhp, dttm, &tz_hour, &tz_minute);
122
+ have_tz = (rv == OCI_SUCCESS);
123
+ return rb_ary_new3(9,
124
+ INT2FIX(year),
125
+ INT2FIX(month),
126
+ INT2FIX(day),
127
+ INT2FIX(hour),
128
+ INT2FIX(minute),
129
+ INT2FIX(sec),
130
+ INT2FIX(fsec),
131
+ have_tz ? INT2FIX(tz_hour) : Qnil,
132
+ have_tz ? INT2FIX(tz_minute) : Qnil);
133
+ }
134
+
135
+ OCIDateTime *oci8_set_ocitimestamp(OCIDateTime *dttm, VALUE val, VALUE svc)
136
+ {
137
+ long year;
138
+ long month;
139
+ long day;
140
+ long hour;
141
+ long minute;
142
+ long sec;
143
+ long fsec;
144
+ OraText *tz;
145
+ size_t tzlen;
146
+ char tz_str[32];
147
+ OCISession *seshp = NULL;
148
+
149
+ Check_Type(val, T_ARRAY);
150
+ if (RARRAY_LEN(val) != 9) {
151
+ rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
152
+ }
153
+ /* year */
154
+ year = NUM2LONG(RARRAY_PTR(val)[0]);
155
+ if (year < -4712 || 9999 < year) {
156
+ rb_raise(rb_eRuntimeError, "out of year range: %ld", year);
157
+ }
158
+ /* month */
159
+ month = NUM2LONG(RARRAY_PTR(val)[1]);
160
+ if (month < 0 || 12 < month) {
161
+ rb_raise(rb_eRuntimeError, "out of month range: %ld", month);
162
+ }
163
+ /* day */
164
+ day = NUM2LONG(RARRAY_PTR(val)[2]);
165
+ if (day < 0 || 31 < day) {
166
+ rb_raise(rb_eRuntimeError, "out of day range: %ld", day);
167
+ }
168
+ /* hour */
169
+ hour = NUM2LONG(RARRAY_PTR(val)[3]);
170
+ if (hour < 0 || 23 < hour) {
171
+ rb_raise(rb_eRuntimeError, "out of hour range: %ld", hour);
172
+ }
173
+ /* minute */
174
+ minute = NUM2LONG(RARRAY_PTR(val)[4]);
175
+ if (minute < 0 || 60 < minute) {
176
+ rb_raise(rb_eRuntimeError, "out of minute range: %ld", minute);
177
+ }
178
+ /* second */
179
+ sec = NUM2LONG(RARRAY_PTR(val)[5]);
180
+ if (sec < 0 || 60 < sec) {
181
+ rb_raise(rb_eRuntimeError, "out of second range: %ld", sec);
182
+ }
183
+ /* sec_fraction */
184
+ fsec = NUM2LONG(RARRAY_PTR(val)[6]);
185
+ if (fsec < 0 || 1000000000 < fsec) {
186
+ rb_raise(rb_eRuntimeError, "out of sec_fraction range: %ld", fsec);
187
+ }
188
+ /* time zone */
189
+ if (NIL_P(RARRAY_PTR(val)[7]) && NIL_P(RARRAY_PTR(val)[8])) {
190
+ if (!NIL_P(svc)) {
191
+ /* use session timezone. */
192
+ seshp = oci8_get_oci_session(svc);
193
+ }
194
+ tz = NULL;
195
+ tzlen = 0;
196
+ } else {
197
+ snprintf(tz_str, sizeof(tz_str), "%+02ld:%02ld",
198
+ NUM2LONG(RARRAY_PTR(val)[7]),
199
+ NUM2LONG(RARRAY_PTR(val)[8]));
200
+ tz_str[sizeof(tz_str) - 1] = '\0';
201
+ tz = (OraText*)tz_str;
202
+ tzlen = strlen(tz_str);
203
+ }
204
+ /* construct */
205
+ oci_lc(OCIDateTimeConstruct(seshp ? (void*)seshp : (void*)oci8_envhp, oci8_errhp, dttm,
206
+ (sb2)year,
207
+ (ub1)month,
208
+ (ub1)day,
209
+ (ub1)hour,
210
+ (ub1)minute,
211
+ (ub1)sec,
212
+ (ub4)fsec,
213
+ tz, tzlen));
214
+ return dttm;
215
+ }
216
+
217
+ typedef struct {
218
+ oci8_bind_t obind;
219
+ ub4 type;
220
+ } oci8_bind_dsc_t;
221
+
222
+ static void oci8_bind_dsc_free(oci8_base_t *base)
223
+ {
224
+ oci8_bind_t *obind = (oci8_bind_t *)base;
225
+ ub4 type = ((oci8_bind_dsc_t *)base)->type;
226
+ if (obind->valuep != NULL) {
227
+ ub4 idx = 0;
228
+ void **pp = (void**)obind->valuep;
229
+
230
+ do {
231
+ if (pp[idx] != NULL) {
232
+ OCIDescriptorFree(pp[idx], type);
233
+ pp[idx] = NULL;
234
+ }
235
+ } while (++idx < obind->maxar_sz);
236
+ }
237
+ oci8_bind_free(base);
238
+ }
239
+
240
+ static VALUE bind_ocitimestamp_get(oci8_bind_t *obind, void *data, void *null_struct)
241
+ {
242
+ return oci8_make_ocitimestamp(*(OCIDateTime **)data);
243
+ }
244
+
245
+ static void bind_ocitimestamp_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
246
+ {
247
+ oci8_base_t *stmt;
248
+ oci8_base_t *svcctx;
249
+
250
+ stmt = obind->base.parent;
251
+ if (stmt == NULL || stmt->type != OCI_HTYPE_STMT) {
252
+ rb_raise(rb_eRuntimeError, "oci8lib.so internal error [%s:%d, %p, %d]",
253
+ __FILE__, __LINE__,
254
+ stmt, stmt ? stmt->type : -1);
255
+ }
256
+ svcctx = stmt->parent;
257
+ if (svcctx == NULL || svcctx->type != OCI_HTYPE_SVCCTX) {
258
+ rb_raise(rb_eRuntimeError, "oci8lib.so internal error [%s:%d, %p, %d]",
259
+ __FILE__, __LINE__,
260
+ svcctx, svcctx ? svcctx->type : -1);
261
+ }
262
+ oci8_set_ocitimestamp(*(OCIDateTime **)data, val, svcctx->self);
263
+ }
264
+
265
+ static void bind_ocitimestamp_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
266
+ {
267
+ oci8_bind_dsc_t *obind_dsc = (oci8_bind_dsc_t *)obind;
268
+
269
+ obind->value_sz = sizeof(OCIDateTime *);
270
+ obind->alloc_sz = sizeof(OCIDateTime *);
271
+ obind_dsc->type = OCI_DTYPE_TIMESTAMP_TZ;
272
+ }
273
+
274
+ static void bind_ocitimestamp_init_elem(oci8_bind_t *obind, VALUE svc)
275
+ {
276
+ ub4 idx = 0;
277
+ sword rv;
278
+
279
+ do {
280
+ rv = OCIDescriptorAlloc(oci8_envhp, (dvoid*)((OCIDateTime**)obind->valuep + idx), OCI_DTYPE_TIMESTAMP_TZ, 0, 0);
281
+ if (rv != OCI_SUCCESS)
282
+ oci8_env_raise(oci8_envhp, rv);
283
+ } while (++idx < obind->maxar_sz);
284
+ }
285
+
286
+ static const oci8_bind_class_t bind_ocitimestamp_class = {
287
+ {
288
+ NULL,
289
+ oci8_bind_dsc_free,
290
+ sizeof(oci8_bind_dsc_t)
291
+ },
292
+ bind_ocitimestamp_get,
293
+ bind_ocitimestamp_set,
294
+ bind_ocitimestamp_init,
295
+ bind_ocitimestamp_init_elem,
296
+ NULL,
297
+ NULL,
298
+ NULL,
299
+ SQLT_TIMESTAMP_TZ
300
+ };
301
+
302
+ VALUE oci8_make_ociinterval_ym(OCIInterval *s)
303
+ {
304
+ sb4 year;
305
+ sb4 month;
306
+
307
+ oci_lc(OCIIntervalGetYearMonth(oci8_envhp, oci8_errhp, &year, &month, s));
308
+ return rb_ary_new3(2, INT2FIX(year), INT2FIX(month));
309
+ }
310
+
311
+ OCIInterval *oci8_set_ociinterval_ym(OCIInterval *intvl, VALUE val)
312
+ {
313
+ sb4 year;
314
+ sb4 month;
315
+
316
+ Check_Type(val, T_ARRAY);
317
+ if (RARRAY_LEN(val) != 2) {
318
+ rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
319
+ }
320
+ year = NUM2INT(RARRAY_PTR(val)[0]);
321
+ month = NUM2INT(RARRAY_PTR(val)[1]);
322
+ oci_lc(OCIIntervalSetYearMonth(oci8_envhp, oci8_errhp,
323
+ year, month, intvl));
324
+ return intvl;
325
+ }
326
+
327
+ VALUE oci8_make_ociinterval_ds(OCIInterval *s)
328
+ {
329
+ sb4 day;
330
+ sb4 hour;
331
+ sb4 minute;
332
+ sb4 sec;
333
+ sb4 fsec;
334
+
335
+ oci_lc(OCIIntervalGetDaySecond(oci8_envhp, oci8_errhp, &day, &hour, &minute, &sec, &fsec, s));
336
+ return rb_ary_new3(5,
337
+ INT2FIX(day), INT2FIX(hour),
338
+ INT2FIX(minute), INT2FIX(sec),
339
+ INT2FIX(fsec));
340
+ }
341
+
342
+ OCIInterval *oci8_set_ociinterval_ds(OCIInterval *intvl, VALUE val)
343
+ {
344
+ sb4 day;
345
+ sb4 hour;
346
+ sb4 minute;
347
+ sb4 sec;
348
+ sb4 fsec;
349
+
350
+ Check_Type(val, T_ARRAY);
351
+ if (RARRAY_LEN(val) != 5) {
352
+ rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
353
+ }
354
+ day = NUM2INT(RARRAY_PTR(val)[0]);
355
+ hour = NUM2INT(RARRAY_PTR(val)[1]);
356
+ minute = NUM2INT(RARRAY_PTR(val)[2]);
357
+ sec = NUM2INT(RARRAY_PTR(val)[3]);
358
+ fsec = NUM2INT(RARRAY_PTR(val)[4]);
359
+ oci_lc(OCIIntervalSetDaySecond(oci8_envhp, oci8_errhp,
360
+ day, hour, minute, sec, fsec, intvl));
361
+ return intvl;
362
+ }
363
+
364
+
365
+ static VALUE bind_ociinterval_ym_get(oci8_bind_t *obind, void *data, void *null_struct)
366
+ {
367
+ return oci8_make_ociinterval_ym(*(OCIInterval **)data);
368
+ }
369
+
370
+ static void bind_ociinterval_ym_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
371
+ {
372
+ oci8_set_ociinterval_ym(*(OCIInterval **)data, val);
373
+ }
374
+
375
+ static void bind_ociinterval_ym_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
376
+ {
377
+ oci8_bind_dsc_t *obind_dsc = (oci8_bind_dsc_t *)obind;
378
+
379
+ obind->value_sz = sizeof(OCIInterval*);
380
+ obind->alloc_sz = sizeof(OCIInterval*);
381
+ obind_dsc->type = OCI_DTYPE_INTERVAL_YM;
382
+ }
383
+
384
+ static void bind_ociinterval_ym_init_elem(oci8_bind_t *obind, VALUE svc)
385
+ {
386
+ ub4 idx = 0;
387
+ sword rv;
388
+
389
+ do {
390
+ rv = OCIDescriptorAlloc(oci8_envhp, (dvoid*)((OCIDateTime**)obind->valuep + idx), OCI_DTYPE_INTERVAL_YM, 0, 0);
391
+ if (rv != OCI_SUCCESS)
392
+ oci8_env_raise(oci8_envhp, rv);
393
+ } while (++idx < obind->maxar_sz);
394
+ }
395
+
396
+ static VALUE bind_ociinterval_ds_get(oci8_bind_t *obind, void *data, void *null_struct)
397
+ {
398
+ return oci8_make_ociinterval_ds(*(OCIInterval **)data);
399
+ }
400
+
401
+ static void bind_ociinterval_ds_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
402
+ {
403
+ oci8_set_ociinterval_ds(*(OCIInterval **)data, val);
404
+ }
405
+
406
+ static void bind_ociinterval_ds_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
407
+ {
408
+ oci8_bind_dsc_t *obind_dsc = (oci8_bind_dsc_t *)obind;
409
+
410
+ obind->value_sz = sizeof(OCIInterval *);
411
+ obind->alloc_sz = sizeof(OCIInterval *);
412
+ obind_dsc->type = OCI_DTYPE_INTERVAL_DS;
413
+ }
414
+
415
+ static void bind_ociinterval_ds_init_elem(oci8_bind_t *obind, VALUE svc)
416
+ {
417
+ ub4 idx = 0;
418
+ sword rv;
419
+
420
+ do {
421
+ rv = OCIDescriptorAlloc(oci8_envhp, (dvoid*)((OCIInterval**)obind->valuep + idx), OCI_DTYPE_INTERVAL_DS, 0, 0);
422
+ if (rv != OCI_SUCCESS)
423
+ oci8_env_raise(oci8_envhp, rv);
424
+ } while (++idx < obind->maxar_sz);
425
+ }
426
+
427
+ static const oci8_bind_class_t bind_ociinterval_ym_class = {
428
+ {
429
+ NULL,
430
+ oci8_bind_dsc_free,
431
+ sizeof(oci8_bind_dsc_t)
432
+ },
433
+ bind_ociinterval_ym_get,
434
+ bind_ociinterval_ym_set,
435
+ bind_ociinterval_ym_init,
436
+ bind_ociinterval_ym_init_elem,
437
+ NULL,
438
+ NULL,
439
+ NULL,
440
+ SQLT_INTERVAL_YM
441
+ };
442
+
443
+ static const oci8_bind_class_t bind_ociinterval_ds_class = {
444
+ {
445
+ NULL,
446
+ oci8_bind_dsc_free,
447
+ sizeof(oci8_bind_dsc_t)
448
+ },
449
+ bind_ociinterval_ds_get,
450
+ bind_ociinterval_ds_set,
451
+ bind_ociinterval_ds_init,
452
+ bind_ociinterval_ds_init_elem,
453
+ NULL,
454
+ NULL,
455
+ NULL,
456
+ SQLT_INTERVAL_DS
457
+ };
458
+
459
+ #endif /* defined RUNTIME_API_CHECK || ORACLE_CLIENT_VERSION >= ORAVER_9_0 */
460
+
461
+ void Init_oci_datetime(void)
462
+ {
463
+ oci8_define_bind_class("OCIDate", &bind_ocidate_class);
464
+
465
+ #if defined RUNTIME_API_CHECK || ORACLE_CLIENT_VERSION >= ORAVER_9_0
466
+ if (oracle_client_version >= ORAVER_9_0) {
467
+ oci8_define_bind_class("OCITimestamp", &bind_ocitimestamp_class);
468
+ oci8_define_bind_class("OCIIntervalYM", &bind_ociinterval_ym_class);
469
+ oci8_define_bind_class("OCIIntervalDS", &bind_ociinterval_ds_class);
470
+ }
471
+ #endif
472
+
473
+ }