ruby-staci 2.2.9

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 (115) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +14 -0
  3. data/COPYING +30 -0
  4. data/COPYING_old +64 -0
  5. data/ChangeLog +3826 -0
  6. data/Makefile +92 -0
  7. data/NEWS +1194 -0
  8. data/README.md +66 -0
  9. data/dist-files +113 -0
  10. data/docs/bind-array-to-in_cond.md +38 -0
  11. data/docs/conflicts-local-connections-and-processes.md +98 -0
  12. data/docs/hanging-after-inactivity.md +63 -0
  13. data/docs/install-binary-package.md +44 -0
  14. data/docs/install-full-client.md +111 -0
  15. data/docs/install-instant-client.md +194 -0
  16. data/docs/install-on-osx.md +133 -0
  17. data/docs/ldap-auth-and-function-interposition.md +123 -0
  18. data/docs/number-type-mapping.md +79 -0
  19. data/docs/osx-install-dev-tools.png +0 -0
  20. data/docs/platform-specific-issues.md +164 -0
  21. data/docs/report-installation-issue.md +50 -0
  22. data/docs/timeout-parameters.md +94 -0
  23. data/ext/oci8/.document +18 -0
  24. data/ext/oci8/MANIFEST +18 -0
  25. data/ext/oci8/apiwrap.c.tmpl +178 -0
  26. data/ext/oci8/apiwrap.h.tmpl +61 -0
  27. data/ext/oci8/apiwrap.rb +96 -0
  28. data/ext/oci8/apiwrap.yml +1322 -0
  29. data/ext/oci8/attr.c +57 -0
  30. data/ext/oci8/bind.c +838 -0
  31. data/ext/oci8/connection_pool.c +216 -0
  32. data/ext/oci8/encoding.c +196 -0
  33. data/ext/oci8/env.c +139 -0
  34. data/ext/oci8/error.c +385 -0
  35. data/ext/oci8/extconf.rb +219 -0
  36. data/ext/oci8/hook_funcs.c +407 -0
  37. data/ext/oci8/lob.c +1278 -0
  38. data/ext/oci8/metadata.c +279 -0
  39. data/ext/oci8/object.c +919 -0
  40. data/ext/oci8/oci8.c +1058 -0
  41. data/ext/oci8/oci8.h +556 -0
  42. data/ext/oci8/oci8lib.c +704 -0
  43. data/ext/oci8/ocidatetime.c +506 -0
  44. data/ext/oci8/ocihandle.c +852 -0
  45. data/ext/oci8/ocinumber.c +1922 -0
  46. data/ext/oci8/oraconf.rb +1145 -0
  47. data/ext/oci8/oradate.c +670 -0
  48. data/ext/oci8/oranumber_util.c +352 -0
  49. data/ext/oci8/oranumber_util.h +24 -0
  50. data/ext/oci8/plthook.h +66 -0
  51. data/ext/oci8/plthook_elf.c +702 -0
  52. data/ext/oci8/plthook_osx.c +505 -0
  53. data/ext/oci8/plthook_win32.c +391 -0
  54. data/ext/oci8/post-config.rb +5 -0
  55. data/ext/oci8/stmt.c +448 -0
  56. data/ext/oci8/thread_util.c +81 -0
  57. data/ext/oci8/thread_util.h +18 -0
  58. data/ext/oci8/util.c +71 -0
  59. data/ext/oci8/win32.c +117 -0
  60. data/lib/.document +1 -0
  61. data/lib/dbd/STACI.rb +591 -0
  62. data/lib/oci8/.document +8 -0
  63. data/lib/oci8/bindtype.rb +333 -0
  64. data/lib/oci8/check_load_error.rb +146 -0
  65. data/lib/oci8/compat.rb +117 -0
  66. data/lib/oci8/connection_pool.rb +179 -0
  67. data/lib/oci8/cursor.rb +605 -0
  68. data/lib/oci8/datetime.rb +605 -0
  69. data/lib/oci8/encoding-init.rb +45 -0
  70. data/lib/oci8/encoding.yml +537 -0
  71. data/lib/oci8/metadata.rb +2148 -0
  72. data/lib/oci8/object.rb +641 -0
  73. data/lib/oci8/oci8.rb +756 -0
  74. data/lib/oci8/ocihandle.rb +591 -0
  75. data/lib/oci8/oracle_version.rb +153 -0
  76. data/lib/oci8/properties.rb +196 -0
  77. data/lib/oci8/version.rb +3 -0
  78. data/lib/ruby-staci.rb +1 -0
  79. data/lib/staci.rb +190 -0
  80. data/metaconfig +142 -0
  81. data/pre-distclean.rb +7 -0
  82. data/ruby-aci.gemspec +83 -0
  83. data/setup.rb +1342 -0
  84. data/test/README.md +37 -0
  85. data/test/config.rb +201 -0
  86. data/test/setup_test_object.sql +199 -0
  87. data/test/setup_test_package.sql +59 -0
  88. data/test/test_all.rb +56 -0
  89. data/test/test_appinfo.rb +62 -0
  90. data/test/test_array_dml.rb +333 -0
  91. data/test/test_bind_array.rb +70 -0
  92. data/test/test_bind_boolean.rb +99 -0
  93. data/test/test_bind_integer.rb +47 -0
  94. data/test/test_bind_raw.rb +45 -0
  95. data/test/test_bind_string.rb +105 -0
  96. data/test/test_bind_time.rb +177 -0
  97. data/test/test_break.rb +124 -0
  98. data/test/test_clob.rb +86 -0
  99. data/test/test_connection_pool.rb +124 -0
  100. data/test/test_connstr.rb +220 -0
  101. data/test/test_datetime.rb +585 -0
  102. data/test/test_dbi.rb +365 -0
  103. data/test/test_dbi_clob.rb +53 -0
  104. data/test/test_encoding.rb +103 -0
  105. data/test/test_error.rb +87 -0
  106. data/test/test_metadata.rb +2674 -0
  107. data/test/test_object.rb +546 -0
  108. data/test/test_oci8.rb +624 -0
  109. data/test/test_oracle_version.rb +68 -0
  110. data/test/test_oradate.rb +255 -0
  111. data/test/test_oranumber.rb +786 -0
  112. data/test/test_package_type.rb +981 -0
  113. data/test/test_properties.rb +17 -0
  114. data/test/test_rowid.rb +32 -0
  115. metadata +158 -0
