ruby-oci8 2.1.7 → 2.1.8
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.
- data/ChangeLog +136 -0
- data/NEWS +61 -0
- data/README.md +2 -2
- data/VERSION +1 -1
- data/dist-files +5 -0
- data/docs/install-instant-client.md +2 -0
- data/ext/oci8/attr.c +0 -9
- data/ext/oci8/bind.c +86 -28
- data/ext/oci8/connection_pool.c +32 -17
- data/ext/oci8/extconf.rb +21 -0
- data/ext/oci8/hook_funcs.c +215 -0
- data/ext/oci8/lob.c +363 -168
- data/ext/oci8/metadata.c +43 -26
- data/ext/oci8/object.c +115 -36
- data/ext/oci8/oci8.c +392 -269
- data/ext/oci8/oci8.h +88 -33
- data/ext/oci8/oci8lib.c +59 -28
- data/ext/oci8/ocidatetime.c +100 -36
- data/ext/oci8/ocihandle.c +288 -286
- data/ext/oci8/ocinumber.c +172 -112
- data/ext/oci8/oradate.c +129 -87
- data/ext/oci8/plthook.h +56 -0
- data/ext/oci8/plthook_elf.c +537 -0
- data/ext/oci8/plthook_osx.c +474 -0
- data/ext/oci8/plthook_win32.c +376 -0
- data/ext/oci8/stmt.c +112 -75
- data/lib/oci8/cursor.rb +1 -1
- data/lib/oci8/oci8.rb +71 -0
- data/lib/oci8/properties.rb +18 -3
- metadata +10 -16
data/ext/oci8/oradate.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* oradate.c
|
4
4
|
*
|
5
|
-
* Copyright (C) 2002-
|
5
|
+
* Copyright (C) 2002-2015 Kubo Takehiro <kubo@jiubao.org>
|
6
6
|
*
|
7
7
|
* date and time between 4712 B.C. and 9999 A.D.
|
8
8
|
*/
|
@@ -61,6 +61,35 @@ typedef struct ora_date ora_date_t;
|
|
61
61
|
if (sec < 0 || 59 < sec) \
|
62
62
|
rb_raise(rb_eRangeError, "Out of range for second %d (expect 0 .. 59)", sec)
|
63
63
|
|
64
|
+
#ifdef HAVE_RB_DATA_TYPE_T_FUNCTION
|
65
|
+
#define check_oradate(obj) ((ora_date_t*)Check_TypedStruct((obj), &odate_data_type))
|
66
|
+
#else
|
67
|
+
static ora_date_t *check_oradate(VALUE obj)
|
68
|
+
{
|
69
|
+
if (!rb_obj_is_kind_of(obj, cOraDate)) {
|
70
|
+
rb_raise(rb_eTypeError, "wrong argument type %s (expected %s)",
|
71
|
+
rb_obj_classname(obj), rb_class2name(cOraDate));
|
72
|
+
}
|
73
|
+
return DATA_PTR(obj);
|
74
|
+
}
|
75
|
+
#endif
|
76
|
+
|
77
|
+
static size_t odate_memsize(const void *ptr)
|
78
|
+
{
|
79
|
+
return sizeof(ora_date_t);
|
80
|
+
}
|
81
|
+
|
82
|
+
static const rb_data_type_t odate_data_type = {
|
83
|
+
"OraDate",
|
84
|
+
{NULL, RUBY_DEFAULT_FREE, odate_memsize,},
|
85
|
+
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
86
|
+
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
87
|
+
#endif
|
88
|
+
#ifdef RUBY_TYPED_WB_PROTECTED
|
89
|
+
| RUBY_TYPED_WB_PROTECTED
|
90
|
+
#endif
|
91
|
+
};
|
92
|
+
|
64
93
|
static void oci8_set_ora_date(ora_date_t *od, int year, int month, int day, int hour, int minute, int second)
|
65
94
|
{
|
66
95
|
Set_year(od, year);
|
@@ -74,12 +103,11 @@ static void oci8_set_ora_date(ora_date_t *od, int year, int month, int day, int
|
|
74
103
|
static VALUE ora_date_s_allocate(VALUE klass)
|
75
104
|
{
|
76
105
|
ora_date_t *od;
|
77
|
-
return
|
106
|
+
return TypedData_Make_Struct(klass, ora_date_t, &odate_data_type, od);
|
78
107
|
}
|
79
108
|
|
80
109
|
/*
|
81
|
-
*
|
82
|
-
* initialize(year = 1, month = 1, day = 1, hour = 0, min = 0, sec = 0)
|
110
|
+
* @overload initialize(year = 1, month = 1, day = 1, hour = 0, min = 0, sec = 0)
|
83
111
|
*
|
84
112
|
* Returns an <code>OraDate</code> object initialized to the specified date and time.
|
85
113
|
*
|
@@ -87,11 +115,18 @@ static VALUE ora_date_s_allocate(VALUE klass)
|
|
87
115
|
* OraDate.new # => 0001-01-01 00:00:00
|
88
116
|
* OraDate.new(2012) # => 2012-01-01 00:00:00
|
89
117
|
* OraDate.new(2012, 3, 4) # => 2012-03-04 00:00:00
|
118
|
+
*
|
119
|
+
* @param [Fixnum] year year
|
120
|
+
* @param [Fixnum] month month
|
121
|
+
* @param [Fixnum] day day of month
|
122
|
+
* @param [Fixnum] hour hour
|
123
|
+
* @param [Fixnum] min minute
|
124
|
+
* @param [Fixnum] sec second
|
90
125
|
*/
|
91
126
|
static VALUE ora_date_initialize(int argc, VALUE *argv, VALUE self)
|
92
127
|
{
|
93
128
|
VALUE vyear, vmonth, vday, vhour, vmin, vsec;
|
94
|
-
ora_date_t *od =
|
129
|
+
ora_date_t *od = check_oradate(self);
|
95
130
|
int year, month, day, hour, min, sec;
|
96
131
|
|
97
132
|
rb_scan_args(argc, argv, "06", &vyear, &vmonth, &vday, &vhour, &vmin, &vsec);
|
@@ -147,16 +182,17 @@ static VALUE ora_date_initialize(int argc, VALUE *argv, VALUE self)
|
|
147
182
|
*/
|
148
183
|
static VALUE ora_date_initialize_copy(VALUE lhs, VALUE rhs)
|
149
184
|
{
|
150
|
-
ora_date_t *l
|
185
|
+
ora_date_t *l = check_oradate(lhs);
|
186
|
+
ora_date_t *r = check_oradate(rhs);
|
151
187
|
|
152
188
|
rb_call_super(1, &rhs);
|
153
|
-
Data_Get_Struct(lhs, ora_date_t, l);
|
154
|
-
Data_Get_Struct(rhs, ora_date_t, r);
|
155
189
|
memcpy(l, r, sizeof(ora_date_t));
|
156
190
|
return lhs;
|
157
191
|
}
|
158
192
|
|
159
193
|
/*
|
194
|
+
* @overload now
|
195
|
+
*
|
160
196
|
* Returns an <code>OraDate</code> object initialized to the
|
161
197
|
* current local time.
|
162
198
|
*
|
@@ -165,7 +201,7 @@ static VALUE ora_date_initialize_copy(VALUE lhs, VALUE rhs)
|
|
165
201
|
static VALUE ora_date_s_now(int argc, VALUE *argv, VALUE klass)
|
166
202
|
{
|
167
203
|
VALUE obj = ora_date_s_allocate(klass);
|
168
|
-
ora_date_t *od =
|
204
|
+
ora_date_t *od = check_oradate(obj);
|
169
205
|
time_t tm = time(0);
|
170
206
|
int year, month, day, hour, min, sec;
|
171
207
|
#ifdef HAVE_LOCALTIME_R
|
@@ -188,6 +224,8 @@ static VALUE ora_date_s_now(int argc, VALUE *argv, VALUE klass)
|
|
188
224
|
}
|
189
225
|
|
190
226
|
/*
|
227
|
+
* @overload to_s
|
228
|
+
*
|
191
229
|
* Returns a string representing <i>self</i>.
|
192
230
|
* The string format is 'yyyy/mm/dd hh:mi:ss'.
|
193
231
|
*
|
@@ -195,26 +233,26 @@ static VALUE ora_date_s_now(int argc, VALUE *argv, VALUE klass)
|
|
195
233
|
*/
|
196
234
|
static VALUE ora_date_to_s(VALUE self)
|
197
235
|
{
|
198
|
-
ora_date_t *od;
|
236
|
+
ora_date_t *od = check_oradate(self);
|
199
237
|
char buf[30];
|
200
238
|
|
201
|
-
Data_Get_Struct(self, ora_date_t, od);
|
202
239
|
sprintf(buf, "%04d/%02d/%02d %02d:%02d:%02d", Get_year(od), Get_month(od),
|
203
240
|
Get_day(od), Get_hour(od), Get_minute(od), Get_second(od));
|
204
241
|
return rb_usascii_str_new_cstr(buf);
|
205
242
|
}
|
206
243
|
|
207
244
|
/*
|
245
|
+
* @overload to_a
|
246
|
+
*
|
208
247
|
* Returns a 6-element <i>array</i> of year, month, day, hour, minute and second.
|
209
248
|
*
|
210
249
|
* @return [Array]
|
211
250
|
*/
|
212
251
|
static VALUE ora_date_to_a(VALUE self)
|
213
252
|
{
|
214
|
-
ora_date_t *od;
|
253
|
+
ora_date_t *od = check_oradate(self);
|
215
254
|
VALUE ary[6];
|
216
255
|
|
217
|
-
Data_Get_Struct(self, ora_date_t, od);
|
218
256
|
ary[0] = INT2FIX(Get_year(od));
|
219
257
|
ary[1] = INT2FIX(Get_month(od));
|
220
258
|
ary[2] = INT2FIX(Get_day(od));
|
@@ -225,39 +263,39 @@ static VALUE ora_date_to_a(VALUE self)
|
|
225
263
|
}
|
226
264
|
|
227
265
|
/*
|
266
|
+
* @overload year
|
267
|
+
*
|
228
268
|
* Returns the year field of <i>self</i>.
|
229
269
|
*
|
230
270
|
* @return [Fixnum]
|
231
271
|
*/
|
232
272
|
static VALUE ora_date_year(VALUE self)
|
233
273
|
{
|
234
|
-
ora_date_t *od;
|
274
|
+
ora_date_t *od = check_oradate(self);
|
235
275
|
|
236
|
-
Data_Get_Struct(self, ora_date_t, od);
|
237
276
|
return INT2FIX(Get_year(od));
|
238
277
|
}
|
239
278
|
|
240
279
|
/*
|
241
|
-
*
|
242
|
-
* year = num
|
280
|
+
* @overload year=num
|
243
281
|
*
|
244
282
|
* Assigns <i>num</i> to the year field of <i>self</i>.
|
245
283
|
*
|
246
|
-
* @param [Fixnum] number between -4712 and 9999
|
284
|
+
* @param [Fixnum] num number between -4712 and 9999
|
247
285
|
*/
|
248
286
|
static VALUE ora_date_set_year(VALUE self, VALUE val)
|
249
287
|
{
|
250
|
-
ora_date_t *od;
|
251
|
-
int v;
|
288
|
+
ora_date_t *od = check_oradate(self);
|
289
|
+
int v = NUM2INT(val);
|
252
290
|
|
253
|
-
v = NUM2INT(val);
|
254
291
|
Check_year(v);
|
255
|
-
Data_Get_Struct(self, ora_date_t, od);
|
256
292
|
Set_year(od, v);
|
257
293
|
return self;
|
258
294
|
}
|
259
295
|
|
260
296
|
/*
|
297
|
+
* @overload month
|
298
|
+
*
|
261
299
|
* Returns the month field of <i>self</i>.
|
262
300
|
* The month starts with one.
|
263
301
|
*
|
@@ -265,166 +303,157 @@ static VALUE ora_date_set_year(VALUE self, VALUE val)
|
|
265
303
|
*/
|
266
304
|
static VALUE ora_date_month(VALUE self)
|
267
305
|
{
|
268
|
-
ora_date_t *od;
|
306
|
+
ora_date_t *od = check_oradate(self);
|
269
307
|
|
270
|
-
Data_Get_Struct(self, ora_date_t, od);
|
271
308
|
return INT2FIX(Get_month(od));
|
272
309
|
}
|
273
310
|
|
274
311
|
/*
|
275
|
-
*
|
276
|
-
* month = num
|
312
|
+
* @overload month=num
|
277
313
|
*
|
278
314
|
* Assigns <i>num</i> to the month field of <i>self</i>.
|
279
315
|
* The month starts with one.
|
280
316
|
*
|
281
|
-
* @param [Fixnum] number between 1 and 12
|
317
|
+
* @param [Fixnum] num number between 1 and 12
|
282
318
|
*/
|
283
319
|
static VALUE ora_date_set_month(VALUE self, VALUE val)
|
284
320
|
{
|
285
|
-
ora_date_t *od;
|
286
|
-
int v;
|
321
|
+
ora_date_t *od = check_oradate(self);
|
322
|
+
int v = NUM2INT(val);
|
287
323
|
|
288
|
-
v = NUM2INT(val);
|
289
324
|
Check_month(v);
|
290
|
-
Data_Get_Struct(self, ora_date_t, od);
|
291
325
|
Set_month(od, v);
|
292
326
|
return self;
|
293
327
|
}
|
294
328
|
|
295
329
|
/*
|
330
|
+
* @overload day
|
331
|
+
*
|
296
332
|
* Returns the day of month field of <i>self</i>.
|
297
333
|
*
|
298
334
|
* @return [Fixnum]
|
299
335
|
*/
|
300
336
|
static VALUE ora_date_day(VALUE self)
|
301
337
|
{
|
302
|
-
ora_date_t *od;
|
338
|
+
ora_date_t *od = check_oradate(self);
|
303
339
|
|
304
|
-
Data_Get_Struct(self, ora_date_t, od);
|
305
340
|
return INT2FIX(Get_day(od));
|
306
341
|
}
|
307
342
|
|
308
343
|
/*
|
309
|
-
*
|
310
|
-
* day = num
|
344
|
+
* @overload day=num
|
311
345
|
*
|
312
346
|
* Assigns <i>num</i> to the day of month field of <i>self</i>.
|
313
347
|
*
|
314
|
-
* @param [Fixnum] number between 1 and 31
|
348
|
+
* @param [Fixnum] num number between 1 and 31
|
315
349
|
*/
|
316
350
|
static VALUE ora_date_set_day(VALUE self, VALUE val)
|
317
351
|
{
|
318
|
-
ora_date_t *od;
|
319
|
-
int v;
|
352
|
+
ora_date_t *od = check_oradate(self);
|
353
|
+
int v = NUM2INT(val);
|
320
354
|
|
321
|
-
v = NUM2INT(val);
|
322
355
|
Check_day(v);
|
323
|
-
Data_Get_Struct(self, ora_date_t, od);
|
324
356
|
Set_day(od, v);
|
325
357
|
return self;
|
326
358
|
}
|
327
359
|
|
328
360
|
/*
|
361
|
+
* @overload hour
|
362
|
+
*
|
329
363
|
* Returns the hour field of <i>self</i>.
|
330
364
|
*
|
331
365
|
* @return [Fixnum]
|
332
366
|
*/
|
333
367
|
static VALUE ora_date_hour(VALUE self)
|
334
368
|
{
|
335
|
-
ora_date_t *od;
|
369
|
+
ora_date_t *od = check_oradate(self);
|
336
370
|
|
337
|
-
Data_Get_Struct(self, ora_date_t, od);
|
338
371
|
return INT2FIX(Get_hour(od));
|
339
372
|
}
|
340
373
|
|
341
374
|
/*
|
342
|
-
*
|
343
|
-
* hour = num
|
375
|
+
* @overload hour=num
|
344
376
|
*
|
345
377
|
* Assigns <i>num</i> to the hour field of <i>self</i>.
|
346
378
|
*
|
347
|
-
* @param [Fixnum] number between 0 and 23
|
379
|
+
* @param [Fixnum] num number between 0 and 23
|
348
380
|
*/
|
349
381
|
static VALUE ora_date_set_hour(VALUE self, VALUE val)
|
350
382
|
{
|
351
|
-
ora_date_t *od;
|
352
|
-
int v;
|
383
|
+
ora_date_t *od = check_oradate(self);
|
384
|
+
int v = NUM2INT(val);
|
353
385
|
|
354
|
-
v = NUM2INT(val);
|
355
386
|
Check_hour(v);
|
356
|
-
Data_Get_Struct(self, ora_date_t, od);
|
357
387
|
Set_hour(od, v);
|
358
388
|
return self;
|
359
389
|
}
|
360
390
|
|
361
391
|
/*
|
392
|
+
* @overload minute
|
393
|
+
*
|
362
394
|
* Returns the minute field of <i>self</i>.
|
363
395
|
*
|
364
396
|
* @return [Fixnum]
|
365
397
|
*/
|
366
398
|
static VALUE ora_date_minute(VALUE self)
|
367
399
|
{
|
368
|
-
ora_date_t *od;
|
400
|
+
ora_date_t *od = check_oradate(self);
|
369
401
|
|
370
|
-
Data_Get_Struct(self, ora_date_t, od);
|
371
402
|
return INT2FIX(Get_minute(od));
|
372
403
|
}
|
373
404
|
|
374
405
|
/*
|
375
|
-
*
|
376
|
-
* minute = num
|
406
|
+
* @overload minute=num
|
377
407
|
*
|
378
408
|
* Assigns <i>num</i> to the minute field of <i>self</i>.
|
379
409
|
*
|
380
|
-
* @param [Fixnum] number between 0 and 59
|
410
|
+
* @param [Fixnum] num number between 0 and 59
|
381
411
|
*/
|
382
412
|
static VALUE ora_date_set_minute(VALUE self, VALUE val)
|
383
413
|
{
|
384
|
-
ora_date_t *od;
|
385
|
-
int v;
|
414
|
+
ora_date_t *od = check_oradate(self);
|
415
|
+
int v = NUM2INT(val);
|
386
416
|
|
387
|
-
v = NUM2INT(val);
|
388
417
|
Check_minute(v);
|
389
|
-
Data_Get_Struct(self, ora_date_t, od);
|
390
418
|
Set_minute(od, v);
|
391
419
|
return self;
|
392
420
|
}
|
393
421
|
|
394
422
|
/*
|
423
|
+
* @overload second
|
424
|
+
*
|
395
425
|
* Returns the second field of <i>self</i>.
|
396
426
|
*
|
397
427
|
* @return [Fixnum]
|
398
428
|
*/
|
399
429
|
static VALUE ora_date_second(VALUE self)
|
400
430
|
{
|
401
|
-
ora_date_t *od;
|
431
|
+
ora_date_t *od = check_oradate(self);
|
402
432
|
|
403
|
-
Data_Get_Struct(self, ora_date_t, od);
|
404
433
|
return INT2FIX(Get_second(od));
|
405
434
|
}
|
406
435
|
|
407
436
|
/*
|
408
|
-
*
|
409
|
-
* second = num
|
437
|
+
* @overload second=num
|
410
438
|
*
|
411
439
|
* Assigns <i>num</i> to the second field of <i>self</i>.
|
412
440
|
*
|
413
|
-
* @param [Fixnum] number between 0 and 59
|
441
|
+
* @param [Fixnum] num number between 0 and 59
|
414
442
|
*/
|
415
443
|
static VALUE ora_date_set_second(VALUE self, VALUE val)
|
416
444
|
{
|
417
|
-
ora_date_t *od;
|
445
|
+
ora_date_t *od = check_oradate(self);
|
418
446
|
int v;
|
419
447
|
|
420
448
|
v = NUM2INT(val);
|
421
449
|
Check_second(v);
|
422
|
-
Data_Get_Struct(self, ora_date_t, od);
|
423
450
|
Set_second(od, v);
|
424
451
|
return self;
|
425
452
|
}
|
426
453
|
|
427
454
|
/*
|
455
|
+
* @overload trunc
|
456
|
+
*
|
428
457
|
* Truncates hour, minute and second fields to zero.
|
429
458
|
*
|
430
459
|
* @example
|
@@ -435,9 +464,8 @@ static VALUE ora_date_set_second(VALUE self, VALUE val)
|
|
435
464
|
*/
|
436
465
|
static VALUE ora_date_trunc(VALUE self)
|
437
466
|
{
|
438
|
-
ora_date_t *od;
|
467
|
+
ora_date_t *od = check_oradate(self);
|
439
468
|
|
440
|
-
Data_Get_Struct(self, ora_date_t, od);
|
441
469
|
od->hour = 1;
|
442
470
|
od->minute = 1;
|
443
471
|
od->second = 1;
|
@@ -445,18 +473,18 @@ static VALUE ora_date_trunc(VALUE self)
|
|
445
473
|
}
|
446
474
|
|
447
475
|
/*
|
448
|
-
*
|
449
|
-
* self <=> other
|
476
|
+
* @overload <=>(other)
|
450
477
|
*
|
451
478
|
* Returns -1, 0, or +1 depending on whether <i>self</i> is less than,
|
452
479
|
* equal to, or greater than <i>other</i>.
|
480
|
+
*
|
481
|
+
* @return [-1, 0, +1]
|
453
482
|
*/
|
454
483
|
static VALUE ora_date_cmp(VALUE self, VALUE val)
|
455
484
|
{
|
456
|
-
ora_date_t *od1
|
457
|
-
|
458
|
-
|
459
|
-
Data_Get_Struct(val, ora_date_t, od2);
|
485
|
+
ora_date_t *od1 = check_oradate(self);
|
486
|
+
ora_date_t *od2 = check_oradate(val);
|
487
|
+
|
460
488
|
if (od1->century < od2->century) return INT2FIX(-1);
|
461
489
|
if (od1->century > od2->century) return INT2FIX(1);
|
462
490
|
if (od1->year < od2->year) return INT2FIX(-1);
|
@@ -479,10 +507,9 @@ static VALUE ora_date_cmp(VALUE self, VALUE val)
|
|
479
507
|
*/
|
480
508
|
static VALUE ora_date_hash(VALUE self)
|
481
509
|
{
|
482
|
-
ora_date_t *od;
|
510
|
+
ora_date_t *od = check_oradate(self);
|
483
511
|
unsigned int v;
|
484
512
|
|
485
|
-
Data_Get_Struct(self, ora_date_t, od);
|
486
513
|
v = (od->century << 8)
|
487
514
|
+ (od->year << 15)
|
488
515
|
+ (od->month << 22)
|
@@ -494,6 +521,8 @@ static VALUE ora_date_hash(VALUE self)
|
|
494
521
|
}
|
495
522
|
|
496
523
|
/*
|
524
|
+
* @overload _dump
|
525
|
+
*
|
497
526
|
* Serializes <i>self</i>.
|
498
527
|
* This method is called by Marshal.dump().
|
499
528
|
*
|
@@ -502,14 +531,13 @@ static VALUE ora_date_hash(VALUE self)
|
|
502
531
|
*/
|
503
532
|
static VALUE ora_date_dump(int argc, VALUE *argv, VALUE self)
|
504
533
|
{
|
505
|
-
ora_date_t *od;
|
506
|
-
|
534
|
+
ora_date_t *od = check_oradate(self);
|
535
|
+
|
507
536
|
return rb_str_new((const char*)od, sizeof(ora_date_t)); /* ASCII-8BIT */
|
508
537
|
}
|
509
538
|
|
510
539
|
/*
|
511
|
-
*
|
512
|
-
* _load(bytes)
|
540
|
+
* @overload _load(bytes)
|
513
541
|
*
|
514
542
|
* Restores a byte stream serialized by {OraDate#_dump}.
|
515
543
|
* This method is called by Marshal.load() to deserialize a byte stream
|
@@ -527,7 +555,7 @@ static VALUE ora_date_s_load(VALUE klass, VALUE str)
|
|
527
555
|
if (RSTRING_LEN(str) != sizeof(ora_date_t)) {
|
528
556
|
rb_raise(rb_eTypeError, "marshaled OraDate format differ");
|
529
557
|
}
|
530
|
-
obj =
|
558
|
+
obj = TypedData_Make_Struct(cOraDate, ora_date_t, &odate_data_type, od);
|
531
559
|
memcpy(od, RSTRING_PTR(str), sizeof(ora_date_t));
|
532
560
|
return obj;
|
533
561
|
}
|
@@ -542,17 +570,15 @@ static VALUE bind_oradate_get(oci8_bind_t *obind, void *data, void *null_struct)
|
|
542
570
|
{
|
543
571
|
ora_date_t *od;
|
544
572
|
|
545
|
-
VALUE obj =
|
573
|
+
VALUE obj = TypedData_Make_Struct(cOraDate, ora_date_t, &odate_data_type, od);
|
546
574
|
memcpy(od, data, sizeof(ora_date_t));
|
547
575
|
return obj;
|
548
576
|
}
|
549
577
|
|
550
578
|
static void bind_oradate_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
|
551
579
|
{
|
552
|
-
ora_date_t *od;
|
580
|
+
ora_date_t *od = check_oradate(val);
|
553
581
|
|
554
|
-
Check_Object(val, cOraDate);
|
555
|
-
Data_Get_Struct(val, ora_date_t, od);
|
556
582
|
memcpy(data, od, sizeof(ora_date_t));
|
557
583
|
}
|
558
584
|
|
@@ -571,9 +597,20 @@ static void bind_oradate_init_elem(oci8_bind_t *obind, VALUE svc)
|
|
571
597
|
} while (++idx < obind->maxar_sz);
|
572
598
|
}
|
573
599
|
|
574
|
-
static const
|
600
|
+
static const oci8_bind_data_type_t bind_oradate_data_type = {
|
575
601
|
{
|
576
|
-
|
602
|
+
{
|
603
|
+
"OCI8::BindType::OraDate",
|
604
|
+
{
|
605
|
+
NULL,
|
606
|
+
oci8_handle_cleanup,
|
607
|
+
oci8_handle_size,
|
608
|
+
},
|
609
|
+
&oci8_bind_data_type.rb_data_type, NULL,
|
610
|
+
#ifdef RUBY_TYPED_WB_PROTECTED
|
611
|
+
RUBY_TYPED_WB_PROTECTED,
|
612
|
+
#endif
|
613
|
+
},
|
577
614
|
oci8_bind_free,
|
578
615
|
sizeof(oci8_bind_t)
|
579
616
|
},
|
@@ -585,6 +622,11 @@ static const oci8_bind_vtable_t bind_oradate_vtable = {
|
|
585
622
|
SQLT_DAT,
|
586
623
|
};
|
587
624
|
|
625
|
+
static VALUE bind_oradate_alloc(VALUE klass)
|
626
|
+
{
|
627
|
+
return oci8_allocate_typeddata(klass, &bind_oradate_data_type.base);
|
628
|
+
}
|
629
|
+
|
588
630
|
void Init_ora_date(void)
|
589
631
|
{
|
590
632
|
cOraDate = rb_define_class("OraDate", rb_cObject);
|
@@ -624,5 +666,5 @@ void Init_ora_date(void)
|
|
624
666
|
rb_define_method(cOraDate, "_dump", ora_date_dump, -1);
|
625
667
|
rb_define_singleton_method(cOraDate, "_load", ora_date_s_load, 1);
|
626
668
|
|
627
|
-
oci8_define_bind_class("OraDate", &
|
669
|
+
oci8_define_bind_class("OraDate", &bind_oradate_data_type, bind_oradate_alloc);
|
628
670
|
}
|