ruby-oci8 2.0.0 → 2.0.1
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 +42 -0
- data/Makefile +39 -0
- data/NEWS +6 -0
- data/VERSION +1 -1
- data/dist-files +1 -0
- data/ext/oci8/apiwrap.yml +20 -0
- data/ext/oci8/bind.c +23 -17
- data/ext/oci8/extconf.rb +11 -1
- data/ext/oci8/oci8.c +34 -1
- data/ext/oci8/oci8.h +3 -0
- data/ext/oci8/ocidatetime.c +10 -9
- data/ext/oci8/oraconf.rb +7 -2
- data/ext/oci8/stmt.c +4 -6
- data/lib/oci8.rb.in +8 -1
- data/lib/oci8/datetime.rb +8 -6
- data/lib/oci8/oci8.rb +26 -1
- data/ruby-oci8.gemspec +21 -12
- data/test/test_array_dml.rb +23 -7
- metadata +4 -5
data/ChangeLog
CHANGED
@@ -1,3 +1,45 @@
|
|
1
|
+
2009-03-17 KUBO Takehiro <kubo@jiubao.org>
|
2
|
+
* NEWS: add a new file.
|
3
|
+
* VERSION: change version to 2.0.1.
|
4
|
+
* Makefile: add targets to make a binary gem for Windows.
|
5
|
+
* dist-files: add NEWS
|
6
|
+
* ext/oci8/extconf.rb, lib/oci8.rb.in: rename oci8lib.so
|
7
|
+
to oci8lib_18.so and oci8lib_191.so. The renamed name
|
8
|
+
depends on the ruby version.
|
9
|
+
* lib/oci8/datetime.rb: fix the fetched type for date column
|
10
|
+
when using Oracle 8.x.
|
11
|
+
* ruby-oci8.gemspec: fix to make a binary gem which contains
|
12
|
+
both oci8lib_18.so and oci8lib_191.so.
|
13
|
+
|
14
|
+
2009-03-17 KUBO Takehiro <kubo@jiubao.org>
|
15
|
+
* ext/oci8/apiwrap.yml: add prototypes for OCIServerVersion() and
|
16
|
+
OCIServerRelease().
|
17
|
+
* ext/oci8/oci8.c: (1) add a private method OCI8#oracle_server_vernum,
|
18
|
+
which returns Oracle server version number.
|
19
|
+
(2) fix a class method OCI8.oracle_client_vernum when using Oracle
|
20
|
+
client 10.1 or lower.
|
21
|
+
* lib/oci8/datetime.rb: fix year information when fetching a date
|
22
|
+
whose year is between A.D. 1 and A.D. 139.
|
23
|
+
* lib/oci8/oci8.rb: (1) add OCI8#oracle_server_version.
|
24
|
+
* (2) change the default data type for timestamp with time zone
|
25
|
+
from DateTime to Time.
|
26
|
+
|
27
|
+
2009-03-11 KUBO Takehiro <kubo@jiubao.org>
|
28
|
+
* oraconf.rb: fix big/little endian checking problem on Mac OS X ppc.
|
29
|
+
(contributed by unknown. See: Bug ID 24284 on rubyforge.)
|
30
|
+
|
31
|
+
2009-02-15 KUBO Takehiro <kubo@jiubao.org>
|
32
|
+
* ext/oci8/ocidatetime.c: fix array DML and DateTime object problem.
|
33
|
+
OCI8::Cursor#bind_param_array(key, array_of_datetime) didn't
|
34
|
+
work. (Reported by Leoš Bitto)
|
35
|
+
* test/test_array_dml.rb: fix to test array DML and DateTime object.
|
36
|
+
|
37
|
+
2009-02-10 KUBO Takehiro <kubo@jiubao.org>
|
38
|
+
* ext/oci8/bind.c, ext/oci8/oci8.h, ext/oci8/stmt.c: fix array DML
|
39
|
+
and DateTime object problem. It didn't work with bind classes
|
40
|
+
which overwrite 'set' and 'get'. (Reported by Leoš Bitto)
|
41
|
+
* test/test_array_dml.rb: fix to test array DML and DateTime object.
|
42
|
+
|
1
43
|
2009-02-08 KUBO Takehiro <kubo@jiubao.org>
|
2
44
|
* VERSION: change version from 2.0-svn to 2.0.0 to pass ruby
|
3
45
|
gem's version string validator.
|
data/Makefile
CHANGED
@@ -46,3 +46,42 @@ dist-check: dist
|
|
46
46
|
cd ruby-oci8-$(VERSION) && $(MAKE) RUBY="$(RUBY)" check
|
47
47
|
cd ruby-oci8-$(VERSION)/src && $(MAKE) RUBY="$(RUBY)" sitearchdir=../work sitelibdir=../work site-install
|
48
48
|
cd ruby-oci8-$(VERSION)/test && $(RUBY) -I../work -I../support test_all.rb
|
49
|
+
|
50
|
+
#
|
51
|
+
# for Windows
|
52
|
+
#
|
53
|
+
GEMPKG = ruby-oci8-unstable-2.0.1-x86-mswin32-60.gem
|
54
|
+
|
55
|
+
ext\oci8\oci8lib_18.so:
|
56
|
+
c:\ruby\bin\ruby -r fileutils -e "FileUtils.rm_rf('ruby18')"
|
57
|
+
md ruby18
|
58
|
+
cd ruby18
|
59
|
+
c:\ruby\bin\ruby ..\setup.rb config -- --with-runtime-check
|
60
|
+
c:\ruby\bin\ruby ..\setup.rb setup
|
61
|
+
rem c:\ruby\bin\ruby ..\setup.rb test
|
62
|
+
cd ..
|
63
|
+
copy ruby18\ext\oci8\oci8lib_18.so ext\oci8\oci8lib_18.so
|
64
|
+
|
65
|
+
ext\oci8\oci8lib_191.so:
|
66
|
+
c:\ruby\bin\ruby -r fileutils -e "FileUtils.rm_rf('ruby191')"
|
67
|
+
md ruby191
|
68
|
+
cd ruby191
|
69
|
+
c:\ruby-1.9.1\bin\ruby ..\setup.rb config -- --with-runtime-check
|
70
|
+
c:\ruby-1.9.1\bin\ruby ..\setup.rb setup
|
71
|
+
rem c:\ruby-1.9.1\bin\ruby ..\setup.rb test
|
72
|
+
cd ..
|
73
|
+
copy ruby191\ext\oci8\oci8lib_191.so ext\oci8\oci8lib_191.so
|
74
|
+
copy ruby191\lib\oci8.rb lib\oci8.rb
|
75
|
+
|
76
|
+
$(GEMPKG): ext\oci8\oci8lib_18.so ext\oci8\oci8lib_191.so ruby-oci8.gemspec
|
77
|
+
c:\ruby-1.9.1\bin\gem build ruby-oci8.gemspec -- current
|
78
|
+
|
79
|
+
test-win32-ruby18: $(GEMPKG)
|
80
|
+
c:\ruby\bin\gem install $(GEMPKG) --no-rdoc --no-ri
|
81
|
+
c:\ruby\bin\ruby -rubygems test\test_all.rb
|
82
|
+
|
83
|
+
test-win32-ruby191: $(GEMPKG)
|
84
|
+
c:\ruby-1.9.1\bin\gem install $(GEMPKG) --no-rdoc --no-ri
|
85
|
+
c:\ruby-1.9.1\bin\ruby test\test_all.rb
|
86
|
+
|
87
|
+
test-win32: test-win32-ruby18 test-win32-ruby191
|
data/NEWS
ADDED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.0.
|
1
|
+
2.0.1
|
data/dist-files
CHANGED
data/ext/oci8/apiwrap.yml
CHANGED
@@ -773,6 +773,15 @@ OCIServerDetach_nb:
|
|
773
773
|
- OCIError *errhp
|
774
774
|
- ub4 mode
|
775
775
|
|
776
|
+
# round trip: ?
|
777
|
+
OCIServerVersion:
|
778
|
+
:version: 800
|
779
|
+
:args: - dvoid *hndlp
|
780
|
+
- OCIError *errhp
|
781
|
+
- OraText *bufp
|
782
|
+
- ub4 bufsz
|
783
|
+
- ub1 hndltype
|
784
|
+
|
776
785
|
# round trip: 1
|
777
786
|
OCIStmtExecute_nb:
|
778
787
|
:version: 800
|
@@ -1114,6 +1123,17 @@ OCIRowidToChar:
|
|
1114
1123
|
- ub2 *outbflp
|
1115
1124
|
- OCIError *errhp
|
1116
1125
|
|
1126
|
+
# An undocumented function from Oracle 9i to Oracle 10g.
|
1127
|
+
# This is documented in Oracle 11g.
|
1128
|
+
OCIServerRelease:
|
1129
|
+
:version: 900
|
1130
|
+
:args: - dvoid *hndlp
|
1131
|
+
- OCIError *errhp
|
1132
|
+
- OraText *bufp
|
1133
|
+
- ub4 bufsz
|
1134
|
+
- ub1 hndltype
|
1135
|
+
- ub4 *version
|
1136
|
+
|
1117
1137
|
#
|
1118
1138
|
# Oracle 9.2
|
1119
1139
|
#
|
data/ext/oci8/bind.c
CHANGED
@@ -3,14 +3,13 @@
|
|
3
3
|
* bind.c
|
4
4
|
*
|
5
5
|
* $Author: kubo $
|
6
|
-
* $Date: 2009-
|
6
|
+
* $Date: 2009-02-10 22:50:40 +0900 (Tue, 10 Feb 2009) $
|
7
7
|
*
|
8
8
|
* Copyright (C) 2002-2008 KUBO Takehiro <kubo@jiubao.org>
|
9
9
|
*/
|
10
10
|
#include "oci8.h"
|
11
11
|
|
12
12
|
static ID id_bind_type;
|
13
|
-
static ID id_set;
|
14
13
|
|
15
14
|
static VALUE cOCI8BindTypeBase;
|
16
15
|
|
@@ -330,8 +329,11 @@ static const oci8_bind_class_t bind_binary_double_class = {
|
|
330
329
|
SQLT_BDOUBLE
|
331
330
|
};
|
332
331
|
|
333
|
-
static
|
332
|
+
static VALUE oci8_bind_get(VALUE self)
|
334
333
|
{
|
334
|
+
oci8_bind_t *obind = DATA_PTR(self);
|
335
|
+
const oci8_bind_class_t *obc = (const oci8_bind_class_t *)obind->base.klass;
|
336
|
+
ub4 idx = obind->curar_idx;
|
335
337
|
void **null_structp = NULL;
|
336
338
|
|
337
339
|
if (NIL_P(obind->tdo)) {
|
@@ -345,26 +347,30 @@ static inline VALUE oci8_get_data_at(const oci8_bind_class_t *obc, oci8_bind_t *
|
|
345
347
|
return obc->get(obind, (void*)((size_t)obind->valuep + obind->alloc_sz * idx), null_structp);
|
346
348
|
}
|
347
349
|
|
348
|
-
|
350
|
+
VALUE oci8_bind_get_data(VALUE self)
|
349
351
|
{
|
350
352
|
oci8_bind_t *obind = DATA_PTR(self);
|
351
|
-
const oci8_bind_class_t *obc = (const oci8_bind_class_t *)obind->base.klass;
|
352
353
|
|
353
354
|
if (obind->maxar_sz == 0) {
|
354
|
-
|
355
|
+
obind->curar_idx = 0;
|
356
|
+
return rb_funcall(self, oci8_id_get, 0);
|
355
357
|
} else {
|
356
358
|
volatile VALUE ary = rb_ary_new2(obind->curar_sz);
|
357
359
|
ub4 idx;
|
358
360
|
|
359
361
|
for (idx = 0; idx < obind->curar_sz; idx++) {
|
360
|
-
|
362
|
+
obind->curar_idx = idx;
|
363
|
+
rb_ary_store(ary, idx, rb_funcall(self, oci8_id_get, 0));
|
361
364
|
}
|
362
365
|
return ary;
|
363
366
|
}
|
364
367
|
}
|
365
368
|
|
366
|
-
static
|
369
|
+
static VALUE oci8_bind_set(VALUE self, VALUE val)
|
367
370
|
{
|
371
|
+
oci8_bind_t *obind = DATA_PTR(self);
|
372
|
+
const oci8_bind_class_t *obc = (const oci8_bind_class_t *)obind->base.klass;
|
373
|
+
ub4 idx = obind->curar_idx;
|
368
374
|
|
369
375
|
if (NIL_P(val)) {
|
370
376
|
if (NIL_P(obind->tdo)) {
|
@@ -383,15 +389,16 @@ static inline void oci8_set_data_at(const oci8_bind_class_t *obc, oci8_bind_t *o
|
|
383
389
|
}
|
384
390
|
obc->set(obind, (void*)((size_t)obind->valuep + obind->alloc_sz * idx), null_structp, val);
|
385
391
|
}
|
392
|
+
return self;
|
386
393
|
}
|
387
394
|
|
388
|
-
|
395
|
+
void oci8_bind_set_data(VALUE self, VALUE val)
|
389
396
|
{
|
390
397
|
oci8_bind_t *obind = DATA_PTR(self);
|
391
|
-
const oci8_bind_class_t *obc = (const oci8_bind_class_t *)obind->base.klass;
|
392
398
|
|
393
399
|
if (obind->maxar_sz == 0) {
|
394
|
-
|
400
|
+
obind->curar_idx = 0;
|
401
|
+
rb_funcall(self, oci8_id_set, 1, val);
|
395
402
|
} else {
|
396
403
|
ub4 size;
|
397
404
|
ub4 idx;
|
@@ -402,11 +409,11 @@ static VALUE oci8_set_data(VALUE self, VALUE val)
|
|
402
409
|
rb_raise(rb_eRuntimeError, "over the max array size");
|
403
410
|
}
|
404
411
|
for (idx = 0; idx < size; idx++) {
|
405
|
-
|
412
|
+
obind->curar_idx = idx;
|
413
|
+
rb_funcall(self, oci8_id_set, 1, RARRAY_PTR(val)[idx]);
|
406
414
|
}
|
407
415
|
obind->curar_sz = size;
|
408
416
|
}
|
409
|
-
return self;
|
410
417
|
}
|
411
418
|
|
412
419
|
static VALUE oci8_bind_initialize(VALUE self, VALUE svc, VALUE val, VALUE length, VALUE max_array_size)
|
@@ -438,7 +445,7 @@ static VALUE oci8_bind_initialize(VALUE self, VALUE svc, VALUE val, VALUE length
|
|
438
445
|
bind_class->init_elem(obind, svc);
|
439
446
|
}
|
440
447
|
if (!NIL_P(val)) {
|
441
|
-
|
448
|
+
oci8_bind_set_data(self, val);
|
442
449
|
}
|
443
450
|
return Qnil;
|
444
451
|
}
|
@@ -474,11 +481,10 @@ void Init_oci8_bind(VALUE klass)
|
|
474
481
|
{
|
475
482
|
cOCI8BindTypeBase = klass;
|
476
483
|
id_bind_type = rb_intern("bind_type");
|
477
|
-
id_set = rb_intern("set");
|
478
484
|
|
479
485
|
rb_define_method(cOCI8BindTypeBase, "initialize", oci8_bind_initialize, 4);
|
480
|
-
rb_define_method(cOCI8BindTypeBase, "get",
|
481
|
-
rb_define_method(cOCI8BindTypeBase, "set",
|
486
|
+
rb_define_method(cOCI8BindTypeBase, "get", oci8_bind_get, 0);
|
487
|
+
rb_define_method(cOCI8BindTypeBase, "set", oci8_bind_set, 1);
|
482
488
|
|
483
489
|
/* register primitive data types. */
|
484
490
|
oci8_define_bind_class("String", &bind_string_class);
|
data/ext/oci8/extconf.rb
CHANGED
@@ -113,6 +113,16 @@ replace = {
|
|
113
113
|
# make ruby script before running create_makefile.
|
114
114
|
replace_keyword(File.dirname(__FILE__) + '/../../lib/oci8.rb.in', '../../lib/oci8.rb', replace)
|
115
115
|
|
116
|
+
case RUBY_VERSION
|
117
|
+
when /^1\.9\.1/
|
118
|
+
so_basename = "oci8lib_191"
|
119
|
+
when /^1\.8/
|
120
|
+
so_basename = "oci8lib_18"
|
121
|
+
else
|
122
|
+
raise 'unsupported ruby version: ' + RUBY_VERSION
|
123
|
+
end
|
124
|
+
$defs << "-DInit_oci8lib=Init_#{so_basename}"
|
125
|
+
|
116
126
|
create_header()
|
117
127
|
|
118
128
|
# make dependency file
|
@@ -140,6 +150,6 @@ end
|
|
140
150
|
|
141
151
|
create_apiwrap()
|
142
152
|
|
143
|
-
create_makefile(
|
153
|
+
create_makefile(so_basename)
|
144
154
|
|
145
155
|
exit 0
|
data/ext/oci8/oci8.c
CHANGED
@@ -524,11 +524,43 @@ static VALUE oci8_set_prefetch_rows(VALUE self, VALUE val)
|
|
524
524
|
return val;
|
525
525
|
}
|
526
526
|
|
527
|
+
/*
|
528
|
+
* call-seq:
|
529
|
+
* oracle_server_vernum -> Oracle server version number
|
530
|
+
*
|
531
|
+
*/
|
532
|
+
static VALUE oci8_oracle_server_vernum(VALUE self)
|
533
|
+
{
|
534
|
+
oci8_svcctx_t *svcctx = DATA_PTR(self);
|
535
|
+
char buf[100];
|
536
|
+
ub4 version;
|
537
|
+
char *p;
|
538
|
+
|
539
|
+
if (have_OCIServerRelease) {
|
540
|
+
/* Oracle 9i or later */
|
541
|
+
oci_lc(OCIServerRelease(svcctx->base.hp.ptr, oci8_errhp, (text*)buf, sizeof(buf), svcctx->base.type, &version));
|
542
|
+
return UINT2NUM(version);
|
543
|
+
} else {
|
544
|
+
/* Oracle 8.x */
|
545
|
+
oci_lc(OCIServerVersion(svcctx->base.hp.ptr, oci8_errhp, (text*)buf, sizeof(buf), svcctx->base.type));
|
546
|
+
if ((p = strchr(buf, '.')) != NULL) {
|
547
|
+
unsigned int major, minor, update, patch, port_update;
|
548
|
+
while (p >= buf && *p != ' ') {
|
549
|
+
p--;
|
550
|
+
}
|
551
|
+
if (sscanf(p + 1, "%u.%u.%u.%u.%u", &major, &minor, &update, &patch, &port_update) == 5) {
|
552
|
+
return INT2FIX(ORAVERNUM(major, minor, update, patch, port_update));
|
553
|
+
}
|
554
|
+
}
|
555
|
+
return Qnil;
|
556
|
+
}
|
557
|
+
}
|
558
|
+
|
527
559
|
VALUE Init_oci8(void)
|
528
560
|
{
|
529
561
|
cOCI8 = oci8_define_class("OCI8", &oci8_svcctx_class);
|
530
562
|
|
531
|
-
oracle_client_vernum = oracle_client_version;
|
563
|
+
oracle_client_vernum = INT2FIX(oracle_client_version);
|
532
564
|
if (have_OCIClientVersion) {
|
533
565
|
sword major, minor, update, patch, port_update;
|
534
566
|
OCIClientVersion(&major, &minor, &update, &patch, &port_update);
|
@@ -556,6 +588,7 @@ VALUE Init_oci8(void)
|
|
556
588
|
rb_define_method(cOCI8, "long_read_len=", oci8_set_long_read_len, 1);
|
557
589
|
rb_define_method(cOCI8, "break", oci8_break, 0);
|
558
590
|
rb_define_method(cOCI8, "prefetch_rows=", oci8_set_prefetch_rows, 1);
|
591
|
+
rb_define_private_method(cOCI8, "oracle_server_vernum", oci8_oracle_server_vernum, 0);
|
559
592
|
return cOCI8;
|
560
593
|
}
|
561
594
|
|
data/ext/oci8/oci8.h
CHANGED
@@ -241,6 +241,7 @@ struct oci8_bind {
|
|
241
241
|
sb4 alloc_sz; /* size of a element. */
|
242
242
|
ub4 maxar_sz; /* maximum array size. */
|
243
243
|
ub4 curar_sz; /* current array size. */
|
244
|
+
ub4 curar_idx;/* current array index. */
|
244
245
|
VALUE tdo;
|
245
246
|
union {
|
246
247
|
void **null_structs;
|
@@ -375,6 +376,8 @@ void oci8_bind_free(oci8_base_t *base);
|
|
375
376
|
void oci8_bind_hp_obj_mark(oci8_base_t *base);
|
376
377
|
void Init_oci8_bind(VALUE cOCI8BindTypeBase);
|
377
378
|
oci8_bind_t *oci8_get_bind(VALUE obj);
|
379
|
+
void oci8_bind_set_data(VALUE self, VALUE val);
|
380
|
+
VALUE oci8_bind_get_data(VALUE self);
|
378
381
|
|
379
382
|
/* metadata.c */
|
380
383
|
extern VALUE cOCI8MetadataBase;
|
data/ext/oci8/ocidatetime.c
CHANGED
@@ -3,7 +3,7 @@
|
|
3
3
|
* ocidatetime.c
|
4
4
|
*
|
5
5
|
* $Author: kubo $
|
6
|
-
* $Date:
|
6
|
+
* $Date: 2009-02-15 23:58:37 +0900 (Sun, 15 Feb 2009) $
|
7
7
|
*
|
8
8
|
* Copyright (C) 2005-2008 KUBO Takehiro <kubo@jiubao.org>
|
9
9
|
*
|
@@ -244,19 +244,19 @@ static VALUE bind_ocitimestamp_get(oci8_bind_t *obind, void *data, void *null_st
|
|
244
244
|
|
245
245
|
static void bind_ocitimestamp_set(oci8_bind_t *obind, void *data, void **null_structp, VALUE val)
|
246
246
|
{
|
247
|
-
oci8_base_t *
|
247
|
+
oci8_base_t *parent;
|
248
248
|
oci8_base_t *svcctx;
|
249
249
|
|
250
|
-
|
251
|
-
if (
|
252
|
-
|
253
|
-
|
254
|
-
|
250
|
+
parent = obind->base.parent;
|
251
|
+
if (parent != NULL && parent->type == OCI_HTYPE_STMT) {
|
252
|
+
svcctx = parent->parent;
|
253
|
+
} else {
|
254
|
+
svcctx = parent;
|
255
255
|
}
|
256
|
-
svcctx = stmt->parent;
|
257
256
|
if (svcctx == NULL || svcctx->type != OCI_HTYPE_SVCCTX) {
|
258
|
-
rb_raise(rb_eRuntimeError, "oci8lib.so internal error [%s:%d, %p, %d]",
|
257
|
+
rb_raise(rb_eRuntimeError, "oci8lib.so internal error [%s:%d, %p, %d, %p, %d]",
|
259
258
|
__FILE__, __LINE__,
|
259
|
+
parent, parent ? parent->type : -1,
|
260
260
|
svcctx, svcctx ? svcctx->type : -1);
|
261
261
|
}
|
262
262
|
oci8_set_ocitimestamp(*(OCIDateTime **)data, val, svcctx->self);
|
@@ -266,6 +266,7 @@ static void bind_ocitimestamp_init(oci8_bind_t *obind, VALUE svc, VALUE val, VAL
|
|
266
266
|
{
|
267
267
|
oci8_bind_dsc_t *obind_dsc = (oci8_bind_dsc_t *)obind;
|
268
268
|
|
269
|
+
oci8_link_to_parent((oci8_base_t*)obind, (oci8_base_t*)oci8_get_svcctx(svc));
|
269
270
|
obind->value_sz = sizeof(OCIDateTime *);
|
270
271
|
obind->alloc_sz = sizeof(OCIDateTime *);
|
271
272
|
obind_dsc->type = OCI_DTYPE_TIMESTAMP_TZ;
|
data/ext/oci8/oraconf.rb
CHANGED
@@ -425,7 +425,7 @@ EOS
|
|
425
425
|
so_ext = 'dylib'
|
426
426
|
check_proc = Proc.new do |file|
|
427
427
|
is_32bit = [0].pack('l!').size == 4
|
428
|
-
is_big_endian = "\x01\x02".unpack('s') == 0x0102
|
428
|
+
is_big_endian = "\x01\x02".unpack('s')[0] == 0x0102
|
429
429
|
if is_32bit
|
430
430
|
if is_big_endian
|
431
431
|
this_cpu = :ppc # 32-bit big-endian
|
@@ -444,7 +444,12 @@ EOS
|
|
444
444
|
if so.cpu.include? this_cpu
|
445
445
|
true
|
446
446
|
else
|
447
|
-
|
447
|
+
if so.cpu.size > 1
|
448
|
+
arch_types = so.cpu[0..-2].join(', ') + ' and ' + so.cpu[-1].to_s
|
449
|
+
else
|
450
|
+
arch_types = so.cpu[0]
|
451
|
+
end
|
452
|
+
puts " skip: #{file} is for #{arch_types} cpu."
|
448
453
|
false
|
449
454
|
end
|
450
455
|
else
|
data/ext/oci8/stmt.c
CHANGED
@@ -25,7 +25,6 @@ static ID id_at_names;
|
|
25
25
|
static ID id_empty_p;
|
26
26
|
static ID id_at_con;
|
27
27
|
static ID id_clear;
|
28
|
-
static ID id_set;
|
29
28
|
|
30
29
|
VALUE cOCIStmt;
|
31
30
|
|
@@ -428,7 +427,7 @@ static VALUE oci8_stmt_do_fetch(oci8_stmt_t *stmt, oci8_svcctx_t *svcctx)
|
|
428
427
|
#endif /* USE_DYNAMIC_FETCH */
|
429
428
|
ary = rb_ary_new2(RARRAY_LEN(stmt->defns));
|
430
429
|
for (idx = 0; idx < RARRAY_LEN(stmt->defns); idx++) {
|
431
|
-
rb_ary_store(ary, idx,
|
430
|
+
rb_ary_store(ary, idx, oci8_bind_get_data(RARRAY_PTR(stmt->defns)[idx]));
|
432
431
|
}
|
433
432
|
return ary;
|
434
433
|
}
|
@@ -599,7 +598,7 @@ static VALUE oci8_stmt_aref(VALUE self, VALUE key)
|
|
599
598
|
if (NIL_P(obj)) {
|
600
599
|
return Qnil;
|
601
600
|
}
|
602
|
-
return
|
601
|
+
return oci8_bind_get_data(obj);
|
603
602
|
}
|
604
603
|
|
605
604
|
/*
|
@@ -650,8 +649,8 @@ static VALUE oci8_stmt_aset(VALUE self, VALUE key, VALUE val)
|
|
650
649
|
rb_ivar_set(self, id_at_actual_array_size, INT2NUM(bind_array_size));
|
651
650
|
}
|
652
651
|
}
|
653
|
-
|
654
|
-
return
|
652
|
+
oci8_bind_set_data(obj, val);
|
653
|
+
return val;
|
655
654
|
}
|
656
655
|
|
657
656
|
/*
|
@@ -781,7 +780,6 @@ void Init_oci8_stmt(VALUE cOCI8)
|
|
781
780
|
id_at_con = rb_intern("@con");
|
782
781
|
id_empty_p = rb_intern("empty?");
|
783
782
|
id_clear = rb_intern("clear");
|
784
|
-
id_set = rb_intern("set");
|
785
783
|
|
786
784
|
rb_define_private_method(cOCIStmt, "initialize", oci8_stmt_initialize, -1);
|
787
785
|
rb_define_private_method(cOCIStmt, "__define", oci8_define_by_pos, 2);
|
data/lib/oci8.rb.in
CHANGED
@@ -18,7 +18,14 @@ if RUBY_PLATFORM =~ /cygwin/
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
|
21
|
-
|
21
|
+
case RUBY_VERSION
|
22
|
+
when /^1\.9\.1/
|
23
|
+
require 'oci8lib_191'
|
24
|
+
when /^1\.8/
|
25
|
+
require 'oci8lib_18'
|
26
|
+
else
|
27
|
+
raise 'unsupported ruby version: ' + RUBY_VERSION
|
28
|
+
end
|
22
29
|
|
23
30
|
if OCI8.respond_to? :encoding
|
24
31
|
if defined? DEFAULT_OCI8_ENCODING
|
data/lib/oci8/datetime.rb
CHANGED
@@ -20,7 +20,7 @@ class OCI8
|
|
20
20
|
#
|
21
21
|
# This parameter is used when both or either of Oracle server and client
|
22
22
|
# version is Oracle 8i or lower. If both versions are Oracle 9i or upper,
|
23
|
-
# the default timezone is determined by session timezone.
|
23
|
+
# the default timezone is determined by the session timezone.
|
24
24
|
def self.default_timezone=(tz)
|
25
25
|
if tz != :local and tz != :utc
|
26
26
|
raise ArgumentError, "expected :local or :utc but #{tz}"
|
@@ -111,11 +111,13 @@ class OCI8
|
|
111
111
|
|
112
112
|
def ocidate_to_time(ary)
|
113
113
|
year, month, day, hour, minute, sec = ary
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
114
|
+
if year >= 139
|
115
|
+
begin
|
116
|
+
return ::Time.send(@@default_timezone, year, month, day, hour, minute, sec)
|
117
|
+
rescue StandardError
|
118
|
+
end
|
118
119
|
end
|
120
|
+
ocidate_to_datetime(ary)
|
119
121
|
end
|
120
122
|
|
121
123
|
if OCI8.oracle_client_version >= ORAVER_9_0
|
@@ -149,7 +151,7 @@ class OCI8
|
|
149
151
|
elsif @@time_offset == tz_hour * 3600 + tz_min * 60
|
150
152
|
timezone = :local
|
151
153
|
end
|
152
|
-
if timezone
|
154
|
+
if timezone and year >= 139
|
153
155
|
begin
|
154
156
|
# Ruby 1.9 Time class's resolution is nanosecond.
|
155
157
|
# But the last argument type is millisecond.
|
data/lib/oci8/oci8.rb
CHANGED
@@ -135,6 +135,31 @@ class OCI8
|
|
135
135
|
"#<OCI8:#{username}>"
|
136
136
|
end
|
137
137
|
|
138
|
+
# :call-seq:
|
139
|
+
# oracle_server_version -> oraver
|
140
|
+
#
|
141
|
+
# Returns an OCI8::OracleVersion of the Oracle server version.
|
142
|
+
#
|
143
|
+
# See also: OCI8.oracle_client_version
|
144
|
+
def oracle_server_version
|
145
|
+
unless defined? @oracle_server_version
|
146
|
+
if vernum = oracle_server_vernum
|
147
|
+
# If the Oracle client is Oracle 9i or upper,
|
148
|
+
# get the server version from the OCI function OCIServerRelease.
|
149
|
+
@oracle_server_version = OCI8::OracleVersion.new(vernum)
|
150
|
+
else
|
151
|
+
# Otherwise, get it from v$version.
|
152
|
+
self.exec('select banner from v$version') do |row|
|
153
|
+
if /^Oracle.*?(\d+\.\d+\.\d+\.\d+\.\d+)/ =~ row[0]
|
154
|
+
@oracle_server_version = OCI8::OracleVersion.new($1)
|
155
|
+
break
|
156
|
+
end
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
@oracle_server_version
|
161
|
+
end
|
162
|
+
|
138
163
|
module BindType
|
139
164
|
Mapping = {}
|
140
165
|
|
@@ -703,7 +728,7 @@ OCI8::BindType::Mapping[:date] = OCI8::BindType::Time
|
|
703
728
|
|
704
729
|
if OCI8.oracle_client_version >= OCI8::ORAVER_9_0
|
705
730
|
OCI8::BindType::Mapping[:timestamp] = OCI8::BindType::Time
|
706
|
-
OCI8::BindType::Mapping[:timestamp_tz] = OCI8::BindType::
|
731
|
+
OCI8::BindType::Mapping[:timestamp_tz] = OCI8::BindType::Time
|
707
732
|
OCI8::BindType::Mapping[:timestamp_ltz] = OCI8::BindType::Time
|
708
733
|
OCI8::BindType::Mapping[:interval_ym] = OCI8::BindType::IntervalYM
|
709
734
|
OCI8::BindType::Mapping[:interval_ds] = OCI8::BindType::IntervalDS
|
data/ruby-oci8.gemspec
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
# To make a binary gems package:
|
7
7
|
# gem build ruby-oci8.gemspec -- current
|
8
8
|
#
|
9
|
+
require 'fileutils'
|
9
10
|
|
10
11
|
if ARGV.size > 3
|
11
12
|
gem_platform = ARGV[3]
|
@@ -28,27 +29,35 @@ EOS
|
|
28
29
|
s.platform = gem_platform
|
29
30
|
files = File.read('dist-files').split("\n")
|
30
31
|
if gem_platform == Gem::Platform::RUBY
|
31
|
-
s.require_paths = ['lib']
|
32
32
|
s.extensions << 'ext/oci8/extconf.rb'
|
33
33
|
s.required_ruby_version = '>= 1.8.0'
|
34
34
|
else
|
35
|
-
|
36
|
-
|
35
|
+
so_files = Dir.glob('ext/oci8/oci8lib_*.so')
|
36
|
+
has_1_8 = so_files.include? 'ext/oci8/oci8lib_18.so'
|
37
|
+
has_1_9_1 = so_files.include? 'ext/oci8/oci8lib_191.so'
|
38
|
+
if has_1_8 and has_1_9_1
|
39
|
+
puts 'Binary gem for ruby 1.8 and 1.9.1'
|
40
|
+
s.required_ruby_version = '>= 1.8.0'
|
41
|
+
elsif has_1_8 and !has_1_9_1
|
42
|
+
puts 'Binary gem for ruby 1.8'
|
43
|
+
s.required_ruby_version = '~> 1.8.0'
|
44
|
+
elsif !has_1_8 and has_1_9_1
|
45
|
+
puts 'Binary gem for ruby 1.9.1'
|
37
46
|
s.required_ruby_version = '~> 1.9.1'
|
38
47
|
else
|
39
|
-
|
48
|
+
raise "No compiled binary are found. Run make in advance."
|
40
49
|
end
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
files << file
|
50
|
+
FileUtils.copy so_files, 'lib', :preserve => true
|
51
|
+
files.reject! do |fname|
|
52
|
+
fname =~ /^ext/
|
53
|
+
end
|
54
|
+
so_files.each do |fname|
|
55
|
+
files << 'lib/' + File.basename(fname)
|
48
56
|
end
|
57
|
+
files << 'lib/oci8.rb'
|
49
58
|
end
|
50
59
|
s.files = files
|
51
60
|
s.test_files = 'test/test_all.rb'
|
52
|
-
s.rdoc_options = ['--main', 'README'
|
61
|
+
s.rdoc_options = ['--main', 'README']
|
53
62
|
s.extra_rdoc_files = ['README']
|
54
63
|
end
|
data/test/test_array_dml.rb
CHANGED
@@ -22,7 +22,8 @@ CREATE TABLE test_table
|
|
22
22
|
N NUMBER(10, 2),
|
23
23
|
D DATE,
|
24
24
|
INT NUMBER(30),
|
25
|
-
BIGNUM NUMBER(30)
|
25
|
+
BIGNUM NUMBER(30),
|
26
|
+
T TIMESTAMP)
|
26
27
|
STORAGE (
|
27
28
|
INITIAL 4k
|
28
29
|
NEXT 4k
|
@@ -31,23 +32,25 @@ STORAGE (
|
|
31
32
|
PCTINCREASE 0)
|
32
33
|
EOS
|
33
34
|
@conn.exec(sql)
|
34
|
-
cursor = @conn.parse("INSERT INTO test_table VALUES (:C, :V, :N, :D, :INT, :BIGNUM)")
|
35
|
+
cursor = @conn.parse("INSERT INTO test_table VALUES (:C, :V, :N, :D, :INT, :BIGNUM, :T)")
|
35
36
|
max_array_size = 3
|
36
37
|
cursor.max_array_size= max_array_size
|
37
38
|
|
38
39
|
cursor.bind_param_array(1, nil, String)
|
39
40
|
cursor.bind_param_array(2, nil ,String)
|
40
41
|
cursor.bind_param_array(3, nil, Fixnum)
|
41
|
-
cursor.bind_param_array(4, nil, OraDate)
|
42
|
+
cursor.bind_param_array(4, nil, OraDate)
|
42
43
|
cursor.bind_param_array(5, nil, Integer)
|
43
44
|
cursor.bind_param_array(6, nil, Bignum)
|
44
|
-
|
45
|
+
cursor.bind_param_array(7, nil, DateTime)
|
46
|
+
|
45
47
|
c_arr = Array.new
|
46
48
|
v_arr = Array.new
|
47
49
|
n_arr = Array.new
|
48
50
|
d_arr = Array.new
|
49
51
|
int_arr = Array.new
|
50
52
|
bignum_arr = Array.new
|
53
|
+
t_arr = Array.new
|
51
54
|
|
52
55
|
1.upto(30) do |i|
|
53
56
|
c_arr << format("%10d", i * 10)
|
@@ -56,6 +59,7 @@ EOS
|
|
56
59
|
d_arr << OraDate.new(2000 + i, 12, 24, 23, 59, 59)
|
57
60
|
int_arr << i * 11111111111
|
58
61
|
bignum_arr << i * 10000000000
|
62
|
+
t_arr << DateTime.new(2000 + i, 12, 24, 23, 59, 59)
|
59
63
|
|
60
64
|
if i%max_array_size == 0
|
61
65
|
cursor[1] = c_arr
|
@@ -64,15 +68,24 @@ EOS
|
|
64
68
|
cursor[4] = d_arr
|
65
69
|
cursor[5] = int_arr
|
66
70
|
cursor[6] = bignum_arr
|
71
|
+
cursor[7] = t_arr
|
67
72
|
|
68
73
|
r = cursor.exec_array
|
69
74
|
assert_equal(max_array_size, r)
|
75
|
+
assert_equal(c_arr, cursor[1])
|
76
|
+
assert_equal(v_arr, cursor[2])
|
77
|
+
assert_equal(n_arr, cursor[3])
|
78
|
+
assert_equal(d_arr, cursor[4])
|
79
|
+
assert_equal(int_arr, cursor[5])
|
80
|
+
assert_equal(bignum_arr, cursor[6])
|
81
|
+
assert_equal(t_arr, cursor[7])
|
70
82
|
c_arr.clear
|
71
83
|
v_arr.clear
|
72
84
|
n_arr.clear
|
73
85
|
d_arr.clear
|
74
86
|
int_arr.clear
|
75
87
|
bignum_arr.clear
|
88
|
+
t_arr.clear
|
76
89
|
end
|
77
90
|
end
|
78
91
|
cursor.close
|
@@ -81,7 +94,7 @@ EOS
|
|
81
94
|
cursor.define(5, Integer)
|
82
95
|
cursor.define(6, Bignum)
|
83
96
|
cursor.exec
|
84
|
-
assert_equal(["C","V","N","D","INT","BIGNUM"], cursor.get_col_names)
|
97
|
+
assert_equal(["C","V","N","D","INT","BIGNUM","T"], cursor.get_col_names)
|
85
98
|
1.upto(30) do |i|
|
86
99
|
rv = cursor.fetch
|
87
100
|
assert_equal(format("%10d", i * 10), rv[0])
|
@@ -91,6 +104,7 @@ EOS
|
|
91
104
|
assert_equal(tm, rv[3])
|
92
105
|
assert_equal(i * 11111111111, rv[4])
|
93
106
|
assert_equal(i * 10000000000, rv[5])
|
107
|
+
assert_equal(tm, rv[6])
|
94
108
|
end
|
95
109
|
assert_nil(cursor.fetch)
|
96
110
|
drop_table('test_table')
|
@@ -131,13 +145,15 @@ EOS
|
|
131
145
|
sql = <<-EOS
|
132
146
|
CREATE TABLE test_table
|
133
147
|
(N NUMBER(10, 2) NOT NULL,
|
134
|
-
V VARCHAR(20)
|
148
|
+
V VARCHAR(20),
|
149
|
+
T TIMESTAMP)
|
135
150
|
EOS
|
136
151
|
@conn.exec(sql)
|
137
|
-
cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V)")
|
152
|
+
cursor = @conn.parse("INSERT INTO test_table VALUES (:N, :V, :T)")
|
138
153
|
cursor.max_array_size = 3
|
139
154
|
cursor.bind_param_array(1, [1, 2, 3])
|
140
155
|
cursor.bind_param_array(2, ['happy', 'new', 'year'])
|
156
|
+
cursor.bind_param_array(3, [Time.gm(1990,1,1), Time.gm(2000,1,1), Time.gm(2010,1,1)])
|
141
157
|
assert_nothing_raised() { cursor.exec_array }
|
142
158
|
cursor.max_array_size = 2
|
143
159
|
assert_raise(RuntimeError) { cursor.exec_array }
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-oci8
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- KUBO Takehiro
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2009-
|
12
|
+
date: 2009-03-18 00:00:00 +09:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -24,6 +24,7 @@ extra_rdoc_files:
|
|
24
24
|
files:
|
25
25
|
- ChangeLog
|
26
26
|
- Makefile
|
27
|
+
- NEWS
|
27
28
|
- README
|
28
29
|
- VERSION
|
29
30
|
- dist-files
|
@@ -98,8 +99,6 @@ post_install_message:
|
|
98
99
|
rdoc_options:
|
99
100
|
- --main
|
100
101
|
- README
|
101
|
-
- --exclude
|
102
|
-
- ext/*
|
103
102
|
require_paths:
|
104
103
|
- lib
|
105
104
|
required_ruby_version: !ruby/object:Gem::Requirement
|
@@ -117,7 +116,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
117
116
|
requirements: []
|
118
117
|
|
119
118
|
rubyforge_project: ruby-oci8
|
120
|
-
rubygems_version: 1.
|
119
|
+
rubygems_version: 1.2.0
|
121
120
|
signing_key:
|
122
121
|
specification_version: 2
|
123
122
|
summary: Ruby interface for Oracle using OCI8 API
|