@@ -0,0 +1,506 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * ocidatetime.c
4
+ *
5
+ * Copyright (C) 2005-2014 Kubo Takehiro <kubo@jiubao.org>
6
+ *
7
+ */
8
+ #include "oci8.h"
9
+
10
+ VALUE oci8_make_ocidate(OCIDate *od)
11
+ {
12
+ return rb_ary_new3(6,
13
+ INT2FIX(od->OCIDateYYYY),
14
+ INT2FIX(od->OCIDateMM),
15
+ INT2FIX(od->OCIDateDD),
16
+ INT2FIX(od->OCIDateTime.OCITimeHH),
17
+ INT2FIX(od->OCIDateTime.OCITimeMI),
18
+ INT2FIX(od->OCIDateTime.OCITimeSS));
19
+ }
20
+
21
+ OCIDate *oci8_set_ocidate(OCIDate *od, VALUE val)
22
+ {
23
+ long year, month, day, hour, minute, second;
24
+
25
+ Check_Type(val, T_ARRAY);
26
+ if (RARRAY_LEN(val) != 6) {
27
+ rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
28
+ }
29
+ /* year */
30
+ year = NUM2LONG(RARRAY_AREF(val, 0));
31
+ if (year < -4712 || 9999 < year) {
32
+ rb_raise(rb_eRuntimeError, "out of year range: %ld", year);
33
+ }
34
+ od->OCIDateYYYY = (sb2)year;
35
+ /* month */
36
+ month = NUM2LONG(RARRAY_AREF(val, 1));
37
+ if (month < 0 || 12 < month) {
38
+ rb_raise(rb_eRuntimeError, "out of month range: %ld", month);
39
+ }
40
+ od->OCIDateMM = (ub1)month;
41
+ /* day */
42
+ day = NUM2LONG(RARRAY_AREF(val, 2));
43
+ if (day < 0 || 31 < day) {
44
+ rb_raise(rb_eRuntimeError, "out of day range: %ld", day);
45
+ }
46
+ od->OCIDateDD = (ub1)day;
47
+ /* hour */
48
+ hour = NUM2LONG(RARRAY_AREF(val, 3));
49
+ if (hour < 0 || 23 < hour) {
50
+ rb_raise(rb_eRuntimeError, "out of hour range: %ld", hour);
51
+ }
52
+ od->OCIDateTime.OCITimeHH = (ub1)hour;
53
+ /* minute */
54
+ minute = NUM2LONG(RARRAY_AREF(val, 4));
55
+ if (minute < 0 || 59 < minute) {
56
+ rb_raise(rb_eRuntimeError, "out of minute range: %ld", minute);
57
+ }
58
+ od->OCIDateTime.OCITimeMI = (ub1)minute;
59
+ /* second */
60
+ second = NUM2LONG(RARRAY_AREF(val, 5));
61
+ if (second < 0 || 59 < second) {
62
+ rb_raise(rb_eRuntimeError, "out of second range: %ld", second);
63
+ }
64
+ od->OCIDateTime.OCITimeSS = (ub1)second;
65
+ return od;
66
+ }
67
+
68
+ static void bind_init_common(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
69
+ {
70
+ obind->value_sz = sizeof(void *);
71
+ obind->alloc_sz = sizeof(void *);
72
+ }
73
+
74
+ static void bind_init_elem_common(oci8_bind_t *obind, VALUE svc, ub4 type)
75
+ {
76
+ ub4 idx = 0;
77
+ sword rv;
78
+
79
+ do {
80
+ rv = OCIDescriptorAlloc(oci8_envhp, (dvoid*)((dvoid**)obind->valuep + idx), type, 0, 0);
81
+ if (rv != OCI_SUCCESS)
82
+ oci8_env_raise(oci8_envhp, rv);
83
+ } while (++idx < obind->maxar_sz);
84
+ }
85
+
86
+ static void bind_free_common(oci8_base_t *base, ub4 type)
87
+ {
88
+ oci8_bind_t *obind = (oci8_bind_t *)base;
89
+
90
+ if (obind->valuep != NULL) {
91
+ ub4 idx = 0;
92
+ void **pp = (void**)obind->valuep;
93
+
94
+ do {
95
+ if (pp[idx] != NULL) {
96
+ OCIDescriptorFree(pp[idx], type);
97
+ pp[idx] = NULL;
98
+ }
99
+ } while (++idx < obind->maxar_sz);
100
+ }
101
+ oci8_bind_free(base);
102
+ }
103
+
104
+ VALUE oci8_make_ocitimestamp(OCIDateTime *dttm, boolean have_tz)
105
+ {
106
+ sb2 year;
107
+ ub1 month;
108
+ ub1 day;
109
+ ub1 hour;
110
+ ub1 minute;
111
+ ub1 sec;
112
+ ub4 fsec;
113
+ sb1 tz_hour;
114
+ sb1 tz_minute;
115
+
116
+ chkerr(OCIDateTimeGetDate(oci8_envhp, oci8_errhp, dttm, &year, &month, &day));
117
+ chkerr(OCIDateTimeGetTime(oci8_envhp, oci8_errhp, dttm, &hour, &minute, &sec, &fsec));
118
+ if (have_tz) {
119
+ chkerr(OCIDateTimeGetTimeZoneOffset(oci8_envhp, oci8_errhp, dttm, &tz_hour, &tz_minute));
120
+ }
121
+ return rb_ary_new3(9,
122
+ INT2FIX(year),
123
+ INT2FIX(month),
124
+ INT2FIX(day),
125
+ INT2FIX(hour),
126
+ INT2FIX(minute),
127
+ INT2FIX(sec),
128
+ INT2FIX(fsec),
129
+ have_tz ? INT2FIX(tz_hour) : Qnil,
130
+ have_tz ? INT2FIX(tz_minute) : Qnil);
131
+ }
132
+
133
+ OCIDateTime *oci8_set_ocitimestamp_tz(OCIDateTime *dttm, VALUE val, VALUE svc)
134
+ {
135
+ long year;
136
+ long month;
137
+ long day;
138
+ long hour;
139
+ long minute;
140
+ long sec;
141
+ long fsec;
142
+ OraText *tz;
143
+ size_t tzlen;
144
+ char tz_str[32];
145
+ OCISession *seshp = NULL;
146
+
147
+ Check_Type(val, T_ARRAY);
148
+ if (RARRAY_LEN(val) != 9) {
149
+ rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
150
+ }
151
+ /* year */
152
+ year = NUM2LONG(RARRAY_AREF(val, 0));
153
+ if (year < -4712 || 9999 < year) {
154
+ rb_raise(rb_eRuntimeError, "out of year range: %ld", year);
155
+ }
156
+ /* month */
157
+ month = NUM2LONG(RARRAY_AREF(val, 1));
158
+ if (month < 0 || 12 < month) {
159
+ rb_raise(rb_eRuntimeError, "out of month range: %ld", month);
160
+ }
161
+ /* day */
162
+ day = NUM2LONG(RARRAY_AREF(val, 2));
163
+ if (day < 0 || 31 < day) {
164
+ rb_raise(rb_eRuntimeError, "out of day range: %ld", day);
165
+ }
166
+ /* hour */
167
+ hour = NUM2LONG(RARRAY_AREF(val, 3));
168
+ if (hour < 0 || 23 < hour) {
169
+ rb_raise(rb_eRuntimeError, "out of hour range: %ld", hour);
170
+ }
171
+ /* minute */
172
+ minute = NUM2LONG(RARRAY_AREF(val, 4));
173
+ if (minute < 0 || 60 < minute) {
174
+ rb_raise(rb_eRuntimeError, "out of minute range: %ld", minute);
175
+ }
176
+ /* second */
177
+ sec = NUM2LONG(RARRAY_AREF(val, 5));
178
+ if (sec < 0 || 60 < sec) {
179
+ rb_raise(rb_eRuntimeError, "out of second range: %ld", sec);
180
+ }
181
+ /* sec_fraction */
182
+ fsec = NUM2LONG(RARRAY_AREF(val, 6));
183
+ if (fsec < 0 || 1000000000 < fsec) {
184
+ rb_raise(rb_eRuntimeError, "out of sec_fraction range: %ld", fsec);
185
+ }
186
+ /* time zone */
187
+ if (NIL_P(RARRAY_AREF(val, 7)) && NIL_P(RARRAY_AREF(val, 8))) {
188
+ if (!NIL_P(svc)) {
189
+ /* use session timezone. */
190
+ seshp = oci8_get_oci_session(svc);
191
+ }
192
+ tz = NULL;
193
+ tzlen = 0;
194
+ } else {
195
+ snprintf(tz_str, sizeof(tz_str), "%+02ld:%02ld",
196
+ NUM2LONG(RARRAY_AREF(val, 7)),
197
+ NUM2LONG(RARRAY_AREF(val, 8)));
198
+ tz_str[sizeof(tz_str) - 1] = '\0';
199
+ tz = (OraText*)tz_str;
200
+ tzlen = strlen(tz_str);
201
+ }
202
+ /* construct */
203
+ chkerr(OCIDateTimeConstruct(seshp ? (void*)seshp : (void*)oci8_envhp, oci8_errhp, dttm,
204
+ (sb2)year,
205
+ (ub1)month,
206
+ (ub1)day,
207
+ (ub1)hour,
208
+ (ub1)minute,
209
+ (ub1)sec,
210
+ (ub4)fsec,
211
+ tz, tzlen));
212
+ return dttm;
213
+ }
214
+
215
+ static VALUE bind_ocitimestamp_get(oci8_bind_t *obind, void *data, void *null_struct)
216
+ {
217
+ return oci8_make_ocitimestamp(*(OCIDateTime **)data, FALSE);
218
+ }
219
+
220
+ static void bind_ocitimestamp_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
221
+ {
222
+ oci8_set_ocitimestamp_tz(*(OCIDateTime **)data, val, Qnil);
223
+ }
224
+
225
+ static void bind_ocitimestamp_init_elem(oci8_bind_t *obind, VALUE svc)
226
+ {
227
+ bind_init_elem_common(obind, svc, OCI_DTYPE_TIMESTAMP);
228
+ }
229
+
230
+ static void bind_ocitimestamp_free(oci8_base_t *base)
231
+ {
232
+ bind_free_common(base, OCI_DTYPE_TIMESTAMP);
233
+ }
234
+
235
+ static const oci8_bind_data_type_t bind_ocitimestamp_data_type = {
236
+ {
237
+ {
238
+ "STACI::BindType::OCITimestamp",
239
+ {
240
+ NULL,
241
+ oci8_handle_cleanup,
242
+ oci8_handle_size,
243
+ },
244
+ &oci8_bind_data_type.rb_data_type, NULL,
245
+ #ifdef RUBY_TYPED_WB_PROTECTED
246
+ RUBY_TYPED_WB_PROTECTED,
247
+ #endif
248
+ },
249
+ bind_ocitimestamp_free,
250
+ sizeof(oci8_bind_t)
251
+ },
252
+ bind_ocitimestamp_get,
253
+ bind_ocitimestamp_set,
254
+ bind_init_common,
255
+ bind_ocitimestamp_init_elem,
256
+ NULL,
257
+ SQLT_TIMESTAMP
258
+ };
259
+
260
+ static VALUE bind_ocitimestamp_alloc(VALUE klass)
261
+ {
262
+ return oci8_allocate_typeddata(klass, &bind_ocitimestamp_data_type.base);
263
+ }
264
+
265
+ static VALUE bind_ocitimestamp_tz_get(oci8_bind_t *obind, void *data, void *null_struct)
266
+ {
267
+ return oci8_make_ocitimestamp(*(OCIDateTime **)data, TRUE);
268
+ }
269
+
270
+ static void bind_ocitimestamp_tz_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
271
+ {
272
+ oci8_base_t *parent;
273
+ oci8_base_t *svcctx;
274
+
275
+ parent = obind->base.parent;
276
+ if (parent != NULL && parent->type == OCI_HTYPE_STMT) {
277
+ svcctx = parent->parent;
278
+ } else {
279
+ svcctx = parent;
280
+ }
281
+ if (svcctx == NULL || svcctx->type != OCI_HTYPE_SVCCTX) {
282
+ rb_raise(rb_eRuntimeError, "oci8lib.so internal error [%s:%d, %p, %d, %p, %d]",
283
+ __FILE__, __LINE__,
284
+ parent, parent ? (int)parent->type : -1,
285
+ svcctx, svcctx ? (int)svcctx->type : -1);
286
+ }
287
+ oci8_set_ocitimestamp_tz(*(OCIDateTime **)data, val, svcctx->self);
288
+ }
289
+
290
+ static void bind_ocitimestamp_tz_init(oci8_bind_t *obind, VALUE svc, VALUE val, VALUE length)
291
+ {
292
+ oci8_link_to_parent((oci8_base_t*)obind, (oci8_base_t*)oci8_get_svcctx(svc));
293
+ obind->value_sz = sizeof(OCIDateTime *);
294
+ obind->alloc_sz = sizeof(OCIDateTime *);
295
+ }
296
+
297
+ static void bind_ocitimestamp_tz_init_elem(oci8_bind_t *obind, VALUE svc)
298
+ {
299
+ bind_init_elem_common(obind, svc, OCI_DTYPE_TIMESTAMP_TZ);
300
+ }
301
+
302
+ static void bind_ocitimestamp_tz_free(oci8_base_t *base)
303
+ {
304
+ bind_free_common(base, OCI_DTYPE_TIMESTAMP_TZ);
305
+ }
306
+
307
+ static const oci8_bind_data_type_t bind_ocitimestamp_tz_data_type = {
308
+ {
309
+ {
310
+ "STACI::BindType::OCITimestampTZ",
311
+ {
312
+ NULL,
313
+ oci8_handle_cleanup,
314
+ oci8_handle_size,
315
+ },
316
+ &oci8_bind_data_type.rb_data_type, NULL,
317
+ #ifdef RUBY_TYPED_WB_PROTECTED
318
+ RUBY_TYPED_WB_PROTECTED,
319
+ #endif
320
+ },
321
+ bind_ocitimestamp_tz_free,
322
+ sizeof(oci8_bind_t)
323
+ },
324
+ bind_ocitimestamp_tz_get,
325
+ bind_ocitimestamp_tz_set,
326
+ bind_ocitimestamp_tz_init,
327
+ bind_ocitimestamp_tz_init_elem,
328
+ NULL,
329
+ SQLT_TIMESTAMP_TZ
330
+ };
331
+
332
+ static VALUE bind_ocitimestamp_tz_alloc(VALUE klass)
333
+ {
334
+ return oci8_allocate_typeddata(klass, &bind_ocitimestamp_tz_data_type.base);
335
+ }
336
+
337
+ VALUE oci8_make_ociinterval_ym(OCIInterval *s)
338
+ {
339
+ sb4 year;
340
+ sb4 month;
341
+
342
+ chkerr(OCIIntervalGetYearMonth(oci8_envhp, oci8_errhp, &year, &month, s));
343
+ return rb_ary_new3(2, INT2FIX(year), INT2FIX(month));
344
+ }
345
+
346
+ OCIInterval *oci8_set_ociinterval_ym(OCIInterval *intvl, VALUE val)
347
+ {
348
+ sb4 year;
349
+ sb4 month;
350
+
351
+ Check_Type(val, T_ARRAY);
352
+ if (RARRAY_LEN(val) != 2) {
353
+ rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
354
+ }
355
+ year = NUM2INT(RARRAY_AREF(val, 0));
356
+ month = NUM2INT(RARRAY_AREF(val, 1));
357
+ chkerr(OCIIntervalSetYearMonth(oci8_envhp, oci8_errhp,
358
+ year, month, intvl));
359
+ return intvl;
360
+ }
361
+
362
+ VALUE oci8_make_ociinterval_ds(OCIInterval *s)
363
+ {
364
+ sb4 day;
365
+ sb4 hour;
366
+ sb4 minute;
367
+ sb4 sec;
368
+ sb4 fsec;
369
+
370
+ chkerr(OCIIntervalGetDaySecond(oci8_envhp, oci8_errhp, &day, &hour, &minute, &sec, &fsec, s));
371
+ return rb_ary_new3(5,
372
+ INT2FIX(day), INT2FIX(hour),
373
+ INT2FIX(minute), INT2FIX(sec),
374
+ INT2FIX(fsec));
375
+ }
376
+
377
+ OCIInterval *oci8_set_ociinterval_ds(OCIInterval *intvl, VALUE val)
378
+ {
379
+ sb4 day;
380
+ sb4 hour;
381
+ sb4 minute;
382
+ sb4 sec;
383
+ sb4 fsec;
384
+
385
+ Check_Type(val, T_ARRAY);
386
+ if (RARRAY_LEN(val) != 5) {
387
+ rb_raise(rb_eRuntimeError, "invalid array size %ld", RARRAY_LEN(val));
388
+ }
389
+ day = NUM2INT(RARRAY_AREF(val, 0));
390
+ hour = NUM2INT(RARRAY_AREF(val, 1));
391
+ minute = NUM2INT(RARRAY_AREF(val, 2));
392
+ sec = NUM2INT(RARRAY_AREF(val, 3));
393
+ fsec = NUM2INT(RARRAY_AREF(val, 4));
394
+ chkerr(OCIIntervalSetDaySecond(oci8_envhp, oci8_errhp,
395
+ day, hour, minute, sec, fsec, intvl));
396
+ return intvl;
397
+ }
398
+
399
+
400
+ static VALUE bind_ociinterval_ym_get(oci8_bind_t *obind, void *data, void *null_struct)
401
+ {
402
+ return oci8_make_ociinterval_ym(*(OCIInterval **)data);
403
+ }
404
+
405
+ static void bind_ociinterval_ym_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
406
+ {
407
+ oci8_set_ociinterval_ym(*(OCIInterval **)data, val);
408
+ }
409
+
410
+ static void bind_ociinterval_ym_init_elem(oci8_bind_t *obind, VALUE svc)
411
+ {
412
+ bind_init_elem_common(obind, svc, OCI_DTYPE_INTERVAL_YM);
413
+ }
414
+
415
+ static void bind_ociinterval_ym_free(oci8_base_t *base)
416
+ {
417
+ bind_free_common(base, OCI_DTYPE_INTERVAL_YM);
418
+ }
419
+
420
+ static VALUE bind_ociinterval_ds_get(oci8_bind_t *obind, void *data, void *null_struct)
421
+ {
422
+ return oci8_make_ociinterval_ds(*(OCIInterval **)data);
423
+ }
424
+
425
+ static void bind_ociinterval_ds_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
426
+ {
427
+ oci8_set_ociinterval_ds(*(OCIInterval **)data, val);
428
+ }
429
+
430
+ static void bind_ociinterval_ds_init_elem(oci8_bind_t *obind, VALUE svc)
431
+ {
432
+ bind_init_elem_common(obind, svc, OCI_DTYPE_INTERVAL_DS);
433
+ }
434
+
435
+ static void bind_ociinterval_ds_free(oci8_base_t *base)
436
+ {
437
+ bind_free_common(base, OCI_DTYPE_INTERVAL_DS);
438
+ }
439
+
440
+ static const oci8_bind_data_type_t bind_ociinterval_ym_data_type = {
441
+ {
442
+ {
443
+ "STACI::BindType::OCIIntervalYM",
444
+ {
445
+ NULL,
446
+ oci8_handle_cleanup,
447
+ oci8_handle_size,
448
+ },
449
+ &oci8_bind_data_type.rb_data_type, NULL,
450
+ #ifdef RUBY_TYPED_WB_PROTECTED
451
+ RUBY_TYPED_WB_PROTECTED,
452
+ #endif
453
+ },
454
+ bind_ociinterval_ym_free,
455
+ sizeof(oci8_bind_t)
456
+ },
457
+ bind_ociinterval_ym_get,
458
+ bind_ociinterval_ym_set,
459
+ bind_init_common,
460
+ bind_ociinterval_ym_init_elem,
461
+ NULL,
462
+ SQLT_INTERVAL_YM
463
+ };
464
+
465
+ static VALUE bind_ociinterval_ym_alloc(VALUE klass)
466
+ {
467
+ return oci8_allocate_typeddata(klass, &bind_ociinterval_ym_data_type.base);
468
+ }
469
+
470
+ static const oci8_bind_data_type_t bind_ociinterval_ds_data_type = {
471
+ {
472
+ {
473
+ "STACI::BindType::OCIIntervalDS",
474
+ {
475
+ NULL,
476
+ oci8_handle_cleanup,
477
+ oci8_handle_size,
478
+ },
479
+ &oci8_bind_data_type.rb_data_type, NULL,
480
+ #ifdef RUBY_TYPED_WB_PROTECTED
481
+ RUBY_TYPED_WB_PROTECTED,
482
+ #endif
483
+ },
484
+ bind_ociinterval_ds_free,
485
+ sizeof(oci8_bind_t)
486
+ },
487
+ bind_ociinterval_ds_get,
488
+ bind_ociinterval_ds_set,
489
+ bind_init_common,
490
+ bind_ociinterval_ds_init_elem,
491
+ NULL,
492
+ SQLT_INTERVAL_DS
493
+ };
494
+
495
+ static VALUE bind_ociinterval_ds_alloc(VALUE klass)
496
+ {
497
+ return oci8_allocate_typeddata(klass, &bind_ociinterval_ds_data_type.base);
498
+ }
499
+
500
+ void Init_oci_datetime(void)
501
+ {
502
+ oci8_define_bind_class("OCITimestamp", &bind_ocitimestamp_data_type, bind_ocitimestamp_alloc);
503
+ oci8_define_bind_class("OCITimestampTZ", &bind_ocitimestamp_tz_data_type, bind_ocitimestamp_tz_alloc);
504
+ oci8_define_bind_class("OCIIntervalYM", &bind_ociinterval_ym_data_type, bind_ociinterval_ym_alloc);
505
+ oci8_define_bind_class("OCIIntervalDS", &bind_ociinterval_ds_data_type, bind_ociinterval_ds_alloc);
506
+ }