ruby-oci8 2.1.0 → 2.1.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/.yardopts +13 -0
- data/ChangeLog +104 -0
- data/NEWS +337 -235
- data/README.md +38 -0
- data/VERSION +1 -1
- data/dist-files +7 -6
- data/docs/install-binary-package.md +40 -0
- data/docs/install-full-client.md +116 -0
- data/docs/install-instant-client.md +167 -0
- data/docs/platform-specific-issues.md +209 -0
- data/docs/report-installation-issue.md +50 -0
- data/ext/oci8/apiwrap.yml +37 -14
- data/ext/oci8/error.c +26 -11
- data/ext/oci8/extconf.rb +19 -3
- data/ext/oci8/lob.c +287 -0
- data/ext/oci8/oci8.c +15 -9
- data/ext/oci8/oci8.h +8 -0
- data/ext/oci8/oci8lib.c +7 -2
- data/ext/oci8/ocihandle.c +209 -99
- data/ext/oci8/ocinumber.c +430 -147
- data/ext/oci8/oradate.c +92 -75
- data/ext/oci8/stmt.c +30 -12
- data/ext/oci8/win32.c +22 -0
- data/lib/oci8/bindtype.rb +1 -0
- data/lib/oci8/connection_pool.rb +1 -0
- data/lib/oci8/encoding-init.rb +1 -0
- data/lib/oci8/object.rb +29 -4
- data/lib/oci8/oci8.rb +75 -17
- data/lib/oci8/ocihandle.rb +192 -12
- data/lib/oci8/oracle_version.rb +47 -41
- data/lib/oci8/properties.rb +19 -0
- data/pre-distclean.rb +2 -2
- data/ruby-oci8.gemspec +7 -3
- data/test/config.rb +1 -6
- data/test/test_datetime.rb +70 -32
- data/test/test_oci8.rb +8 -2
- metadata +35 -53
- data/README +0 -5
- data/doc/api.en.html +0 -527
- data/doc/api.en.rd +0 -554
- data/doc/api.ja.html +0 -525
- data/doc/api.ja.rd +0 -557
- data/doc/manual.css +0 -35
data/lib/oci8/oracle_version.rb
CHANGED
@@ -2,14 +2,16 @@
|
|
2
2
|
#
|
3
3
|
# Copyright (C) 2009 KUBO Takehiro <kubo@jiubao.org>
|
4
4
|
|
5
|
-
|
6
|
-
|
5
|
+
#
|
7
6
|
class OCI8
|
8
7
|
|
9
|
-
#
|
8
|
+
# The data class, representing Oracle version.
|
10
9
|
#
|
11
10
|
# Oracle version is represented by five numbers:
|
12
11
|
# *major*, *minor*, *update*, *patch* and *port_update*.
|
12
|
+
#
|
13
|
+
# @see OCI8.oracle_client_version
|
14
|
+
# @see OCI8#oracle_server_version
|
13
15
|
class OracleVersion
|
14
16
|
include Comparable
|
15
17
|
|
@@ -24,7 +26,7 @@ class OCI8
|
|
24
26
|
# The fourth part of the Oracle version.
|
25
27
|
attr_reader :port_update
|
26
28
|
|
27
|
-
# Creates
|
29
|
+
# Creates an OCI8::OracleVersion object.
|
28
30
|
#
|
29
31
|
# If the first argument _arg_ is a String, it is parsed as dotted
|
30
32
|
# version string. If it is bigger than 0x08000000, it is parsed as
|
@@ -33,20 +35,32 @@ class OCI8
|
|
33
35
|
# patch and port_update. Unspecified version numbers are zeros by
|
34
36
|
# default.
|
35
37
|
#
|
36
|
-
#
|
37
|
-
#
|
38
|
-
# oraver
|
38
|
+
# @example
|
39
|
+
# # When the first argument is a String,
|
40
|
+
# oraver = OCI8::OracleVersion.new('11.2.0.3')
|
41
|
+
# oraver.major # => 11
|
42
|
+
# oraver.minor # => 2
|
43
|
+
# oraver.update # => 0
|
44
|
+
# oraver.patch # => 3
|
45
|
+
# oraver.port_update # => 0
|
46
|
+
#
|
47
|
+
# # When the first argument is bigger than 0x08000000,
|
48
|
+
# oraver = OCI8::OracleVersion.new(0x0b200300)
|
49
|
+
# oraver.major # => 11
|
39
50
|
# oraver.minor # => 2
|
40
51
|
# oraver.update # => 0
|
41
|
-
# oraver.patch # =>
|
52
|
+
# oraver.patch # => 3
|
42
53
|
# oraver.port_update # => 0
|
43
54
|
#
|
44
|
-
#
|
45
|
-
# oraver.
|
55
|
+
# # Otherwise,
|
56
|
+
# oraver = OCI8::OracleVersion.new(11, 2, 0, 3)
|
57
|
+
# oraver.major # => 11
|
46
58
|
# oraver.minor # => 2
|
47
59
|
# oraver.update # => 0
|
48
|
-
# oraver.patch # =>
|
60
|
+
# oraver.patch # => 3
|
49
61
|
# oraver.port_update # => 0
|
62
|
+
#
|
63
|
+
# @return [OCI8::OracleVersion]
|
50
64
|
def initialize(arg, minor = nil, update = nil, patch = nil, port_update = nil)
|
51
65
|
if arg.is_a? String
|
52
66
|
major, minor, update, patch, port_update = arg.split('.').collect do |v|
|
@@ -68,13 +82,12 @@ class OCI8
|
|
68
82
|
@port_update = port_update || 0
|
69
83
|
end
|
70
84
|
|
71
|
-
#
|
72
|
-
# oraver <=> other_oraver -> -1, 0, +1
|
73
|
-
#
|
74
|
-
# Compares +oraver+ and +other_oraver+.
|
85
|
+
# Compares +self+ and +other+.
|
75
86
|
#
|
76
87
|
# <=> is the basis for the methods <, <=, ==, >, >=, and between?,
|
77
|
-
# included from
|
88
|
+
# included from the Comparable module.
|
89
|
+
#
|
90
|
+
# @return [-1, 0, +1]
|
78
91
|
def <=>(other)
|
79
92
|
cmp = @major <=> other.major
|
80
93
|
return cmp if cmp != 0
|
@@ -87,57 +100,50 @@ class OCI8
|
|
87
100
|
@port_update <=> other.port_update
|
88
101
|
end
|
89
102
|
|
90
|
-
# :call-seq:
|
91
|
-
# oraver.to_i -> integer
|
92
|
-
#
|
93
103
|
# Returns an integer number contains 5-digit Oracle version.
|
94
104
|
#
|
95
105
|
# If the hexadecimal notation is 0xAABCCDEE, *major*, *minor*,
|
96
106
|
# *update*, *patch* and *port_update* are 0xAA, 0xB, 0xCC, 0xD and
|
97
107
|
# 0xEE respectively.
|
98
108
|
#
|
99
|
-
#
|
100
|
-
# oraver = OCI8::OracleVersion.new('
|
101
|
-
# oraver.to_i # =>
|
102
|
-
# '%08x' % oraver.to_i # => "
|
109
|
+
# @example
|
110
|
+
# oraver = OCI8::OracleVersion.new('11.2.0.3')
|
111
|
+
# oraver.to_i # => 186647296
|
112
|
+
# '%08x' % oraver.to_i # => "0b200300"
|
113
|
+
#
|
114
|
+
# @return [Integer]
|
103
115
|
def to_i
|
104
116
|
(@major << 24) | (@minor << 20) | (@update << 12) | (@patch << 8) | @port_update
|
105
117
|
end
|
106
118
|
|
107
|
-
# :call-seq:
|
108
|
-
# oraver.to_s -> string
|
109
|
-
#
|
110
119
|
# Returns a dotted version string of the Oracle version.
|
111
120
|
#
|
112
|
-
#
|
113
|
-
# oraver = OCI8::OracleVersion.new('
|
114
|
-
# oraver.to_s # => '
|
121
|
+
# @example
|
122
|
+
# oraver = OCI8::OracleVersion.new('11.2.0.3')
|
123
|
+
# oraver.to_s # => '11.2.0.3.0'
|
124
|
+
#
|
125
|
+
# @return [Integer]
|
115
126
|
def to_s
|
116
127
|
format('%d.%d.%d.%d.%d', @major, @minor, @update, @patch, @port_update)
|
117
128
|
end
|
118
129
|
|
119
|
-
#
|
120
|
-
# oraver.eql? other -> true or false
|
121
|
-
#
|
122
|
-
# Returns true if +oraver+ and +other+ are the same type and have
|
130
|
+
# Returns true if +self+ and +other+ are the same type and have
|
123
131
|
# equal values.
|
124
|
-
|
125
|
-
#
|
132
|
+
#
|
133
|
+
# @return [true or false]
|
126
134
|
def eql?(other)
|
127
135
|
other.is_a? OCI8::OracleVersion and (self <=> other) == 0
|
128
136
|
end
|
129
137
|
|
130
|
-
#
|
131
|
-
# oraver.hash -> integer
|
138
|
+
# Returns a hash based on the value of +self+.
|
132
139
|
#
|
133
|
-
#
|
134
|
-
#--
|
135
|
-
# This is for class Hash.
|
140
|
+
# @return [Integer]
|
136
141
|
def hash
|
137
142
|
to_i
|
138
143
|
end
|
139
144
|
|
140
|
-
|
145
|
+
# @private
|
146
|
+
def inspect
|
141
147
|
"#<#{self.class.to_s}: #{self.to_s}>"
|
142
148
|
end
|
143
149
|
end
|
data/lib/oci8/properties.rb
CHANGED
@@ -2,14 +2,20 @@
|
|
2
2
|
#
|
3
3
|
# Copyright (C) 2010-2011 KUBO Takehiro <kubo@jiubao.org>
|
4
4
|
|
5
|
+
#
|
5
6
|
class OCI8
|
6
7
|
|
7
8
|
@@properties = {
|
8
9
|
:length_semantics => :byte,
|
9
10
|
:bind_string_as_nchar => false,
|
10
11
|
:float_conversion_type => :ruby,
|
12
|
+
:statement_cache_size => 20,
|
11
13
|
}
|
12
14
|
|
15
|
+
if OCI8.oracle_client_version < OCI8::ORAVER_9_2
|
16
|
+
@@properties[:statement_cache_size] = nil
|
17
|
+
end
|
18
|
+
|
13
19
|
def @@properties.[](name)
|
14
20
|
raise IndexError, "No such property name: #{name}" unless @@properties.has_key?(name)
|
15
21
|
super(name)
|
@@ -27,6 +33,12 @@ class OCI8
|
|
27
33
|
when :float_conversion_type
|
28
34
|
# handled by native code in oci8lib_xx.so.
|
29
35
|
OCI8.__set_property(name, val)
|
36
|
+
when :statement_cache_size
|
37
|
+
if OCI8.oracle_client_version < OCI8::ORAVER_9_2
|
38
|
+
raise RuntimeError, ":statement_cache_size is disabled on Oracle 9iR1 client."
|
39
|
+
end
|
40
|
+
val = val.to_i
|
41
|
+
raise ArgumentError, "The property value for :statement_cache_size must not be negative." if val < 0
|
30
42
|
end
|
31
43
|
super(name, val)
|
32
44
|
end
|
@@ -74,6 +86,13 @@ class OCI8
|
|
74
86
|
# 15.700000000000001 by Float#to_s.
|
75
87
|
# See: http://rubyforge.org/forum/forum.php?thread_id=50030&forum_id=1078
|
76
88
|
#
|
89
|
+
# [:statement_cache_size]
|
90
|
+
# (new in 2.1.1)
|
91
|
+
#
|
92
|
+
# The statement cache size per each session. The default value is 20 statements.
|
93
|
+
# This feature is available on Oracle 9iR2 or later.
|
94
|
+
# See: http://docs.oracle.com/cd/E11882_01/appdev.112/e10646/oci09adv.htm#i471377
|
95
|
+
#
|
77
96
|
def self.properties
|
78
97
|
@@properties
|
79
98
|
end
|
data/pre-distclean.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
rm_f "#{curr_objdir}/lib/oci8.rb"
|
2
|
+
rm_f "#{curr_objdir}/ext/oci8/oci8lib_18.map"
|
3
|
+
rm_f "#{curr_objdir}/ext/oci8/oci8lib_191.map"
|
2
4
|
if RUBY_PLATFORM =~ /cygwin/
|
3
5
|
rm_f "#{curr_objdir}/ext/oci8/OCI.def"
|
4
6
|
rm_f "#{curr_objdir}/ext/oci8/libOCI.a"
|
5
|
-
else
|
6
|
-
rm_f "#{curr_objdir}/ext/oci8/oracle_objs.a"
|
7
7
|
end
|
data/ruby-oci8.gemspec
CHANGED
@@ -31,7 +31,7 @@ spec = Gem::Specification.new do |s|
|
|
31
31
|
s.description = <<EOS
|
32
32
|
ruby-oci8 is a ruby interface for Oracle using OCI8 API. It is available with Oracle8, Oracle8i, Oracle9i, Oracle10g and Oracle Instant Client.
|
33
33
|
EOS
|
34
|
-
s.has_rdoc =
|
34
|
+
s.has_rdoc = 'yard'
|
35
35
|
s.authors = ['KUBO Takehiro']
|
36
36
|
s.platform = gem_platform
|
37
37
|
files = File.read('dist-files').split("\n")
|
@@ -54,6 +54,10 @@ EOS
|
|
54
54
|
else
|
55
55
|
raise "No compiled binary are found. Run make in advance."
|
56
56
|
end
|
57
|
+
# add map files to analyze a core (minidump) file.
|
58
|
+
so_files << 'ext/oci8/oci8lib_18.map' if has_1_8 and File.exists? 'ext/oci8/oci8lib_18.map'
|
59
|
+
so_files << 'ext/oci8/oci8lib_191.map' if has_1_9_1 and File.exists? 'ext/oci8/oci8lib_191.map'
|
60
|
+
|
57
61
|
FileUtils.copy so_files, 'lib', :preserve => true
|
58
62
|
files.reject! do |fname|
|
59
63
|
fname =~ /^ext/
|
@@ -63,8 +67,8 @@ EOS
|
|
63
67
|
end
|
64
68
|
files << 'lib/oci8.rb'
|
65
69
|
end
|
70
|
+
s.require_paths = ['lib', 'ext/oci8']
|
66
71
|
s.files = files
|
67
72
|
s.test_files = 'test/test_all.rb'
|
68
|
-
s.
|
69
|
-
s.extra_rdoc_files = ['README']
|
73
|
+
s.extra_rdoc_files = ['README.md']
|
70
74
|
end
|
data/test/config.rb
CHANGED
@@ -13,12 +13,7 @@ ENV['ORA_NCHAR_LITERAL_REPLACE'] = 'TRUE' if OCI8.client_charset_name.include? '
|
|
13
13
|
nls_lang = ENV['NLS_LANG']
|
14
14
|
nls_lang = nls_lang.split('.')[1] unless nls_lang.nil?
|
15
15
|
nls_lang = nls_lang.upcase unless nls_lang.nil?
|
16
|
-
|
17
|
-
when 'JA16EUC'
|
18
|
-
$lobfile = File.dirname(__FILE__) + '/../doc/api.ja.rd' # EUC-JP file
|
19
|
-
else
|
20
|
-
$lobfile = File.dirname(__FILE__) + '/../doc/api.en.rd' # ASCII file
|
21
|
-
end
|
16
|
+
$lobfile = File.dirname(__FILE__) + '/../setup.rb'
|
22
17
|
$lobreadnum = 256 # counts in charactors
|
23
18
|
|
24
19
|
# don't modify below.
|
data/test/test_datetime.rb
CHANGED
@@ -13,15 +13,22 @@ class TestDateTime < Test::Unit::TestCase
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
@@time_new_accepts_timezone = begin
|
17
|
+
Time.new(2001, 1, 1, 0, 0, 0, '+00:00')
|
18
|
+
true
|
19
|
+
rescue
|
20
|
+
false
|
21
|
+
end
|
22
|
+
|
16
23
|
def string_to_time(str)
|
17
|
-
/(\d+)-(\d+)-(\d+) ?(?:(\d+):(\d+):(\d+))?(?:\.(\d+))? ?([+-]\d
|
24
|
+
/(\d+)-(\d+)-(\d+) ?(?:(\d+):(\d+):(\d+))?(?:\.(\d+))? ?(([+-])(\d+):(\d+))?/ =~ str
|
18
25
|
args = []
|
19
26
|
args << $1.to_i # year
|
20
27
|
args << $2.to_i # month
|
21
28
|
args << $3.to_i # day
|
22
29
|
args << $4.to_i if $4 # hour
|
23
30
|
args << $5.to_i if $5 # minute
|
24
|
-
if $8
|
31
|
+
if $8 and @@time_new_accepts_timezone
|
25
32
|
args << $6.to_i + $7.to_i.to_r / ('1' + '0' * ($7.length)).to_i
|
26
33
|
args << $8
|
27
34
|
Time.new(*args)
|
@@ -32,15 +39,37 @@ class TestDateTime < Test::Unit::TestCase
|
|
32
39
|
if $7
|
33
40
|
args << $7.to_i.to_r * 1000000 / ('1' + '0' * ($7.length)).to_i
|
34
41
|
end
|
35
|
-
|
36
|
-
|
42
|
+
if $8
|
43
|
+
# with time zone
|
44
|
+
offset = ($9 + '1').to_i * ($10.to_i * 60 + $11.to_i)
|
45
|
+
if offset == 0
|
46
|
+
Time.utc(*args)
|
47
|
+
else
|
48
|
+
tm = Time.local(*args)
|
49
|
+
raise "Failed to convert #{str} to Time" if tm.utc_offset != offset * 60
|
50
|
+
tm
|
51
|
+
end
|
52
|
+
else
|
53
|
+
# without time zone
|
54
|
+
Time.local(*args)
|
55
|
+
end
|
37
56
|
end
|
38
57
|
#Time.local(*str.split(/[- :\.]/).collect do |n| n.to_i; end)
|
39
58
|
end
|
40
59
|
|
60
|
+
def string_to_datetime(str)
|
61
|
+
/(\d+-\d+-\d+ ?(?:\d+:\d+:\d+)?(?:\.\d+)?) ?([+-]\d+:\d+)?/ =~ str
|
62
|
+
if $2
|
63
|
+
# with time zone
|
64
|
+
DateTime.parse(str)
|
65
|
+
else
|
66
|
+
tm = string_to_time(str)
|
67
|
+
DateTime.parse(str + timezone_string(*((tm.utc_offset / 60).divmod 60)))
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
41
71
|
def setup
|
42
72
|
@conn = get_oci8_connection
|
43
|
-
@local_timezone = timezone_string(*((::Time.now.utc_offset / 60).divmod 60))
|
44
73
|
end
|
45
74
|
|
46
75
|
def teardown
|
@@ -48,7 +77,8 @@ class TestDateTime < Test::Unit::TestCase
|
|
48
77
|
end
|
49
78
|
|
50
79
|
def test_date_select
|
51
|
-
['2005-
|
80
|
+
['2005-06-01 00:00:00',
|
81
|
+
'2005-12-31 23:59:59',
|
52
82
|
'2006-01-01 00:00:00'].each do |date|
|
53
83
|
@conn.exec(<<-EOS) do |row|
|
54
84
|
SELECT TO_DATE('#{date}', 'YYYY-MM-DD HH24:MI:SS') FROM dual
|
@@ -66,11 +96,12 @@ END;
|
|
66
96
|
EOS
|
67
97
|
cursor.bind_param(:out, nil, DateTime)
|
68
98
|
cursor.bind_param(:in, nil, String, 36)
|
69
|
-
['2005-
|
99
|
+
['2005-06-01 00:00:00',
|
100
|
+
'2005-12-31 23:59:59',
|
70
101
|
'2006-01-01 00:00:00'].each do |date|
|
71
102
|
cursor[:in] = date
|
72
103
|
cursor.exec
|
73
|
-
assert_equal(
|
104
|
+
assert_equal(string_to_datetime(date), cursor[:out])
|
74
105
|
end
|
75
106
|
cursor.close
|
76
107
|
end
|
@@ -86,9 +117,10 @@ END;
|
|
86
117
|
EOS
|
87
118
|
cursor.bind_param(:out, nil, String, 33)
|
88
119
|
cursor.bind_param(:in, nil, DateTime)
|
89
|
-
['2005-
|
120
|
+
['2005-06-01 00:00:00',
|
121
|
+
'2005-12-31 23:59:59',
|
90
122
|
'2006-01-01 00:00:00'].each do |date|
|
91
|
-
cursor[:in] =
|
123
|
+
cursor[:in] = string_to_datetime(date)
|
92
124
|
cursor.exec
|
93
125
|
assert_equal(date, cursor[:out])
|
94
126
|
end
|
@@ -96,7 +128,8 @@ EOS
|
|
96
128
|
end
|
97
129
|
|
98
130
|
def test_timestamp_select
|
99
|
-
['2005-
|
131
|
+
['2005-06-01 00:00:00.999999000',
|
132
|
+
'2005-12-31 23:59:59.999999000',
|
100
133
|
'2006-01-01 00:00:00.000000000'].each do |date|
|
101
134
|
@conn.exec(<<-EOS) do |row|
|
102
135
|
SELECT TO_TIMESTAMP('#{date}', 'YYYY-MM-DD HH24:MI:SS.FF') FROM dual
|
@@ -114,11 +147,12 @@ END;
|
|
114
147
|
EOS
|
115
148
|
cursor.bind_param(:out, nil, DateTime)
|
116
149
|
cursor.bind_param(:in, nil, String, 36)
|
117
|
-
['2005-
|
150
|
+
['2005-06-01 00:00:00.999999000',
|
151
|
+
'2005-12-31 23:59:59.999999000',
|
118
152
|
'2006-01-01 00:00:00.000000000'].each do |date|
|
119
153
|
cursor[:in] = date
|
120
154
|
cursor.exec
|
121
|
-
assert_equal(
|
155
|
+
assert_equal(string_to_datetime(date), cursor[:out])
|
122
156
|
end
|
123
157
|
cursor.close
|
124
158
|
end
|
@@ -131,9 +165,10 @@ END;
|
|
131
165
|
EOS
|
132
166
|
cursor.bind_param(:out, nil, String, 33)
|
133
167
|
cursor.bind_param(:in, nil, DateTime)
|
134
|
-
['2005-
|
168
|
+
['2005-06-01 00:00:00.999999000',
|
169
|
+
'2005-12-31 23:59:59.999999000',
|
135
170
|
'2006-01-01 00:00:00.000000000'].each do |date|
|
136
|
-
cursor[:in] =
|
171
|
+
cursor[:in] = string_to_datetime(date)
|
137
172
|
cursor.exec
|
138
173
|
assert_equal(date, cursor[:out])
|
139
174
|
end
|
@@ -141,7 +176,8 @@ EOS
|
|
141
176
|
end
|
142
177
|
|
143
178
|
def test_timestamp_tz_select
|
144
|
-
['2005-
|
179
|
+
['2005-06-01 00:00:00.999999000 +00:00',
|
180
|
+
'2005-12-31 23:59:59.999999000 +08:30',
|
145
181
|
'2006-01-01 00:00:00.000000000 -08:30'].each do |date|
|
146
182
|
@conn.exec(<<-EOS) do |row|
|
147
183
|
SELECT TO_TIMESTAMP_TZ('#{date}', 'YYYY-MM-DD HH24:MI:SS.FF TZH:TZM') FROM dual
|
@@ -149,7 +185,7 @@ EOS
|
|
149
185
|
expected_val = begin
|
150
186
|
string_to_time(date)
|
151
187
|
rescue
|
152
|
-
|
188
|
+
string_to_datetime(date)
|
153
189
|
end
|
154
190
|
assert_equal(expected_val, row[0])
|
155
191
|
end
|
@@ -164,11 +200,12 @@ END;
|
|
164
200
|
EOS
|
165
201
|
cursor.bind_param(:out, nil, DateTime)
|
166
202
|
cursor.bind_param(:in, nil, String, 36)
|
167
|
-
['2005-
|
168
|
-
'
|
203
|
+
['2005-06-01 00:00:00.999999000 -08:30',
|
204
|
+
'2005-12-31 23:59:59.999999000 +00:00',
|
205
|
+
'2006-01-01 00:00:00.000000000 +08:30'].each do |date|
|
169
206
|
cursor[:in] = date
|
170
207
|
cursor.exec
|
171
|
-
assert_equal(
|
208
|
+
assert_equal(string_to_datetime(date), cursor[:out])
|
172
209
|
end
|
173
210
|
cursor.close
|
174
211
|
end
|
@@ -181,9 +218,10 @@ END;
|
|
181
218
|
EOS
|
182
219
|
cursor.bind_param(:out, nil, String, 36)
|
183
220
|
cursor.bind_param(:in, nil, DateTime)
|
184
|
-
['2005-
|
185
|
-
'
|
186
|
-
|
221
|
+
['2005-06-01 00:00:00.999999999 +08:30',
|
222
|
+
'2005-12-31 23:59:59.999999000 -08:30',
|
223
|
+
'2006-01-01 00:00:00.000000000 +00:00'].each do |date|
|
224
|
+
cursor[:in] = string_to_datetime(date)
|
187
225
|
cursor.exec
|
188
226
|
assert_equal(date, cursor[:out])
|
189
227
|
end
|
@@ -201,48 +239,48 @@ EOS
|
|
201
239
|
def obj.day; 31; end
|
202
240
|
cursor[:in] = obj
|
203
241
|
cursor.exec
|
204
|
-
assert_equal(
|
242
|
+
assert_equal(string_to_datetime('2006-12-31 00:00:00'), cursor[:out])
|
205
243
|
# test hour
|
206
244
|
def obj.hour; 23; end
|
207
245
|
cursor[:in] = obj
|
208
246
|
cursor.exec
|
209
|
-
assert_equal(
|
247
|
+
assert_equal(string_to_datetime('2006-12-31 23:00:00'), cursor[:out])
|
210
248
|
# test min
|
211
249
|
def obj.min; 59; end
|
212
250
|
cursor[:in] = obj
|
213
251
|
cursor.exec
|
214
|
-
assert_equal(
|
252
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:00'), cursor[:out])
|
215
253
|
# test sec
|
216
254
|
def obj.sec; 59; end
|
217
255
|
cursor[:in] = obj
|
218
256
|
cursor.exec
|
219
|
-
assert_equal(
|
257
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59'), cursor[:out])
|
220
258
|
|
221
259
|
# test sec_fraction
|
222
260
|
def obj.sec_fraction; DateTime.parse('0001-01-01 00:00:00.000001').sec_fraction * 999999 ; end
|
223
261
|
cursor[:in] = obj
|
224
262
|
cursor.exec
|
225
|
-
assert_equal(
|
263
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999'), cursor[:out])
|
226
264
|
# test utc_offset (Time)
|
227
265
|
def obj.utc_offset; @utc_offset; end
|
228
266
|
obj.instance_variable_set(:@utc_offset, 9 * 60 * 60)
|
229
267
|
cursor[:in] = obj
|
230
268
|
cursor.exec
|
231
|
-
assert_equal(
|
269
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 +09:00'), cursor[:out])
|
232
270
|
obj.instance_variable_set(:@utc_offset, -5 * 60 * 60)
|
233
271
|
cursor[:in] = obj
|
234
272
|
cursor.exec
|
235
|
-
assert_equal(
|
273
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 -05:00'), cursor[:out])
|
236
274
|
# test offset (DateTime)
|
237
275
|
def obj.offset; @offset; end
|
238
276
|
obj.instance_variable_set(:@offset, 9.to_r / 24)
|
239
277
|
cursor[:in] = obj
|
240
278
|
cursor.exec
|
241
|
-
assert_equal(
|
279
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 +09:00'), cursor[:out])
|
242
280
|
obj.instance_variable_set(:@offset, -5.to_r / 24)
|
243
281
|
cursor[:in] = obj
|
244
282
|
cursor.exec
|
245
|
-
assert_equal(
|
283
|
+
assert_equal(string_to_datetime('2006-12-31 23:59:59.999999 -05:00'), cursor[:out])
|
246
284
|
end
|
247
285
|
|
248
286
|
def test_timezone
|