ruby-oci8 2.0.6 → 2.1.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.
- data/ChangeLog +366 -19
- data/Makefile +2 -8
- data/NEWS +111 -0
- data/README +4 -85
- data/VERSION +1 -1
- data/dist-files +9 -2
- data/ext/oci8/.document +1 -0
- data/ext/oci8/apiwrap.c.tmpl +12 -2
- data/ext/oci8/apiwrap.yml +37 -21
- data/ext/oci8/attr.c +23 -74
- data/ext/oci8/bind.c +93 -225
- data/ext/oci8/connection_pool.c +201 -0
- data/ext/oci8/encoding.c +117 -24
- data/ext/oci8/env.c +5 -10
- data/ext/oci8/error.c +171 -189
- data/ext/oci8/extconf.rb +6 -2
- data/ext/oci8/lob.c +81 -79
- data/ext/oci8/metadata.c +42 -177
- data/ext/oci8/object.c +55 -28
- data/ext/oci8/oci8.c +426 -294
- data/ext/oci8/oci8.h +84 -51
- data/ext/oci8/oci8lib.c +75 -53
- data/ext/oci8/ocidatetime.c +67 -88
- data/ext/oci8/ocihandle.c +78 -37
- data/ext/oci8/ocinumber.c +166 -109
- data/ext/oci8/oraconf.rb +68 -157
- data/ext/oci8/oradate.c +2 -7
- data/ext/oci8/stmt.c +40 -183
- data/ext/oci8/thread_util.c +85 -0
- data/ext/oci8/thread_util.h +30 -0
- data/lib/oci8.rb.in +19 -13
- data/lib/oci8/.document +2 -0
- data/lib/oci8/bindtype.rb +62 -45
- data/lib/oci8/connection_pool.rb +118 -0
- data/lib/oci8/datetime.rb +304 -320
- data/lib/oci8/encoding-init.rb +62 -30
- data/lib/oci8/encoding.yml +3 -3
- data/lib/oci8/metadata.rb +552 -497
- data/lib/oci8/object.rb +9 -9
- data/lib/oci8/oci8.rb +161 -2
- data/lib/oci8/ocihandle.rb +427 -0
- data/lib/oci8/properties.rb +31 -1
- data/ruby-oci8.gemspec +10 -3
- data/test/README +41 -3
- data/test/config.rb +16 -0
- data/test/test_all.rb +3 -0
- data/test/test_bind_string.rb +106 -0
- data/test/test_break.rb +33 -7
- data/test/test_clob.rb +13 -10
- data/test/test_connection_pool.rb +125 -0
- data/test/test_connstr.rb +2 -2
- data/test/test_datetime.rb +26 -66
- data/test/test_encoding.rb +7 -3
- data/test/test_error.rb +88 -0
- data/test/test_metadata.rb +1356 -204
- data/test/test_oci8.rb +27 -8
- data/test/test_oranumber.rb +41 -0
- metadata +34 -9
- data/ext/oci8/xmldb.c +0 -383
data/ext/oci8/oraconf.rb
CHANGED
@@ -1,35 +1,7 @@
|
|
1
1
|
require 'mkmf'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
def macro_defined?(macro, src, opt="")
|
6
|
-
try_cpp(src + <<"SRC", opt)
|
7
|
-
#ifndef #{macro}
|
8
|
-
# error
|
9
|
-
#endif
|
10
|
-
SRC
|
11
|
-
end
|
12
|
-
end
|
13
|
-
|
14
|
-
module Logging
|
15
|
-
unless Logging.respond_to?(:open)
|
16
|
-
# emulate Logging::open of ruby 1.6.8 or later.
|
17
|
-
|
18
|
-
if $log.nil? # ruby 1.6.2 doesn't have $log.
|
19
|
-
$log = open('mkmf.log', 'w')
|
20
|
-
end
|
21
|
-
def Logging::open
|
22
|
-
begin
|
23
|
-
$stderr.reopen($log)
|
24
|
-
$stdout.reopen($log)
|
25
|
-
yield
|
26
|
-
ensure
|
27
|
-
$stderr.reopen($orgerr)
|
28
|
-
$stdout.reopen($orgout)
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end # module Logging
|
3
|
+
# compatibility for ruby-1.9
|
4
|
+
RbConfig = Config unless defined? RbConfig
|
33
5
|
|
34
6
|
module MiniRegistry
|
35
7
|
class MiniRegistryError < StandardError
|
@@ -148,7 +120,7 @@ class MiniSOReader
|
|
148
120
|
read_mach_o_unversal(f)
|
149
121
|
else
|
150
122
|
# AIX and Tru64
|
151
|
-
raise format("unknown file header: %02x %02x", file_header[0], file_header[1])
|
123
|
+
raise format("unknown file header: %02x %02x", file_header[0].to_i, file_header[1].to_i)
|
152
124
|
end
|
153
125
|
ensure
|
154
126
|
f.close
|
@@ -193,6 +165,8 @@ class MiniSOReader
|
|
193
165
|
@cpu = :i386
|
194
166
|
when 15
|
195
167
|
@cpu = :parisc
|
168
|
+
when 18
|
169
|
+
@cpu = :sparc32plus
|
196
170
|
when 20
|
197
171
|
@cpu = :ppc
|
198
172
|
when 21
|
@@ -378,10 +352,10 @@ EOS
|
|
378
352
|
|
379
353
|
private
|
380
354
|
|
381
|
-
def self.make_proc_to_check_cpu(expect)
|
355
|
+
def self.make_proc_to_check_cpu(*expect)
|
382
356
|
Proc.new do |file|
|
383
357
|
so = MiniSOReader.new(file)
|
384
|
-
if so.cpu
|
358
|
+
if expect.include? so.cpu
|
385
359
|
true
|
386
360
|
else
|
387
361
|
puts " skip: #{file} is for #{so.cpu} cpu."
|
@@ -432,7 +406,7 @@ EOS
|
|
432
406
|
if is_32bit
|
433
407
|
@@ld_envs = %w[LD_LIBRARY_PATH_32 LD_LIBRARY_PATH]
|
434
408
|
if is_big_endian
|
435
|
-
check_proc = make_proc_to_check_cpu(:sparc)
|
409
|
+
check_proc = make_proc_to_check_cpu(:sparc, :sparc32plus)
|
436
410
|
else
|
437
411
|
check_proc = make_proc_to_check_cpu(:i386)
|
438
412
|
end
|
@@ -572,12 +546,14 @@ EOS
|
|
572
546
|
puts "yes"
|
573
547
|
return path, files[0]
|
574
548
|
end
|
549
|
+
nil
|
575
550
|
end
|
576
551
|
|
577
552
|
def init
|
578
553
|
check_cc()
|
579
554
|
@cc_is_gcc = check_cc_is_gcc()
|
580
555
|
@lp64 = check_lp64()
|
556
|
+
check_system_header()
|
581
557
|
check_ruby_header()
|
582
558
|
end
|
583
559
|
|
@@ -619,33 +595,36 @@ EOS
|
|
619
595
|
end
|
620
596
|
end # check_lp64
|
621
597
|
|
598
|
+
def check_system_header
|
599
|
+
if not have_header('sys/types.h')
|
600
|
+
raise <<EOS
|
601
|
+
A standard C header file 'sys/types.h' doesn't exist.
|
602
|
+
Did you install glibc-devel(redhat) or libc6-dev(debian/ubuntu)?
|
603
|
+
EOS
|
604
|
+
end
|
605
|
+
end
|
606
|
+
|
622
607
|
def check_ruby_header
|
623
608
|
print "checking for ruby header... "
|
624
609
|
STDOUT.flush
|
625
|
-
rubyhdrdir =
|
610
|
+
rubyhdrdir = RbConfig::CONFIG["rubyhdrdir"] || RbConfig::CONFIG['archdir']
|
626
611
|
unless File.exist?(rubyhdrdir + '/ruby.h')
|
627
612
|
puts "ng"
|
628
|
-
if RUBY_PLATFORM =~ /darwin/ and File.exist?("#{
|
613
|
+
if RUBY_PLATFORM =~ /darwin/ and File.exist?("#{RbConfig::CONFIG['archdir']}/../universal-darwin8.0/ruby.h")
|
629
614
|
raise <<EOS
|
630
|
-
#{
|
615
|
+
#{RbConfig::CONFIG['archdir']}/ruby.h doesn't exist.
|
631
616
|
Run the following commands to fix the problem.
|
632
617
|
|
633
|
-
cd #{
|
618
|
+
cd #{RbConfig::CONFIG['archdir']}
|
634
619
|
sudo ln -s ../universal-darwin8.0/* ./
|
635
620
|
EOS
|
636
621
|
else
|
637
622
|
raise <<EOS
|
638
|
-
#{
|
623
|
+
#{RbConfig::CONFIG['archdir']}/ruby.h doesn't exist.
|
639
624
|
Install the ruby development library.
|
640
625
|
EOS
|
641
626
|
end
|
642
627
|
end
|
643
|
-
if RUBY_PLATFORM =~ /linux/ and not File.exist?("/usr/include/sys/types.h")
|
644
|
-
raise <<EOS
|
645
|
-
Do you install glibc-devel(redhat) or libc6-dev(debian)?
|
646
|
-
You need /usr/include/sys/types.h to compile ruby-oci8.
|
647
|
-
EOS
|
648
|
-
end
|
649
628
|
puts "ok"
|
650
629
|
$stdout.flush
|
651
630
|
end # check_ruby_header
|
@@ -662,12 +641,12 @@ EOS
|
|
662
641
|
|
663
642
|
if RUBY_PLATFORM =~ /mswin32|cygwin|mingw32|bccwin32/ # when Windows
|
664
643
|
|
665
|
-
def get_libs(
|
644
|
+
def get_libs(lib_dir)
|
666
645
|
case RUBY_PLATFORM
|
667
646
|
when /cygwin/
|
668
647
|
open("OCI.def", "w") do |f|
|
669
648
|
f.puts("EXPORTS")
|
670
|
-
open("|nm #{
|
649
|
+
open("|nm #{lib_dir}/MSVC/OCI.LIB") do |r|
|
671
650
|
while line = r.gets
|
672
651
|
f.puts($') if line =~ / T _/
|
673
652
|
end
|
@@ -682,21 +661,34 @@ EOS
|
|
682
661
|
when /bccwin32/
|
683
662
|
# replace '/' to '\\' because bcc linker misunderstands
|
684
663
|
# 'C:/foo/bar/OCI.LIB' as unknown option.
|
685
|
-
lib = "#{
|
664
|
+
lib = "#{lib_dir}/BORLAND/OCI.LIB"
|
686
665
|
return lib.tr('/', '\\') if File.exist?(lib)
|
687
666
|
raise <<EOS
|
688
667
|
#{lib} does not exist.
|
689
668
|
|
690
669
|
Your Oracle may not support Borland C++.
|
691
670
|
If you want to run this module, run the following command at your own risk.
|
692
|
-
cd #{
|
671
|
+
cd #{lib_dir.tr('/', '\\')}
|
693
672
|
mkdir Borland
|
694
673
|
cd Borland
|
695
674
|
coff2omf ..\\MSVC\\OCI.LIB OCI.LIB
|
696
675
|
EOS
|
697
676
|
exit 1
|
698
677
|
else
|
699
|
-
"\"#{
|
678
|
+
"\"#{lib_dir}/MSVC/OCI.LIB\""
|
679
|
+
end
|
680
|
+
end
|
681
|
+
|
682
|
+
else
|
683
|
+
# Unix
|
684
|
+
def get_libs(lib_dir)
|
685
|
+
case RUBY_PLATFORM
|
686
|
+
when /solaris/
|
687
|
+
" -L#{lib_dir} -R#{lib_dir} -lclntsh"
|
688
|
+
when /linux/
|
689
|
+
" -L#{lib_dir} -Wl,-rpath,#{lib_dir} -lclntsh"
|
690
|
+
else
|
691
|
+
" -L#{lib_dir} -lclntsh"
|
700
692
|
end
|
701
693
|
end
|
702
694
|
|
@@ -710,7 +702,7 @@ class OraConfFC < OraConf
|
|
710
702
|
|
711
703
|
@oracle_home = get_home()
|
712
704
|
if RUBY_PLATFORM =~ /freebsd/ && @oracle_home == '/usr/local/oracle8-client'
|
713
|
-
|
705
|
+
raise "Oralce 8i is not supported."
|
714
706
|
else
|
715
707
|
@version = get_version()
|
716
708
|
end
|
@@ -725,34 +717,14 @@ class OraConfFC < OraConf
|
|
725
717
|
use_lib32 = false
|
726
718
|
end
|
727
719
|
|
728
|
-
|
729
|
-
|
730
|
-
|
731
|
-
|
732
|
-
else
|
733
|
-
lib_dir = "#{@oracle_home}/lib"
|
734
|
-
end
|
735
|
-
case RUBY_PLATFORM
|
736
|
-
when /solaris/
|
737
|
-
@libs = " -L#{lib_dir} -R#{lib_dir} -lclntsh"
|
738
|
-
when /linux/
|
739
|
-
@libs = " -L#{lib_dir} -Wl,-rpath,#{lib_dir} -lclntsh"
|
740
|
-
else
|
741
|
-
@libs = " -L#{lib_dir} -lclntsh"
|
742
|
-
end
|
743
|
-
return if try_link_oci()
|
744
|
-
end
|
745
|
-
|
746
|
-
# get from demo_rdbms.mk
|
747
|
-
if use_lib32
|
748
|
-
if File.exist?("#{@oracle_home}/rdbms/demo/demo_rdbms32.mk")
|
749
|
-
@libs = get_libs('32', '')
|
750
|
-
else
|
751
|
-
@libs = get_libs('', '32')
|
752
|
-
end
|
720
|
+
if RUBY_PLATFORM =~ /mswin32|cygwin|mingw32|bccwin32/
|
721
|
+
lib_dir = "#{@oracle_home}/oci/lib"
|
722
|
+
elsif use_lib32
|
723
|
+
lib_dir = "#{@oracle_home}/lib32"
|
753
724
|
else
|
754
|
-
|
725
|
+
lib_dir = "#{@oracle_home}/lib"
|
755
726
|
end
|
727
|
+
@libs = get_libs(lib_dir)
|
756
728
|
return if try_link_oci()
|
757
729
|
|
758
730
|
raise 'cannot compile OCI'
|
@@ -870,23 +842,14 @@ EOS
|
|
870
842
|
oracle_home.gsub(/\\/, '/')
|
871
843
|
end
|
872
844
|
|
873
|
-
def oci_base_dir
|
874
|
-
case @version
|
875
|
-
when /80./
|
876
|
-
"#{@oracle_home}/OCI80"
|
877
|
-
else
|
878
|
-
"#{@oracle_home}/OCI"
|
879
|
-
end
|
880
|
-
end
|
881
|
-
|
882
845
|
def get_cflags
|
883
|
-
unless File.exist?("#{
|
884
|
-
raise "'#{
|
846
|
+
unless File.exist?("#{@oracle_home}/OCI/INCLUDE/OCI.H")
|
847
|
+
raise "'#{@oracle_home}/OCI/INCLUDE/OCI.H' does not exists. Please install 'Oracle Call Interface'."
|
885
848
|
end
|
886
849
|
if RUBY_PLATFORM =~ /cygwin/
|
887
|
-
" \"-I#{
|
850
|
+
" \"-I#{@oracle_home}/OCI/INCLUDE\" -D_int64=\"long long\""
|
888
851
|
else
|
889
|
-
" \"-I#{
|
852
|
+
" \"-I#{@oracle_home}/OCI/INCLUDE\""
|
890
853
|
end
|
891
854
|
end
|
892
855
|
|
@@ -957,70 +920,6 @@ EOS
|
|
957
920
|
end
|
958
921
|
end # get_cflags
|
959
922
|
|
960
|
-
def get_libs(postfix1 = '', postfix2 = "")
|
961
|
-
print("Running make for $ORACLE_HOME/rdbms/demo/demo_rdbms#{postfix1}.mk (build#{postfix2}) ...")
|
962
|
-
STDOUT.flush
|
963
|
-
|
964
|
-
make_opt = "CC='echo MARKER' EXE=/dev/null ECHODO=echo ECHO=echo GENCLNTSH='echo genclntsh'"
|
965
|
-
if @cc_is_gcc && /solaris/ =~ RUBY_PLATFORM
|
966
|
-
# suggested by Brian Candler.
|
967
|
-
make_opt += " KPIC_OPTION= NOKPIC_CCFLAGS#{postfix2}="
|
968
|
-
end
|
969
|
-
|
970
|
-
command = "|make -f #{@oracle_home}/rdbms/demo/demo_rdbms#{postfix1}.mk build#{postfix2} #{make_opt}"
|
971
|
-
marker = /^\s*MARKER/
|
972
|
-
echo = /^\s*echo/
|
973
|
-
libs = nil
|
974
|
-
Logging::open do
|
975
|
-
puts command
|
976
|
-
open(command, "r") do |f|
|
977
|
-
while line = f.gets
|
978
|
-
puts line
|
979
|
-
line.chomp!
|
980
|
-
line = $' while line =~ echo
|
981
|
-
if line =~ marker
|
982
|
-
# found a line where a compiler runs.
|
983
|
-
libs = $'
|
984
|
-
libs.gsub!(/-o\s+\/dev\/null/, "")
|
985
|
-
libs.gsub!(/-o\s+build/, "")
|
986
|
-
end
|
987
|
-
end
|
988
|
-
end
|
989
|
-
end
|
990
|
-
raise 'Cannot get proper libs.' if libs.nil?
|
991
|
-
print("OK\n")
|
992
|
-
|
993
|
-
case RUBY_PLATFORM
|
994
|
-
when /hpux/
|
995
|
-
if @cc_is_gcc
|
996
|
-
# strip +DA2.0W, +DS2.0, -Wl,+s, -Wl,+n
|
997
|
-
libs.gsub!(/\+DA\S+(\s)*/, "")
|
998
|
-
libs.gsub!(/\+DS\S+(\s)*/, "")
|
999
|
-
libs.gsub!(/-Wl,\+[sn](\s)*/, "")
|
1000
|
-
end
|
1001
|
-
libs.gsub!(/ -Wl,/, " ")
|
1002
|
-
when /aix/
|
1003
|
-
if @cc_is_gcc
|
1004
|
-
# strip -bI:/xxx
|
1005
|
-
libs.gsub!(/(-bI:\S+)/, '')
|
1006
|
-
end
|
1007
|
-
end
|
1008
|
-
|
1009
|
-
# check whether object files are included.
|
1010
|
-
if /\S+\.o\b/ =~ libs
|
1011
|
-
|
1012
|
-
# monkey patching!
|
1013
|
-
Object.module_eval do
|
1014
|
-
alias :link_command_pre_oci8 :link_command
|
1015
|
-
def link_command(*args)
|
1016
|
-
args[1] = "" if args[1] == $libs
|
1017
|
-
link_command_pre_oci8(*args)
|
1018
|
-
end
|
1019
|
-
end
|
1020
|
-
|
1021
|
-
end
|
1022
|
-
libs
|
1023
|
-
end # get_libs
|
1024
923
|
end
|
1025
924
|
end
|
1026
925
|
|
@@ -1072,7 +971,7 @@ EOS
|
|
1072
971
|
end
|
1073
972
|
@cflags = " \"-I#{inc_dir}\""
|
1074
973
|
@cflags += " -D_int64=\"long long\"" if RUBY_PLATFORM =~ /cygwin/
|
1075
|
-
@libs = get_libs("#{ic_dir}/sdk")
|
974
|
+
@libs = get_libs("#{ic_dir}/sdk/lib")
|
1076
975
|
ld_path = nil
|
1077
976
|
else
|
1078
977
|
@cflags = " -I#{inc_dir}"
|
@@ -1116,7 +1015,7 @@ EOS
|
|
1116
1015
|
end
|
1117
1016
|
raise 'failed'
|
1118
1017
|
end
|
1119
|
-
@libs =
|
1018
|
+
@libs = get_libs(lib_dir)
|
1120
1019
|
end
|
1121
1020
|
unless File.exist?("#{inc_dir}/oci.h")
|
1122
1021
|
raise <<EOS
|
@@ -1133,6 +1032,18 @@ EOS
|
|
1133
1032
|
else
|
1134
1033
|
# 10.1.0 doesn't have OCI_MAJOR_VERSION and OCI_MINOR_VERSION in oci.h.
|
1135
1034
|
@version = "1010"
|
1035
|
+
if RUBY_PLATFORM =~ /darwin/ and 1.size == 8 and `sw_vers -productVersion`.chomp == "10.7"
|
1036
|
+
$stderr.print <<EOS
|
1037
|
+
WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN!
|
1038
|
+
|
1039
|
+
64-bit Oracle instant client doesn't work on OS X Lion.
|
1040
|
+
See: https://forums.oracle.com/forums/thread.jspa?threadID=2187558
|
1041
|
+
|
1042
|
+
The compilation is continued because the issue may be fixed in future.
|
1043
|
+
|
1044
|
+
WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN! WARN!
|
1045
|
+
EOS
|
1046
|
+
end
|
1136
1047
|
end
|
1137
1048
|
return
|
1138
1049
|
end
|
@@ -1181,7 +1092,7 @@ or
|
|
1181
1092
|
export RC_ARCHS
|
1182
1093
|
|
1183
1094
|
If it does not fix the problem, delete all '-arch #{missing_arch}'
|
1184
|
-
in '#{
|
1095
|
+
in '#{RbConfig::CONFIG['archdir']}/rbconfig.rb'.
|
1185
1096
|
EOS
|
1186
1097
|
end
|
1187
1098
|
end
|
data/ext/oci8/oradate.c
CHANGED
@@ -2,9 +2,6 @@
|
|
2
2
|
/*
|
3
3
|
* oradate.c
|
4
4
|
*
|
5
|
-
* $Author: kubo $
|
6
|
-
* $Date: 2010-09-05 22:07:21 +0900 (Sun, 05 Sep 2010) $
|
7
|
-
*
|
8
5
|
* Copyright (C) 2002-2008 KUBO Takehiro <kubo@jiubao.org>
|
9
6
|
*
|
10
7
|
* date and time between 4712 B.C. and 9999 A.D.
|
@@ -557,7 +554,7 @@ static void bind_oradate_init_elem(oci8_bind_t *obind, VALUE svc)
|
|
557
554
|
} while (++idx < obind->maxar_sz);
|
558
555
|
}
|
559
556
|
|
560
|
-
static const
|
557
|
+
static const oci8_bind_vtable_t bind_oradate_vtable = {
|
561
558
|
{
|
562
559
|
NULL,
|
563
560
|
oci8_bind_free,
|
@@ -568,8 +565,6 @@ static const oci8_bind_class_t bind_oradate_class = {
|
|
568
565
|
bind_oradate_init,
|
569
566
|
bind_oradate_init_elem,
|
570
567
|
NULL,
|
571
|
-
NULL,
|
572
|
-
NULL,
|
573
568
|
SQLT_DAT,
|
574
569
|
};
|
575
570
|
|
@@ -612,5 +607,5 @@ void Init_ora_date(void)
|
|
612
607
|
rb_define_method(cOraDate, "_dump", ora_date_dump, -1);
|
613
608
|
rb_define_singleton_method(cOraDate, "_load", ora_date_s_load, 1);
|
614
609
|
|
615
|
-
oci8_define_bind_class("OraDate", &
|
610
|
+
oci8_define_bind_class("OraDate", &bind_oradate_vtable);
|
616
611
|
}
|
data/ext/oci8/stmt.c
CHANGED
@@ -53,7 +53,7 @@ static void oci8_stmt_free(oci8_base_t *base)
|
|
53
53
|
stmt->defns = Qnil;
|
54
54
|
}
|
55
55
|
|
56
|
-
static
|
56
|
+
static oci8_base_vtable_t oci8_stmt_vtable = {
|
57
57
|
oci8_stmt_mark,
|
58
58
|
oci8_stmt_free,
|
59
59
|
sizeof(oci8_stmt_t),
|
@@ -87,7 +87,7 @@ static VALUE oci8_stmt_initialize(int argc, VALUE *argv, VALUE self)
|
|
87
87
|
if (argc > 1) {
|
88
88
|
rv = OCIStmtPrepare(stmt->base.hp.stmt, oci8_errhp, RSTRING_ORATEXT(sql), RSTRING_LEN(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
|
89
89
|
if (IS_OCI_ERROR(rv)) {
|
90
|
-
|
90
|
+
chker3(rv, &stmt->base, stmt->base.hp.stmt);
|
91
91
|
}
|
92
92
|
}
|
93
93
|
oci8_link_to_parent((oci8_base_t*)stmt, (oci8_base_t*)DATA_PTR(svc));
|
@@ -99,24 +99,18 @@ static VALUE oci8_define_by_pos(VALUE self, VALUE vposition, VALUE vbindobj)
|
|
99
99
|
oci8_stmt_t *stmt = TO_STMT(self);
|
100
100
|
ub4 position;
|
101
101
|
oci8_bind_t *obind;
|
102
|
-
const
|
102
|
+
const oci8_bind_vtable_t *vptr;
|
103
103
|
sword status;
|
104
|
-
ub4 mode;
|
105
104
|
|
106
105
|
position = NUM2INT(vposition); /* 1 */
|
107
106
|
obind = oci8_get_bind(vbindobj); /* 2 */
|
108
107
|
if (obind->base.hp.dfn != NULL) {
|
109
108
|
oci8_base_free(&obind->base); /* TODO: OK? */
|
110
109
|
}
|
111
|
-
|
112
|
-
|
113
|
-
mode = OCI_DEFAULT;
|
114
|
-
} else {
|
115
|
-
mode = OCI_DYNAMIC_FETCH;
|
116
|
-
}
|
117
|
-
status = OCIDefineByPos(stmt->base.hp.stmt, &obind->base.hp.dfn, oci8_errhp, position, obind->valuep, obind->value_sz, bind_class->dty, NIL_P(obind->tdo) ? obind->u.inds : NULL, NULL, 0, mode);
|
110
|
+
vptr = (const oci8_bind_vtable_t *)obind->base.vptr;
|
111
|
+
status = OCIDefineByPos(stmt->base.hp.stmt, &obind->base.hp.dfn, oci8_errhp, position, obind->valuep, obind->value_sz, vptr->dty, NIL_P(obind->tdo) ? obind->u.inds : NULL, NULL, 0, OCI_DEFAULT);
|
118
112
|
if (status != OCI_SUCCESS) {
|
119
|
-
|
113
|
+
chker3(status, &stmt->base, stmt->base.hp.ptr);
|
120
114
|
}
|
121
115
|
obind->base.type = OCI_HTYPE_DEFINE;
|
122
116
|
/* link to the parent as soon as possible to preserve deallocation order. */
|
@@ -124,12 +118,10 @@ static VALUE oci8_define_by_pos(VALUE self, VALUE vposition, VALUE vbindobj)
|
|
124
118
|
oci8_link_to_parent((oci8_base_t*)obind, (oci8_base_t*)stmt);
|
125
119
|
|
126
120
|
if (NIL_P(obind->tdo) && obind->maxar_sz > 0) {
|
127
|
-
|
121
|
+
chker2(OCIDefineArrayOfStruct(obind->base.hp.dfn, oci8_errhp, obind->alloc_sz, sizeof(sb2), 0, 0), &stmt->base);
|
128
122
|
}
|
129
|
-
if (
|
130
|
-
|
131
|
-
oci_lc(OCIDefineObject(obind->base.hp.dfn, oci8_errhp, tdo->hp.tdo,
|
132
|
-
obind->valuep, 0, obind->u.null_structs, 0));
|
123
|
+
if (vptr->post_bind_hook != NULL) {
|
124
|
+
vptr->post_bind_hook(obind);
|
133
125
|
}
|
134
126
|
if (position - 1 < RARRAY_LEN(stmt->defns)) {
|
135
127
|
VALUE old_value = RARRAY_PTR(stmt->defns)[position - 1];
|
@@ -137,9 +129,6 @@ static VALUE oci8_define_by_pos(VALUE self, VALUE vposition, VALUE vbindobj)
|
|
137
129
|
oci8_base_free((oci8_base_t*)oci8_get_bind(old_value));
|
138
130
|
}
|
139
131
|
}
|
140
|
-
if (bind_class->csfrm != 0) {
|
141
|
-
oci_lc(OCIAttrSet(obind->base.hp.ptr, OCI_HTYPE_DEFINE, (void*)&bind_class->csfrm, 0, OCI_ATTR_CHARSET_FORM, oci8_errhp));
|
142
|
-
}
|
143
132
|
rb_ary_store(stmt->defns, position - 1, obind->base.self);
|
144
133
|
return obind->base.self;
|
145
134
|
}
|
@@ -151,12 +140,10 @@ static VALUE oci8_bind(VALUE self, VALUE vplaceholder, VALUE vbindobj)
|
|
151
140
|
ub4 placeholder_len = 0;
|
152
141
|
ub4 position = 0;
|
153
142
|
oci8_bind_t *obind;
|
154
|
-
const
|
143
|
+
const oci8_bind_vtable_t *vptr;
|
155
144
|
sword status;
|
156
145
|
VALUE old_value;
|
157
146
|
void *indp;
|
158
|
-
ub4 *curelep;
|
159
|
-
ub4 mode;
|
160
147
|
|
161
148
|
if (NIL_P(vplaceholder)) { /* 1 */
|
162
149
|
placeholder_ptr = NULL;
|
@@ -179,26 +166,16 @@ static VALUE oci8_bind(VALUE self, VALUE vplaceholder, VALUE vbindobj)
|
|
179
166
|
if (obind->base.hp.bnd != NULL) {
|
180
167
|
oci8_base_free(&obind->base); /* TODO: OK? */
|
181
168
|
}
|
182
|
-
|
183
|
-
if (bind_class->in != NULL || bind_class->out != NULL) {
|
184
|
-
mode = OCI_DATA_AT_EXEC;
|
185
|
-
} else {
|
186
|
-
mode = OCI_DEFAULT;
|
187
|
-
}
|
169
|
+
vptr = (const oci8_bind_vtable_t *)obind->base.vptr;
|
188
170
|
|
189
171
|
indp = NIL_P(obind->tdo) ? obind->u.inds : NULL;
|
190
|
-
if (obind->maxar_sz == 0) {
|
191
|
-
curelep = NULL;
|
192
|
-
} else {
|
193
|
-
curelep = &obind->curar_sz;
|
194
|
-
}
|
195
172
|
if (placeholder_ptr == (char*)-1) {
|
196
|
-
status = OCIBindByPos(stmt->base.hp.stmt, &obind->base.hp.bnd, oci8_errhp, position, obind->valuep, obind->value_sz,
|
173
|
+
status = OCIBindByPos(stmt->base.hp.stmt, &obind->base.hp.bnd, oci8_errhp, position, obind->valuep, obind->value_sz, vptr->dty, indp, NULL, 0, 0, 0, OCI_DEFAULT);
|
197
174
|
} else {
|
198
|
-
status = OCIBindByName(stmt->base.hp.stmt, &obind->base.hp.bnd, oci8_errhp, TO_ORATEXT(placeholder_ptr), placeholder_len, obind->valuep, obind->value_sz,
|
175
|
+
status = OCIBindByName(stmt->base.hp.stmt, &obind->base.hp.bnd, oci8_errhp, TO_ORATEXT(placeholder_ptr), placeholder_len, obind->valuep, obind->value_sz, vptr->dty, indp, NULL, 0, 0, 0, OCI_DEFAULT);
|
199
176
|
}
|
200
177
|
if (status != OCI_SUCCESS) {
|
201
|
-
|
178
|
+
chker3(status, &stmt->base, stmt->base.hp.stmt);
|
202
179
|
}
|
203
180
|
obind->base.type = OCI_HTYPE_BIND;
|
204
181
|
/* link to the parent as soon as possible to preserve deallocation order. */
|
@@ -206,15 +183,11 @@ static VALUE oci8_bind(VALUE self, VALUE vplaceholder, VALUE vbindobj)
|
|
206
183
|
oci8_link_to_parent((oci8_base_t*)obind, (oci8_base_t*)stmt);
|
207
184
|
|
208
185
|
if (NIL_P(obind->tdo) && obind->maxar_sz > 0) {
|
209
|
-
|
186
|
+
chker2(OCIBindArrayOfStruct(obind->base.hp.bnd, oci8_errhp, obind->alloc_sz, sizeof(sb2), 0, 0),
|
187
|
+
&stmt->base);
|
210
188
|
}
|
211
|
-
if (
|
212
|
-
|
213
|
-
oci_lc(OCIBindObject(obind->base.hp.bnd, oci8_errhp, tdo->hp.tdo,
|
214
|
-
obind->valuep, 0, obind->u.null_structs, 0));
|
215
|
-
}
|
216
|
-
if (bind_class->csfrm != 0) {
|
217
|
-
oci_lc(OCIAttrSet(obind->base.hp.ptr, OCI_HTYPE_BIND, (void*)&bind_class->csfrm, 0, OCI_ATTR_CHARSET_FORM, oci8_errhp));
|
189
|
+
if (vptr->post_bind_hook != NULL) {
|
190
|
+
vptr->post_bind_hook(obind);
|
218
191
|
}
|
219
192
|
old_value = rb_hash_aref(stmt->binds, vplaceholder);
|
220
193
|
if (!NIL_P(old_value)) {
|
@@ -247,9 +220,8 @@ static VALUE oci8_stmt_execute(VALUE self, VALUE iteration_count)
|
|
247
220
|
oci8_svcctx_t *svcctx = oci8_get_svcctx(stmt->svc);
|
248
221
|
ub4 iters;
|
249
222
|
ub4 mode;
|
250
|
-
sword rv;
|
251
223
|
|
252
|
-
if (oci8_get_ub2_attr(&stmt->base, OCI_ATTR_STMT_TYPE) == INT2FIX(OCI_STMT_SELECT)) {
|
224
|
+
if (oci8_get_ub2_attr(&stmt->base, OCI_ATTR_STMT_TYPE, stmt->base.hp.stmt) == INT2FIX(OCI_STMT_SELECT)) {
|
253
225
|
iters = 0;
|
254
226
|
mode = OCI_DEFAULT;
|
255
227
|
} else {
|
@@ -259,58 +231,8 @@ static VALUE oci8_stmt_execute(VALUE self, VALUE iteration_count)
|
|
259
231
|
iters = 1;
|
260
232
|
mode = svcctx->is_autocommit ? OCI_COMMIT_ON_SUCCESS : OCI_DEFAULT;
|
261
233
|
}
|
262
|
-
|
263
|
-
|
264
|
-
while (rv == OCI_NEED_DATA) {
|
265
|
-
oci8_bind_t *obind;
|
266
|
-
const oci8_bind_class_t *bind_class;
|
267
|
-
/* get piece info. */
|
268
|
-
dvoid *hp;
|
269
|
-
ub4 type;
|
270
|
-
ub1 in_out;
|
271
|
-
ub4 iter;
|
272
|
-
ub4 idx;
|
273
|
-
ub1 piece;
|
274
|
-
/* set piece info. */
|
275
|
-
void *valuep;
|
276
|
-
ub4 *alenp;
|
277
|
-
void *indp;
|
278
|
-
|
279
|
-
oci_lc(OCIStmtGetPieceInfo(stmt->base.hp.ptr, oci8_errhp, &hp, &type, &in_out, &iter, &idx, &piece));
|
280
|
-
obind = (oci8_bind_t*)stmt->base.children;
|
281
|
-
do {
|
282
|
-
if (obind->base.hp.ptr == hp) {
|
283
|
-
if (type != OCI_HTYPE_BIND)
|
284
|
-
rb_bug("ruby-oci8: expect OCI_HTYPE_BIND but %d", type);
|
285
|
-
bind_class = (const oci8_bind_class_t *)obind->base.klass;
|
286
|
-
switch (in_out) {
|
287
|
-
case OCI_PARAM_IN:
|
288
|
-
if (bind_class->in == NULL)
|
289
|
-
rb_bug("....");
|
290
|
-
piece = bind_class->in(obind, idx, piece, &valuep, &alenp, &indp);
|
291
|
-
break;
|
292
|
-
case OCI_PARAM_OUT:
|
293
|
-
if (bind_class->out == NULL)
|
294
|
-
rb_bug("....");
|
295
|
-
bind_class->out(obind, idx, piece, &valuep, &alenp, &indp);
|
296
|
-
break;
|
297
|
-
default:
|
298
|
-
rb_bug("ruby-oci8: expect OCI_PARAM_IN or OCI_PARAM_OUT but %d", in_out);
|
299
|
-
}
|
300
|
-
oci_lc(OCIStmtSetPieceInfo(obind->base.hp.ptr, OCI_HTYPE_BIND, oci8_errhp, valuep, alenp, 0, indp, NULL));
|
301
|
-
break;
|
302
|
-
}
|
303
|
-
obind = (oci8_bind_t*)obind->base.next;
|
304
|
-
} while (obind != (oci8_bind_t*)stmt->base.children);
|
305
|
-
if (obind == (oci8_bind_t*)stmt) {
|
306
|
-
rb_bug("ruby-oci8: No bind handle is found.");
|
307
|
-
}
|
308
|
-
rv = oci8_call_stmt_execute(svcctx, stmt, iters, mode);
|
309
|
-
}
|
310
|
-
#endif /* USE_DYNAMIC_FETCH */
|
311
|
-
if (IS_OCI_ERROR(rv)) {
|
312
|
-
oci8_raise(oci8_errhp, rv, stmt->base.hp.stmt);
|
313
|
-
}
|
234
|
+
chker3(oci8_call_stmt_execute(svcctx, stmt, iters, mode),
|
235
|
+
&stmt->base, stmt->base.hp.stmt);
|
314
236
|
return self;
|
315
237
|
}
|
316
238
|
|
@@ -346,93 +268,25 @@ static VALUE oci8_stmt_do_fetch(oci8_stmt_t *stmt, oci8_svcctx_t *svcctx)
|
|
346
268
|
sword rv;
|
347
269
|
long idx;
|
348
270
|
oci8_bind_t *obind;
|
349
|
-
const
|
271
|
+
const oci8_bind_vtable_t *vptr;
|
350
272
|
|
351
273
|
if (stmt->base.children != NULL) {
|
352
274
|
obind = (oci8_bind_t *)stmt->base.children;
|
353
275
|
do {
|
354
276
|
if (obind->base.type == OCI_HTYPE_DEFINE) {
|
355
|
-
|
356
|
-
if (
|
357
|
-
|
277
|
+
vptr = (const oci8_bind_vtable_t *)obind->base.vptr;
|
278
|
+
if (vptr->pre_fetch_hook != NULL) {
|
279
|
+
vptr->pre_fetch_hook(obind, stmt->svc);
|
358
280
|
}
|
359
281
|
}
|
360
282
|
obind = (oci8_bind_t *)obind->base.next;
|
361
283
|
} while (obind != (oci8_bind_t*)stmt->base.children);
|
362
284
|
}
|
363
285
|
rv = OCIStmtFetch_nb(svcctx, stmt->base.hp.stmt, oci8_errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
|
364
|
-
#ifdef USE_DYNAMIC_FETCH
|
365
|
-
while (rv == OCI_NEED_DATA) {
|
366
|
-
/* get piece info. */
|
367
|
-
dvoid *hp;
|
368
|
-
ub4 type;
|
369
|
-
ub1 in_out;
|
370
|
-
ub4 iter;
|
371
|
-
ub4 idx;
|
372
|
-
ub1 piece;
|
373
|
-
/* set piece info. */
|
374
|
-
void *valuep;
|
375
|
-
ub4 *alenp;
|
376
|
-
void *indp;
|
377
|
-
|
378
|
-
oci_lc(OCIStmtGetPieceInfo(stmt->base.hp.ptr, oci8_errhp, &hp, &type, &in_out, &iter, &idx, &piece));
|
379
|
-
obind = (oci8_bind_t *)stmt->base.children;
|
380
|
-
do {
|
381
|
-
if (obind->base.hp.ptr == hp) {
|
382
|
-
if (type != OCI_HTYPE_DEFINE)
|
383
|
-
rb_bug("ruby-oci8: expect OCI_HTYPE_DEFINE but %d", type);
|
384
|
-
bind_class = (const oci8_bind_class_t *)obind->base.klass;
|
385
|
-
switch (in_out) {
|
386
|
-
case OCI_PARAM_OUT:
|
387
|
-
if (bind_class->out == NULL)
|
388
|
-
rb_bug("....");
|
389
|
-
bind_class->out(obind, idx, piece, &valuep, &alenp, &indp);
|
390
|
-
break;
|
391
|
-
default:
|
392
|
-
rb_bug("ruby-oci8: expect OCI_PARAM_OUT but %d", in_out);
|
393
|
-
}
|
394
|
-
oci_lc(OCIStmtSetPieceInfo(obind->base.hp.ptr, OCI_HTYPE_DEFINE, oci8_errhp, valuep, alenp, 0, indp, NULL));
|
395
|
-
break;
|
396
|
-
}
|
397
|
-
obind = (oci8_bind_t *)obind->base.next;
|
398
|
-
} while (obind != (oci8_bind_t*)stmt->base.children);
|
399
|
-
if (obind == (oci8_bind_t*)stmt) {
|
400
|
-
rb_bug("ruby-oci8: No define handle is found.");
|
401
|
-
}
|
402
|
-
rv = OCIStmtFetch_nb(svcctx, stmt->base.hp.stmt, oci8_errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
|
403
|
-
}
|
404
|
-
#endif /* USE_DYNAMIC_FETCH */
|
405
286
|
if (rv == OCI_NO_DATA) {
|
406
287
|
return Qnil;
|
407
288
|
}
|
408
|
-
|
409
|
-
oci8_raise(oci8_errhp, rv, stmt->base.hp.stmt);
|
410
|
-
}
|
411
|
-
#ifdef USE_DYNAMIC_FETCH
|
412
|
-
obind = (oci8_bind_t *)stmt->base.children;
|
413
|
-
do {
|
414
|
-
/* set piece info. */
|
415
|
-
void *valuep;
|
416
|
-
ub4 *alenp;
|
417
|
-
void *indp;
|
418
|
-
ub1 piece = OCI_LAST_PIECE;
|
419
|
-
|
420
|
-
if (obind->base.type == OCI_HTYPE_DEFINE) {
|
421
|
-
bind_class = (const oci8_bind_class_t *)obind->base.klass;
|
422
|
-
if (bind_class->out != NULL) {
|
423
|
-
if (obind->maxar_sz == 0) {
|
424
|
-
bind_class->out(obind, 0, piece, &valuep, &alenp, &indp);
|
425
|
-
} else {
|
426
|
-
ub4 idx;
|
427
|
-
for (idx = 0; idx < obind->curar_sz; idx++) {
|
428
|
-
bind_class->out(obind, idx, piece, &valuep, &alenp, &indp);
|
429
|
-
}
|
430
|
-
}
|
431
|
-
}
|
432
|
-
}
|
433
|
-
obind = (oci8_bind_t *)obind->base.next;
|
434
|
-
} while (obind != (oci8_bind_t*)stmt->base.children);
|
435
|
-
#endif /* USE_DYNAMIC_FETCH */
|
289
|
+
chker3(rv, &svcctx->base, stmt->base.hp.stmt);
|
436
290
|
ary = rb_ary_new2(RARRAY_LEN(stmt->defns));
|
437
291
|
for (idx = 0; idx < RARRAY_LEN(stmt->defns); idx++) {
|
438
292
|
rb_ary_store(ary, idx, oci8_bind_get_data(RARRAY_PTR(stmt->defns)[idx]));
|
@@ -479,7 +333,7 @@ static VALUE oci8_stmt_get_param(VALUE self, VALUE pos)
|
|
479
333
|
Check_Type(pos, T_FIXNUM); /* 1 */
|
480
334
|
rv = OCIParamGet(stmt->base.hp.stmt, OCI_HTYPE_STMT, oci8_errhp, (dvoid *)&parmhp, FIX2INT(pos));
|
481
335
|
if (rv != OCI_SUCCESS) {
|
482
|
-
|
336
|
+
chker3(rv, &stmt->base, stmt->base.hp.stmt);
|
483
337
|
}
|
484
338
|
return oci8_metadata_create(parmhp, stmt->svc, self);
|
485
339
|
}
|
@@ -504,7 +358,8 @@ static VALUE oci8_stmt_get_param(VALUE self, VALUE pos)
|
|
504
358
|
*/
|
505
359
|
static VALUE oci8_stmt_get_stmt_type(VALUE self)
|
506
360
|
{
|
507
|
-
|
361
|
+
oci8_base_t *base = oci8_get_handle(self, cOCIStmt);
|
362
|
+
VALUE stmt_type = oci8_get_ub2_attr(base, OCI_ATTR_STMT_TYPE, base->hp.stmt);
|
508
363
|
switch (FIX2INT(stmt_type)) {
|
509
364
|
case OCI_STMT_SELECT:
|
510
365
|
return oci8_sym_select_stmt;
|
@@ -534,7 +389,8 @@ static VALUE oci8_stmt_get_stmt_type(VALUE self)
|
|
534
389
|
*/
|
535
390
|
static VALUE oci8_stmt_get_row_count(VALUE self)
|
536
391
|
{
|
537
|
-
|
392
|
+
oci8_base_t *base = oci8_get_handle(self, cOCIStmt);
|
393
|
+
return oci8_get_ub4_attr(base, OCI_ATTR_ROW_COUNT, base->hp.stmt);
|
538
394
|
}
|
539
395
|
|
540
396
|
/*
|
@@ -553,12 +409,14 @@ static VALUE oci8_stmt_get_row_count(VALUE self)
|
|
553
409
|
*/
|
554
410
|
static VALUE oci8_stmt_get_rowid(VALUE self)
|
555
411
|
{
|
556
|
-
|
412
|
+
oci8_base_t *base = oci8_get_handle(self, cOCIStmt);
|
413
|
+
return oci8_get_rowid_attr(base, OCI_ATTR_ROWID, base->hp.stmt);
|
557
414
|
}
|
558
415
|
|
559
416
|
static VALUE oci8_stmt_get_param_count(VALUE self)
|
560
417
|
{
|
561
|
-
|
418
|
+
oci8_base_t *base = oci8_get_handle(self, cOCIStmt);
|
419
|
+
return oci8_get_ub4_attr(base, OCI_ATTR_PARAM_COUNT, base->hp.stmt);
|
562
420
|
}
|
563
421
|
|
564
422
|
/*
|
@@ -702,7 +560,8 @@ static VALUE oci8_stmt_set_prefetch_rows(VALUE self, VALUE rows)
|
|
702
560
|
oci8_stmt_t *stmt = TO_STMT(self);
|
703
561
|
ub4 num = NUM2UINT(rows);
|
704
562
|
|
705
|
-
|
563
|
+
chker2(OCIAttrSet(stmt->base.hp.ptr, OCI_HTYPE_STMT, &num, 0, OCI_ATTR_PREFETCH_ROWS, oci8_errhp),
|
564
|
+
&stmt->base);
|
706
565
|
return Qfalse;
|
707
566
|
}
|
708
567
|
|
@@ -746,7 +605,7 @@ static void bind_stmt_init_elem(oci8_bind_t *obind, VALUE svc)
|
|
746
605
|
} while (++idx < obind->maxar_sz);
|
747
606
|
}
|
748
607
|
|
749
|
-
static const
|
608
|
+
static const oci8_bind_vtable_t bind_stmt_vtable = {
|
750
609
|
{
|
751
610
|
oci8_bind_hp_obj_mark,
|
752
611
|
oci8_bind_free,
|
@@ -756,8 +615,6 @@ static const oci8_bind_class_t bind_stmt_class = {
|
|
756
615
|
bind_stmt_set,
|
757
616
|
bind_stmt_init,
|
758
617
|
bind_stmt_init_elem,
|
759
|
-
NULL,
|
760
|
-
NULL,
|
761
618
|
bind_stmt_init_elem,
|
762
619
|
SQLT_RSET
|
763
620
|
};
|
@@ -769,7 +626,7 @@ void Init_oci8_stmt(VALUE cOCI8)
|
|
769
626
|
cOCI8 = rb_define_class("OCI8", cOCIHandle);
|
770
627
|
cOCIStmt = rb_define_class_under(cOCI8, "Cursor", cOCIHandle);
|
771
628
|
#endif
|
772
|
-
cOCIStmt = oci8_define_class_under(cOCI8, "Cursor", &
|
629
|
+
cOCIStmt = oci8_define_class_under(cOCI8, "Cursor", &oci8_stmt_vtable);
|
773
630
|
|
774
631
|
oci8_sym_select_stmt = ID2SYM(rb_intern("select_stmt"));
|
775
632
|
oci8_sym_update_stmt = ID2SYM(rb_intern("update_stmt"));
|
@@ -806,5 +663,5 @@ void Init_oci8_stmt(VALUE cOCI8)
|
|
806
663
|
rb_define_private_method(cOCIStmt, "__defined?", oci8_stmt_defined_p, 1);
|
807
664
|
rb_define_method(cOCIStmt, "prefetch_rows=", oci8_stmt_set_prefetch_rows, 1);
|
808
665
|
|
809
|
-
oci8_define_bind_class("Cursor", &
|
666
|
+
oci8_define_bind_class("Cursor", &bind_stmt_vtable);
|
810
667
|
}
|