ruby-oci8 2.0.4 → 2.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/ChangeLog +158 -1
- data/Makefile +1 -3
- data/NEWS +70 -0
- data/VERSION +1 -1
- data/dist-files +1 -0
- data/ext/oci8/apiwrap.yml +284 -138
- data/ext/oci8/attr.c +1 -1
- data/ext/oci8/bind.c +36 -9
- data/ext/oci8/env.c +59 -33
- data/ext/oci8/error.c +4 -0
- data/ext/oci8/extconf.rb +15 -1
- data/ext/oci8/lob.c +44 -0
- data/ext/oci8/metadata.c +1 -1
- data/ext/oci8/object.c +55 -0
- data/ext/oci8/oci8.c +9 -14
- data/ext/oci8/oci8.h +39 -25
- data/ext/oci8/oci8lib.c +38 -3
- data/ext/oci8/ocidatetime.c +69 -80
- data/ext/oci8/ocihandle.c +9 -1
- data/ext/oci8/ocinumber.c +40 -18
- data/ext/oci8/oraconf.rb +126 -126
- data/ext/oci8/oradate.c +2 -2
- data/ext/oci8/oranumber_util.c +38 -1
- data/ext/oci8/stmt.c +28 -22
- data/ext/oci8/win32.c +9 -3
- data/lib/oci8.rb.in +13 -2
- data/lib/oci8/.document +1 -0
- data/lib/oci8/bindtype.rb +16 -3
- data/lib/oci8/datetime.rb +14 -6
- data/lib/oci8/encoding-init.rb +6 -1
- data/lib/oci8/encoding.yml +2 -2
- data/lib/oci8/object.rb +28 -9
- data/lib/oci8/oci8.rb +22 -6
- data/lib/oci8/properties.rb +50 -0
- data/test/test_break.rb +6 -7
- data/test/test_oranumber.rb +96 -5
- metadata +7 -4
data/ext/oci8/oradate.c
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
* oradate.c
|
4
4
|
*
|
5
5
|
* $Author: kubo $
|
6
|
-
* $Date:
|
6
|
+
* $Date: 2010-09-05 22:07:21 +0900 (日, 05 9月 2010) $
|
7
7
|
*
|
8
8
|
* Copyright (C) 2002-2008 KUBO Takehiro <kubo@jiubao.org>
|
9
9
|
*
|
@@ -146,7 +146,7 @@ static VALUE ora_date_initialize_copy(VALUE lhs, VALUE rhs)
|
|
146
146
|
{
|
147
147
|
ora_date_t *l, *r;
|
148
148
|
|
149
|
-
|
149
|
+
rb_call_super(1, &rhs);
|
150
150
|
Data_Get_Struct(lhs, ora_date_t, l);
|
151
151
|
Data_Get_Struct(rhs, ora_date_t, r);
|
152
152
|
memcpy(l, r, sizeof(ora_date_t));
|
data/ext/oci8/oranumber_util.c
CHANGED
@@ -37,9 +37,24 @@ int oranumber_to_str(const OCINumber *on, char *buf, int buflen)
|
|
37
37
|
PUTEND();
|
38
38
|
return 1;
|
39
39
|
}
|
40
|
+
if (on->OCINumberPart[1] == 0) {
|
41
|
+
/* negative infinity */
|
42
|
+
PUTC('-');
|
43
|
+
PUTC('~');
|
44
|
+
PUTEND();
|
45
|
+
return 2;
|
46
|
+
}
|
40
47
|
/* unexpected format */
|
41
48
|
return -1;
|
42
49
|
}
|
50
|
+
if (datalen == 2) {
|
51
|
+
if (on->OCINumberPart[1] == 255 && on->OCINumberPart[2] == 101) {
|
52
|
+
/* positive infinity */
|
53
|
+
PUTC('~');
|
54
|
+
PUTEND();
|
55
|
+
return 1;
|
56
|
+
}
|
57
|
+
}
|
43
58
|
if (datalen > 21) {
|
44
59
|
/* too long */
|
45
60
|
return -1;
|
@@ -137,6 +152,28 @@ int oranumber_from_str(OCINumber *on, const char *buf, int buflen)
|
|
137
152
|
buf++;
|
138
153
|
is_positive = 0;
|
139
154
|
}
|
155
|
+
if (*buf == '~') {
|
156
|
+
buf ++;
|
157
|
+
/* skip trailing spaces */
|
158
|
+
while (buf < end && *buf == ' ') {
|
159
|
+
buf++;
|
160
|
+
}
|
161
|
+
if (buf != end) {
|
162
|
+
return ORANUMBER_INVALID_NUMBER;
|
163
|
+
}
|
164
|
+
if (is_positive) {
|
165
|
+
/* positive infinity */
|
166
|
+
on->OCINumberPart[0] = 2;
|
167
|
+
on->OCINumberPart[1] = 255;
|
168
|
+
on->OCINumberPart[2] = 101;
|
169
|
+
} else {
|
170
|
+
/* negative infinity */
|
171
|
+
on->OCINumberPart[0] = 1;
|
172
|
+
on->OCINumberPart[1] = 0;
|
173
|
+
}
|
174
|
+
return ORANUMBER_SUCCESS;
|
175
|
+
}
|
176
|
+
|
140
177
|
/* next should be number or a dot */
|
141
178
|
if ((*buf < '0' || '9' < *buf) && *buf != '.') {
|
142
179
|
return ORANUMBER_INVALID_NUMBER;
|
@@ -308,7 +345,7 @@ int oranumber_dump(const OCINumber *on, char *buf)
|
|
308
345
|
len = 21;
|
309
346
|
}
|
310
347
|
for (idx = 1; idx <= len; idx++) {
|
311
|
-
offset += sprintf(buf + offset, "%
|
348
|
+
offset += sprintf(buf + offset, "%u,", (ub4)on->OCINumberPart[idx]);
|
312
349
|
}
|
313
350
|
buf[--offset] = '\0';
|
314
351
|
return offset;
|
data/ext/oci8/stmt.c
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
* stmt.c - part of ruby-oci8
|
4
4
|
* implement the methods of OCIStmt.
|
5
5
|
*
|
6
|
-
* Copyright (C) 2002-
|
6
|
+
* Copyright (C) 2002-2010 KUBO Takehiro <kubo@jiubao.org>
|
7
7
|
*
|
8
8
|
*/
|
9
9
|
#include "oci8.h"
|
@@ -28,6 +28,8 @@ static ID id_clear;
|
|
28
28
|
|
29
29
|
VALUE cOCIStmt;
|
30
30
|
|
31
|
+
#define TO_STMT(obj) ((oci8_stmt_t *)oci8_get_handle((obj), cOCIStmt))
|
32
|
+
|
31
33
|
typedef struct {
|
32
34
|
oci8_base_t base;
|
33
35
|
VALUE svc;
|
@@ -94,7 +96,7 @@ static VALUE oci8_stmt_initialize(int argc, VALUE *argv, VALUE self)
|
|
94
96
|
|
95
97
|
static VALUE oci8_define_by_pos(VALUE self, VALUE vposition, VALUE vbindobj)
|
96
98
|
{
|
97
|
-
oci8_stmt_t *stmt =
|
99
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
98
100
|
ub4 position;
|
99
101
|
oci8_bind_t *obind;
|
100
102
|
const oci8_bind_class_t *bind_class;
|
@@ -117,6 +119,10 @@ static VALUE oci8_define_by_pos(VALUE self, VALUE vposition, VALUE vbindobj)
|
|
117
119
|
oci8_raise(oci8_errhp, status, stmt->base.hp.ptr);
|
118
120
|
}
|
119
121
|
obind->base.type = OCI_HTYPE_DEFINE;
|
122
|
+
/* link to the parent as soon as possible to preserve deallocation order. */
|
123
|
+
oci8_unlink_from_parent((oci8_base_t*)obind);
|
124
|
+
oci8_link_to_parent((oci8_base_t*)obind, (oci8_base_t*)stmt);
|
125
|
+
|
120
126
|
if (NIL_P(obind->tdo) && obind->maxar_sz > 0) {
|
121
127
|
oci_lc(OCIDefineArrayOfStruct(obind->base.hp.dfn, oci8_errhp, obind->alloc_sz, sizeof(sb2), 0, 0));
|
122
128
|
}
|
@@ -135,14 +141,12 @@ static VALUE oci8_define_by_pos(VALUE self, VALUE vposition, VALUE vbindobj)
|
|
135
141
|
oci_lc(OCIAttrSet(obind->base.hp.ptr, OCI_HTYPE_DEFINE, (void*)&bind_class->csfrm, 0, OCI_ATTR_CHARSET_FORM, oci8_errhp));
|
136
142
|
}
|
137
143
|
rb_ary_store(stmt->defns, position - 1, obind->base.self);
|
138
|
-
oci8_unlink_from_parent((oci8_base_t*)obind);
|
139
|
-
oci8_link_to_parent((oci8_base_t*)obind, (oci8_base_t*)stmt);
|
140
144
|
return obind->base.self;
|
141
145
|
}
|
142
146
|
|
143
147
|
static VALUE oci8_bind(VALUE self, VALUE vplaceholder, VALUE vbindobj)
|
144
148
|
{
|
145
|
-
oci8_stmt_t *stmt =
|
149
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
146
150
|
char *placeholder_ptr = (char*)-1; /* initialize as an invalid value */
|
147
151
|
ub4 placeholder_len = 0;
|
148
152
|
ub4 position = 0;
|
@@ -197,6 +201,10 @@ static VALUE oci8_bind(VALUE self, VALUE vplaceholder, VALUE vbindobj)
|
|
197
201
|
oci8_raise(oci8_errhp, status, stmt->base.hp.stmt);
|
198
202
|
}
|
199
203
|
obind->base.type = OCI_HTYPE_BIND;
|
204
|
+
/* link to the parent as soon as possible to preserve deallocation order. */
|
205
|
+
oci8_unlink_from_parent((oci8_base_t*)obind);
|
206
|
+
oci8_link_to_parent((oci8_base_t*)obind, (oci8_base_t*)stmt);
|
207
|
+
|
200
208
|
if (NIL_P(obind->tdo) && obind->maxar_sz > 0) {
|
201
209
|
oci_lc(OCIBindArrayOfStruct(obind->base.hp.bnd, oci8_errhp, obind->alloc_sz, sizeof(sb2), 0, 0));
|
202
210
|
}
|
@@ -213,8 +221,6 @@ static VALUE oci8_bind(VALUE self, VALUE vplaceholder, VALUE vbindobj)
|
|
213
221
|
oci8_base_free((oci8_base_t*)oci8_get_bind(old_value));
|
214
222
|
}
|
215
223
|
rb_hash_aset(stmt->binds, vplaceholder, obind->base.self);
|
216
|
-
oci8_unlink_from_parent((oci8_base_t*)obind);
|
217
|
-
oci8_link_to_parent((oci8_base_t*)obind, (oci8_base_t*)stmt);
|
218
224
|
return obind->base.self;
|
219
225
|
}
|
220
226
|
|
@@ -237,7 +243,7 @@ static sword oci8_call_stmt_execute(oci8_svcctx_t *svcctx, oci8_stmt_t *stmt, ub
|
|
237
243
|
|
238
244
|
static VALUE oci8_stmt_execute(VALUE self, VALUE iteration_count)
|
239
245
|
{
|
240
|
-
oci8_stmt_t *stmt =
|
246
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
241
247
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(stmt->svc);
|
242
248
|
ub4 iters;
|
243
249
|
ub4 mode;
|
@@ -323,8 +329,8 @@ static VALUE clear_binds_iterator_proc(VALUE val, VALUE arg)
|
|
323
329
|
|
324
330
|
static VALUE oci8_stmt_clear_binds(VALUE self)
|
325
331
|
{
|
326
|
-
oci8_stmt_t *stmt =
|
327
|
-
|
332
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
333
|
+
|
328
334
|
if(!RTEST(rb_funcall(stmt->binds, id_empty_p, 0)))
|
329
335
|
{
|
330
336
|
rb_iterate(each_value, stmt->binds, clear_binds_iterator_proc, Qnil);
|
@@ -449,7 +455,7 @@ static VALUE oci8_stmt_do_fetch(oci8_stmt_t *stmt, oci8_svcctx_t *svcctx)
|
|
449
455
|
*/
|
450
456
|
static VALUE oci8_stmt_fetch(VALUE self)
|
451
457
|
{
|
452
|
-
oci8_stmt_t *stmt =
|
458
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
453
459
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(stmt->svc);
|
454
460
|
|
455
461
|
if (rb_block_given_p()) {
|
@@ -466,7 +472,7 @@ static VALUE oci8_stmt_fetch(VALUE self)
|
|
466
472
|
|
467
473
|
static VALUE oci8_stmt_get_param(VALUE self, VALUE pos)
|
468
474
|
{
|
469
|
-
oci8_stmt_t *stmt =
|
475
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
470
476
|
OCIParam *parmhp = NULL;
|
471
477
|
sword rv;
|
472
478
|
|
@@ -498,7 +504,7 @@ static VALUE oci8_stmt_get_param(VALUE self, VALUE pos)
|
|
498
504
|
*/
|
499
505
|
static VALUE oci8_stmt_get_stmt_type(VALUE self)
|
500
506
|
{
|
501
|
-
VALUE stmt_type = oci8_get_ub2_attr(
|
507
|
+
VALUE stmt_type = oci8_get_ub2_attr(oci8_get_handle(self, cOCIStmt), OCI_ATTR_STMT_TYPE);
|
502
508
|
switch (FIX2INT(stmt_type)) {
|
503
509
|
case OCI_STMT_SELECT:
|
504
510
|
return oci8_sym_select_stmt;
|
@@ -528,7 +534,7 @@ static VALUE oci8_stmt_get_stmt_type(VALUE self)
|
|
528
534
|
*/
|
529
535
|
static VALUE oci8_stmt_get_row_count(VALUE self)
|
530
536
|
{
|
531
|
-
return oci8_get_ub4_attr(
|
537
|
+
return oci8_get_ub4_attr(oci8_get_handle(self, cOCIStmt), OCI_ATTR_ROW_COUNT);
|
532
538
|
}
|
533
539
|
|
534
540
|
/*
|
@@ -547,12 +553,12 @@ static VALUE oci8_stmt_get_row_count(VALUE self)
|
|
547
553
|
*/
|
548
554
|
static VALUE oci8_stmt_get_rowid(VALUE self)
|
549
555
|
{
|
550
|
-
return oci8_get_rowid_attr(
|
556
|
+
return oci8_get_rowid_attr(oci8_get_handle(self, cOCIStmt), OCI_ATTR_ROWID);
|
551
557
|
}
|
552
558
|
|
553
559
|
static VALUE oci8_stmt_get_param_count(VALUE self)
|
554
560
|
{
|
555
|
-
return oci8_get_ub4_attr(
|
561
|
+
return oci8_get_ub4_attr(oci8_get_handle(self, cOCIStmt), OCI_ATTR_PARAM_COUNT);
|
556
562
|
}
|
557
563
|
|
558
564
|
/*
|
@@ -595,7 +601,7 @@ static VALUE oci8_stmt_get_param_count(VALUE self)
|
|
595
601
|
*/
|
596
602
|
static VALUE oci8_stmt_aref(VALUE self, VALUE key)
|
597
603
|
{
|
598
|
-
oci8_stmt_t *stmt =
|
604
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
599
605
|
VALUE obj = rb_hash_aref(stmt->binds, key);
|
600
606
|
if (NIL_P(obj)) {
|
601
607
|
return Qnil;
|
@@ -633,7 +639,7 @@ static VALUE oci8_stmt_aset(VALUE self, VALUE key, VALUE val)
|
|
633
639
|
long actual_array_size;
|
634
640
|
long bind_array_size;
|
635
641
|
|
636
|
-
oci8_stmt_t *stmt =
|
642
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
637
643
|
VALUE obj = rb_hash_aref(stmt->binds, key);
|
638
644
|
if (NIL_P(obj)) {
|
639
645
|
return Qnil; /* ?? MUST BE ERROR? */
|
@@ -650,7 +656,7 @@ static VALUE oci8_stmt_aset(VALUE self, VALUE key, VALUE val)
|
|
650
656
|
if(bind_array_size <= max_array_size && actual_array_size == 0) {
|
651
657
|
rb_ivar_set(self, id_at_actual_array_size, INT2NUM(bind_array_size));
|
652
658
|
}
|
653
|
-
}
|
659
|
+
}
|
654
660
|
oci8_bind_set_data(obj, val);
|
655
661
|
return val;
|
656
662
|
}
|
@@ -663,13 +669,13 @@ static VALUE oci8_stmt_aset(VALUE self, VALUE key, VALUE val)
|
|
663
669
|
*/
|
664
670
|
static VALUE oci8_stmt_keys(VALUE self)
|
665
671
|
{
|
666
|
-
oci8_stmt_t *stmt =
|
672
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
667
673
|
return rb_funcall(stmt->binds, oci8_id_keys, 0);
|
668
674
|
}
|
669
675
|
|
670
676
|
static VALUE oci8_stmt_defined_p(VALUE self, VALUE pos)
|
671
677
|
{
|
672
|
-
oci8_stmt_t *stmt =
|
678
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
673
679
|
long position = NUM2INT(pos);
|
674
680
|
|
675
681
|
if (position - 1 < RARRAY_LEN(stmt->defns)) {
|
@@ -693,7 +699,7 @@ static VALUE oci8_stmt_defined_p(VALUE self, VALUE pos)
|
|
693
699
|
*/
|
694
700
|
static VALUE oci8_stmt_set_prefetch_rows(VALUE self, VALUE rows)
|
695
701
|
{
|
696
|
-
oci8_stmt_t *stmt =
|
702
|
+
oci8_stmt_t *stmt = TO_STMT(self);
|
697
703
|
ub4 num = NUM2UINT(rows);
|
698
704
|
|
699
705
|
oci_lc(OCIAttrSet(stmt->base.hp.ptr, OCI_HTYPE_STMT, &num, 0, OCI_ATTR_PREFETCH_ROWS, oci8_errhp));
|
data/ext/oci8/win32.c
CHANGED
@@ -2,9 +2,15 @@
|
|
2
2
|
/*
|
3
3
|
win32.c - part of ruby-oci8
|
4
4
|
|
5
|
-
Copyright (C) 2009 KUBO Takehiro <kubo@jiubao.org>
|
5
|
+
Copyright (C) 2009-2010 KUBO Takehiro <kubo@jiubao.org>
|
6
6
|
*/
|
7
7
|
#include "oci8.h"
|
8
|
+
#ifdef __CYGWIN__
|
9
|
+
/* boolean is defined as a macro in oratypes.h.
|
10
|
+
* It conflicts with the definition in windows.h.
|
11
|
+
*/
|
12
|
+
#undef boolean
|
13
|
+
#endif
|
8
14
|
#include <windows.h>
|
9
15
|
|
10
16
|
NORETURN(static void raise_error(void));
|
@@ -84,14 +90,14 @@ static VALUE enum_homes_real(enum_homes_arg_t *arg)
|
|
84
90
|
}
|
85
91
|
/* Get ORACLE_HOME */
|
86
92
|
name_len = sizeof(name);
|
87
|
-
rv = RegQueryValueEx(arg->hSubKey, "ORACLE_HOME", NULL, &type, name, &name_len);
|
93
|
+
rv = RegQueryValueEx(arg->hSubKey, "ORACLE_HOME", NULL, &type, TO_ORATEXT(name), &name_len);
|
88
94
|
if (rv != ERROR_SUCCESS || type != REG_SZ) {
|
89
95
|
continue;
|
90
96
|
}
|
91
97
|
oracle_home = rb_locale_str_new_cstr(name);
|
92
98
|
/* Get NLS_LANG */
|
93
99
|
name_len = sizeof(name);
|
94
|
-
rv = RegQueryValueEx(arg->hSubKey, "NLS_LANG", NULL, &type, name, &name_len);
|
100
|
+
rv = RegQueryValueEx(arg->hSubKey, "NLS_LANG", NULL, &type, TO_ORATEXT(name), &name_len);
|
95
101
|
if (rv != ERROR_SUCCESS || type != REG_SZ) {
|
96
102
|
continue;
|
97
103
|
}
|
data/lib/oci8.rb.in
CHANGED
@@ -18,14 +18,24 @@ if RUBY_PLATFORM =~ /cygwin/
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
+
so_basename = 'oci8lib_'
|
22
|
+
if defined? RUBY_ENGINE and RUBY_ENGINE != 'ruby'
|
23
|
+
so_basename += RUBY_ENGINE
|
24
|
+
end
|
25
|
+
|
26
|
+
# The suffix number indicates the ruby API version.
|
27
|
+
# 18 - ruby 1.8.x
|
28
|
+
# 191 - ruby 1.9.1 and 1.9.2
|
29
|
+
# 19x - ruby 1.9.x future version which will break the API compatibility
|
21
30
|
case RUBY_VERSION
|
22
31
|
when /^1\.9/
|
23
|
-
|
32
|
+
so_basename += '191'
|
24
33
|
when /^1\.8/
|
25
|
-
|
34
|
+
so_basename += '18'
|
26
35
|
else
|
27
36
|
raise 'unsupported ruby version: ' + RUBY_VERSION
|
28
37
|
end
|
38
|
+
require so_basename
|
29
39
|
|
30
40
|
if OCI8.respond_to? :encoding
|
31
41
|
if defined? DEFAULT_OCI8_ENCODING
|
@@ -75,6 +85,7 @@ require 'oci8/bindtype.rb'
|
|
75
85
|
require 'oci8/metadata.rb'
|
76
86
|
require 'oci8/compat.rb'
|
77
87
|
require 'oci8/object.rb'
|
88
|
+
require 'oci8/properties.rb'
|
78
89
|
|
79
90
|
class OCI8
|
80
91
|
VERSION = '@@OCI8_MODULE_VERSION@@'
|
data/lib/oci8/.document
CHANGED
data/lib/oci8/bindtype.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#--
|
2
2
|
# bindtype.rb -- OCI8::BindType
|
3
3
|
#
|
4
|
-
# Copyright (C) 2009 KUBO Takehiro <kubo@jiubao.org>
|
4
|
+
# Copyright (C) 2009-2010 KUBO Takehiro <kubo@jiubao.org>
|
5
5
|
#++
|
6
6
|
|
7
7
|
class OCI8
|
@@ -46,6 +46,12 @@ class OCI8
|
|
46
46
|
end
|
47
47
|
end
|
48
48
|
|
49
|
+
class BasicNumberType < OCI8::BindType::OraNumber
|
50
|
+
def get()
|
51
|
+
(val = super()) && (val.has_decimal_part? ? val.to_f : val.to_i)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
49
55
|
# get/set Number (for OCI8::SQLT_NUM)
|
50
56
|
class Number
|
51
57
|
def self.create(con, val, param, max_array_size)
|
@@ -116,6 +122,8 @@ class OCI8
|
|
116
122
|
length = val.size
|
117
123
|
end
|
118
124
|
end
|
125
|
+
# use the default value when :nchar is not set explicitly.
|
126
|
+
nchar = OCI8.properties[:bind_string_as_nchar] unless param.has_key?(:nchar)
|
119
127
|
when OCI8::Metadata::Base
|
120
128
|
case param.data_type
|
121
129
|
when :char, :varchar2
|
@@ -124,13 +132,18 @@ class OCI8
|
|
124
132
|
# The length of a Japanese half-width kana is one in Shift_JIS,
|
125
133
|
# two in EUC-JP, three in UTF-8.
|
126
134
|
length *= 3 unless param.char_used?
|
135
|
+
nchar = (param.charset_form == :nchar)
|
127
136
|
when :raw
|
128
137
|
# HEX needs twice space.
|
129
138
|
length = param.data_size * 2
|
130
139
|
end
|
131
140
|
end
|
132
141
|
length = @@minimum_bind_length if length.nil? or length < @@minimum_bind_length
|
133
|
-
|
142
|
+
if nchar
|
143
|
+
OCI8::BindType::NCHAR.new(con, val, length, max_array_size)
|
144
|
+
else
|
145
|
+
OCI8::BindType::CHAR.new(con, val, length, max_array_size)
|
146
|
+
end
|
134
147
|
end
|
135
148
|
end
|
136
149
|
|
@@ -153,7 +166,7 @@ class OCI8
|
|
153
166
|
|
154
167
|
class Long < OCI8::BindType::String
|
155
168
|
def self.create(con, val, param, max_array_size)
|
156
|
-
|
169
|
+
super(con, val, {:length => con.long_read_len}, max_array_size)
|
157
170
|
end
|
158
171
|
end
|
159
172
|
|
data/lib/oci8/datetime.rb
CHANGED
@@ -38,6 +38,14 @@ class OCI8
|
|
38
38
|
@@time_new_accepts_timezone = false # prior to ruby 1.9.2
|
39
39
|
end
|
40
40
|
|
41
|
+
begin
|
42
|
+
# 2001-01-01 00:00:59.999
|
43
|
+
::DateTime.civil(2001, 1, 1, 0, 0, Rational(59_999, 1000), 0)
|
44
|
+
@@datetime_has_fractional_second_bug = false
|
45
|
+
rescue ArgumentError
|
46
|
+
@@datetime_has_fractional_second_bug = true
|
47
|
+
end
|
48
|
+
|
41
49
|
def self.default_timezone
|
42
50
|
@@default_timezone
|
43
51
|
end
|
@@ -162,8 +170,8 @@ class OCI8
|
|
162
170
|
return nil if ary.nil?
|
163
171
|
|
164
172
|
year, month, day, hour, minute, sec, fsec, tz_hour, tz_min = ary
|
165
|
-
if sec >= 59 and fsec != 0
|
166
|
-
# convert to a DateTime via a String as a
|
173
|
+
if @@datetime_has_fractional_second_bug and sec >= 59 and fsec != 0
|
174
|
+
# convert to a DateTime via a String as a workaround
|
167
175
|
if tz_hour >= 0 && tz_min >= 0
|
168
176
|
sign = ?+
|
169
177
|
else
|
@@ -245,7 +253,7 @@ class OCI8
|
|
245
253
|
end
|
246
254
|
|
247
255
|
if OCI8.oracle_client_version >= ORAVER_9_0
|
248
|
-
class
|
256
|
+
class DateTimeViaOCITimestampTZ < OCI8::BindType::OCITimestampTZ # :nodoc:
|
249
257
|
include OCI8::BindType::Util
|
250
258
|
|
251
259
|
def set(val) # :nodoc:
|
@@ -257,7 +265,7 @@ class OCI8
|
|
257
265
|
end
|
258
266
|
end
|
259
267
|
|
260
|
-
class
|
268
|
+
class TimeViaOCITimestampTZ < OCI8::BindType::OCITimestampTZ # :nodoc:
|
261
269
|
include OCI8::BindType::Util
|
262
270
|
|
263
271
|
def set(val) # :nodoc:
|
@@ -335,7 +343,7 @@ class OCI8
|
|
335
343
|
if OCI8.oracle_client_version >= ORAVER_9_0
|
336
344
|
def self.create(con, val, param, max_array_size) # :nodoc:
|
337
345
|
if true # TODO: check Oracle server version
|
338
|
-
|
346
|
+
DateTimeViaOCITimestampTZ.new(con, val, param, max_array_size)
|
339
347
|
else
|
340
348
|
DateTimeViaOCIDate.new(con, val, param, max_array_size)
|
341
349
|
end
|
@@ -414,7 +422,7 @@ class OCI8
|
|
414
422
|
if OCI8.oracle_client_version >= ORAVER_9_0
|
415
423
|
def self.create(con, val, param, max_array_size) # :nodoc:
|
416
424
|
if true # TODO: check Oracle server version
|
417
|
-
|
425
|
+
TimeViaOCITimestampTZ.new(con, val, param, max_array_size)
|
418
426
|
else
|
419
427
|
TimeViaOCIDate.new(con, val, param, max_array_size)
|
420
428
|
end
|