ruby-plsql 0.6.0 → 0.7.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.
- checksums.yaml +5 -5
- data/.codeclimate.yml +30 -0
- data/.github/stale.yml +37 -0
- data/.rubocop.yml +153 -0
- data/.travis.yml +20 -6
- data/.travis/oracle/download.sh +9 -10
- data/.travis/oracle/install.sh +6 -6
- data/Gemfile +13 -9
- data/History.txt +26 -0
- data/README.md +9 -5
- data/Rakefile +31 -26
- data/VERSION +1 -1
- data/Vagrantfile +2 -2
- data/gemfiles/Gemfile.activerecord-5.0 +21 -0
- data/gemfiles/Gemfile.activerecord-5.1 +21 -0
- data/gemfiles/Gemfile.activerecord-5.2 +21 -0
- data/lib/plsql/connection.rb +16 -18
- data/lib/plsql/helpers.rb +1 -3
- data/lib/plsql/jdbc_connection.rb +66 -61
- data/lib/plsql/oci8_patches.rb +2 -2
- data/lib/plsql/oci_connection.rb +51 -69
- data/lib/plsql/package.rb +5 -8
- data/lib/plsql/procedure.rb +75 -78
- data/lib/plsql/procedure_call.rb +498 -501
- data/lib/plsql/schema.rb +95 -100
- data/lib/plsql/sequence.rb +10 -13
- data/lib/plsql/sql_statements.rb +9 -11
- data/lib/plsql/table.rb +59 -63
- data/lib/plsql/type.rb +71 -76
- data/lib/plsql/variable.rb +89 -94
- data/lib/plsql/version.rb +1 -1
- data/lib/plsql/view.rb +16 -19
- data/ruby-plsql.gemspec +41 -37
- data/spec/plsql/connection_spec.rb +67 -67
- data/spec/plsql/package_spec.rb +15 -15
- data/spec/plsql/procedure_spec.rb +286 -233
- data/spec/plsql/schema_spec.rb +22 -23
- data/spec/plsql/sequence_spec.rb +2 -2
- data/spec/plsql/sql_statements_spec.rb +5 -5
- data/spec/plsql/table_spec.rb +77 -77
- data/spec/plsql/type_spec.rb +23 -29
- data/spec/plsql/variable_spec.rb +59 -59
- data/spec/plsql/version_spec.rb +4 -4
- data/spec/plsql/view_spec.rb +42 -42
- data/spec/spec_helper.rb +37 -29
- data/spec/support/test_db.rb +12 -13
- metadata +44 -26
- data/.travis/oracle/LICENSE +0 -5
- data/.travis/oracle/README.md +0 -64
- data/.travis/oracle/download.js +0 -100
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.7.0
|
data/Vagrantfile
CHANGED
@@ -25,11 +25,11 @@ Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
|
|
25
25
|
config.vm.provision :shell, inline: "mkdir -p /opt/oracle"
|
26
26
|
config.vm.provision :shell, inline: "unzip -o -q -d /opt/oracle /vagrant/oracle-xe-11.2.0-1.0.x86_64.rpm.zip"
|
27
27
|
config.vm.provision :shell, inline: "cd /opt/oracle/Disk1 && rpm -ivh oracle-xe-11.2.0-1.0.x86_64.rpm"
|
28
|
-
config.vm.provision :shell, inline:
|
28
|
+
config.vm.provision :shell, inline: 'sed -i -E "s/<value required>/oracle/" /opt/oracle/Disk1/response/xe.rsp'
|
29
29
|
config.vm.provision :shell, inline: "/etc/init.d/oracle-xe configure responseFile=/opt/oracle/Disk1/response/xe.rsp >> /opt/oracle/XEsilentinstall.log"
|
30
30
|
config.vm.provision :shell, inline: ". /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh"
|
31
31
|
config.vm.provision :shell, inline: "touch /etc/profile.d/oracle_profile.sh && cat /u01/app/oracle/product/11.2.0/xe/bin/oracle_env.sh >> /etc/profile.d/oracle_profile.sh"
|
32
|
-
config.vm.provision :shell, inline:
|
32
|
+
config.vm.provision :shell, inline: 'sed -i -E "s/HOST = [^)]+/HOST = $HOSTNAME/g" /u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora'
|
33
33
|
config.vm.provision :shell, inline: %q{sed -i -E "s/<ORACLE_BASE>/\/u01\/app\/oracle/" /u01/app/oracle/product/11.2.0/xe/dbs/init.ora}
|
34
34
|
|
35
35
|
# Change password for Oracle user
|
@@ -0,0 +1,21 @@
|
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
group :development do
|
4
|
+
gem 'juwelier', '~> 2.0'
|
5
|
+
gem 'rspec_junit_formatter'
|
6
|
+
end
|
7
|
+
|
8
|
+
group :test, :development do
|
9
|
+
gem 'rake', '>= 10.0'
|
10
|
+
gem 'rspec', '~> 3.1'
|
11
|
+
|
12
|
+
unless ENV['NO_ACTIVERECORD']
|
13
|
+
gem 'activerecord', '~> 5.0.0'
|
14
|
+
gem 'activerecord-oracle_enhanced-adapter', '~> 1.7.0'
|
15
|
+
gem 'simplecov', '>= 0'
|
16
|
+
end
|
17
|
+
|
18
|
+
platforms :ruby, :mswin, :mingw do
|
19
|
+
gem 'ruby-oci8', '~> 2.1'
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
group :development do
|
4
|
+
gem 'juwelier', '~> 2.0'
|
5
|
+
gem 'rspec_junit_formatter'
|
6
|
+
end
|
7
|
+
|
8
|
+
group :test, :development do
|
9
|
+
gem 'rake', '>= 10.0'
|
10
|
+
gem 'rspec', '~> 3.1'
|
11
|
+
|
12
|
+
unless ENV['NO_ACTIVERECORD']
|
13
|
+
gem 'activerecord', '~> 5.1.0'
|
14
|
+
gem 'activerecord-oracle_enhanced-adapter', '~> 1.8.0'
|
15
|
+
gem 'simplecov', '>= 0'
|
16
|
+
end
|
17
|
+
|
18
|
+
platforms :ruby, :mswin, :mingw do
|
19
|
+
gem 'ruby-oci8', '~> 2.1'
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
source 'http://rubygems.org'
|
2
|
+
|
3
|
+
group :development do
|
4
|
+
gem 'juwelier', '~> 2.0'
|
5
|
+
gem 'rspec_junit_formatter'
|
6
|
+
end
|
7
|
+
|
8
|
+
group :test, :development do
|
9
|
+
gem 'rake', '>= 10.0'
|
10
|
+
gem 'rspec', '~> 3.1'
|
11
|
+
|
12
|
+
unless ENV['NO_ACTIVERECORD']
|
13
|
+
gem 'activerecord', '~> 5.2.0.beta'
|
14
|
+
gem 'activerecord-oracle_enhanced-adapter', '~> 5.2.0.beta'
|
15
|
+
gem 'simplecov', '>= 0'
|
16
|
+
end
|
17
|
+
|
18
|
+
platforms :ruby, :mswin, :mingw do
|
19
|
+
gem 'ruby-oci8', '~> 2.1'
|
20
|
+
end
|
21
|
+
end
|
data/lib/plsql/connection.rb
CHANGED
@@ -25,14 +25,14 @@ module PLSQL
|
|
25
25
|
|
26
26
|
def self.create_new(params) #:nodoc:
|
27
27
|
conn = case driver_type
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
when :oci
|
29
|
+
OCIConnection.create_raw(params)
|
30
|
+
when :jdbc
|
31
|
+
JDBCConnection.create_raw(params)
|
32
|
+
else
|
33
|
+
raise ArgumentError, "Unknown raw driver"
|
34
34
|
end
|
35
|
-
conn.set_time_zone(params[:time_zone]||ENV[
|
35
|
+
conn.set_time_zone(params[:time_zone] || ENV["ORA_SDTZ"])
|
36
36
|
conn
|
37
37
|
end
|
38
38
|
|
@@ -66,7 +66,7 @@ module PLSQL
|
|
66
66
|
def jdbc?
|
67
67
|
@raw_driver == :jdbc
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
def logoff #:nodoc:
|
71
71
|
# Rollback any uncommited transactions
|
72
72
|
rollback
|
@@ -99,14 +99,14 @@ module PLSQL
|
|
99
99
|
end
|
100
100
|
|
101
101
|
def select_first(sql, *bindvars) #:nodoc:
|
102
|
-
cursor = cursor_from_query(sql, bindvars, :
|
102
|
+
cursor = cursor_from_query(sql, bindvars, prefetch_rows: 1)
|
103
103
|
cursor.fetch
|
104
104
|
ensure
|
105
105
|
cursor.close rescue nil
|
106
106
|
end
|
107
107
|
|
108
108
|
def select_hash_first(sql, *bindvars) #:nodoc:
|
109
|
-
cursor = cursor_from_query(sql, bindvars, :
|
109
|
+
cursor = cursor_from_query(sql, bindvars, prefetch_rows: 1)
|
110
110
|
cursor.fetch_hash
|
111
111
|
ensure
|
112
112
|
cursor.close rescue nil
|
@@ -183,7 +183,7 @@ module PLSQL
|
|
183
183
|
# this implementation is overriden in OCI connection with faster native OCI method
|
184
184
|
def describe_synonym(schema_name, synonym_name) #:nodoc:
|
185
185
|
select_first(
|
186
|
-
|
186
|
+
"SELECT table_owner, table_name FROM all_synonyms WHERE owner = :owner AND synonym_name = :synonym_name",
|
187
187
|
schema_name.to_s.upcase, synonym_name.to_s.upcase)
|
188
188
|
end
|
189
189
|
|
@@ -198,7 +198,7 @@ module PLSQL
|
|
198
198
|
end
|
199
199
|
|
200
200
|
# Set time zone
|
201
|
-
def set_time_zone(time_zone=nil)
|
201
|
+
def set_time_zone(time_zone = nil)
|
202
202
|
exec("alter session set time_zone = '#{time_zone}'") if time_zone
|
203
203
|
end
|
204
204
|
|
@@ -207,12 +207,12 @@ module PLSQL
|
|
207
207
|
select_first("SELECT SESSIONTIMEZONE FROM dual")[0]
|
208
208
|
end
|
209
209
|
|
210
|
-
RUBY_TEMP_TABLE_PREFIX =
|
210
|
+
RUBY_TEMP_TABLE_PREFIX = "ruby_"
|
211
211
|
|
212
212
|
# Drop all ruby temporary tables that are used for calling packages with table parameter types defined in packages
|
213
213
|
def drop_all_ruby_temporary_tables
|
214
214
|
select_all("SELECT table_name FROM user_tables WHERE temporary='Y' AND table_name LIKE :table_name",
|
215
|
-
RUBY_TEMP_TABLE_PREFIX.upcase+
|
215
|
+
RUBY_TEMP_TABLE_PREFIX.upcase + "%").each do |row|
|
216
216
|
exec "TRUNCATE TABLE #{row[0]}"
|
217
217
|
exec "DROP TABLE #{row[0]}"
|
218
218
|
end
|
@@ -221,12 +221,10 @@ module PLSQL
|
|
221
221
|
# Drop ruby temporary tables created in current session that are used for calling packages with table parameter types defined in packages
|
222
222
|
def drop_session_ruby_temporary_tables
|
223
223
|
select_all("SELECT table_name FROM user_tables WHERE temporary='Y' AND table_name LIKE :table_name",
|
224
|
-
RUBY_TEMP_TABLE_PREFIX.upcase+"#{session_id}_%").each do |row|
|
224
|
+
RUBY_TEMP_TABLE_PREFIX.upcase + "#{session_id}_%").each do |row|
|
225
225
|
exec "TRUNCATE TABLE #{row[0]}"
|
226
226
|
exec "DROP TABLE #{row[0]}"
|
227
227
|
end
|
228
228
|
end
|
229
|
-
|
230
229
|
end
|
231
|
-
|
232
|
-
end
|
230
|
+
end
|
data/lib/plsql/helpers.rb
CHANGED
@@ -5,21 +5,31 @@ begin
|
|
5
5
|
# ojdbc6.jar or ojdbc5.jar file should be in JRUBY_HOME/lib or should be in ENV['PATH'] or load path
|
6
6
|
|
7
7
|
java_version = java.lang.System.getProperty("java.version")
|
8
|
-
|
9
|
-
|
10
|
-
elsif java_version
|
11
|
-
|
8
|
+
ojdbc_jars = if java_version =~ /^1.5/
|
9
|
+
%w(ojdbc5.jar)
|
10
|
+
elsif java_version =~ /^1.6/
|
11
|
+
%w(ojdbc6.jar)
|
12
|
+
elsif java_version >= "1.7"
|
13
|
+
# Oracle 11g client ojdbc6.jar is also compatible with Java 1.7
|
14
|
+
# Oracle 12c client provides new ojdbc7.jar
|
15
|
+
%w(ojdbc7.jar ojdbc6.jar)
|
12
16
|
else
|
13
|
-
|
17
|
+
[]
|
14
18
|
end
|
15
19
|
|
16
|
-
|
20
|
+
if ENV_JAVA["java.class.path"] !~ Regexp.new(ojdbc_jars.join("|"))
|
17
21
|
# On Unix environment variable should be PATH, on Windows it is sometimes Path
|
18
|
-
env_path = (ENV["PATH"] || ENV["Path"] ||
|
22
|
+
env_path = (ENV["PATH"] || ENV["Path"] || "").split(File::PATH_SEPARATOR)
|
19
23
|
# Look for JDBC driver at first in lib subdirectory (application specific JDBC file version)
|
20
24
|
# then in Ruby load path and finally in environment PATH
|
21
|
-
|
22
|
-
|
25
|
+
["./lib"].concat($LOAD_PATH).concat(env_path).detect do |dir|
|
26
|
+
# check any compatible JDBC driver in the priority order
|
27
|
+
ojdbc_jars.any? do |ojdbc_jar|
|
28
|
+
if File.exists?(file_path = File.join(dir, ojdbc_jar))
|
29
|
+
require file_path
|
30
|
+
true
|
31
|
+
end
|
32
|
+
end
|
23
33
|
end
|
24
34
|
end
|
25
35
|
|
@@ -32,15 +42,14 @@ begin
|
|
32
42
|
|
33
43
|
rescue LoadError, NameError
|
34
44
|
# JDBC driver is unavailable.
|
35
|
-
raise LoadError, "ERROR: ruby-plsql could not load Oracle JDBC driver. Please install #{
|
45
|
+
raise LoadError, "ERROR: ruby-plsql could not load Oracle JDBC driver. Please install #{ojdbc_jars.empty? ? "Oracle JDBC" : ojdbc_jars.join(' or ') } library."
|
36
46
|
end
|
37
47
|
|
38
48
|
module PLSQL
|
39
49
|
class JDBCConnection < Connection #:nodoc:
|
40
|
-
|
41
50
|
def self.create_raw(params)
|
42
51
|
database = params[:database]
|
43
|
-
url = if ENV[
|
52
|
+
url = if ENV["TNS_ADMIN"] && database && !params[:host] && !params[:url]
|
44
53
|
"jdbc:oracle:thin:@#{database}"
|
45
54
|
else
|
46
55
|
database = ":#{database}" unless database.match(/^(\:|\/)/)
|
@@ -49,7 +58,7 @@ module PLSQL
|
|
49
58
|
new(java.sql.DriverManager.getConnection(url, params[:username], params[:password]))
|
50
59
|
end
|
51
60
|
|
52
|
-
def set_time_zone(time_zone=nil)
|
61
|
+
def set_time_zone(time_zone = nil)
|
53
62
|
raw_connection.setSessionTimeZone(time_zone) if time_zone
|
54
63
|
end
|
55
64
|
|
@@ -90,7 +99,6 @@ module PLSQL
|
|
90
99
|
end
|
91
100
|
|
92
101
|
class CallableStatement #:nodoc:
|
93
|
-
|
94
102
|
def initialize(conn, sql)
|
95
103
|
@sql = sql
|
96
104
|
@connection = conn
|
@@ -107,11 +115,11 @@ module PLSQL
|
|
107
115
|
if metadata[:in_out] =~ /OUT/
|
108
116
|
@out_types[arg] = type || ora_value.class
|
109
117
|
@out_index[arg] = bind_param_index(arg)
|
110
|
-
if [
|
111
|
-
@statement.registerOutParameter(@out_index[arg], @connection.get_java_sql_type(ora_value,type),
|
118
|
+
if ["TABLE", "VARRAY", "OBJECT", "XMLTYPE"].include?(metadata[:data_type])
|
119
|
+
@statement.registerOutParameter(@out_index[arg], @connection.get_java_sql_type(ora_value, type),
|
112
120
|
metadata[:sql_type_name])
|
113
121
|
else
|
114
|
-
@statement.registerOutParameter(@out_index[arg]
|
122
|
+
@statement.registerOutParameter(@out_index[arg], @connection.get_java_sql_type(ora_value, type))
|
115
123
|
end
|
116
124
|
end
|
117
125
|
end
|
@@ -130,11 +138,11 @@ module PLSQL
|
|
130
138
|
|
131
139
|
private
|
132
140
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
141
|
+
def bind_param_index(key)
|
142
|
+
return key if key.kind_of? Integer
|
143
|
+
key = ":#{key.to_s}" unless key.to_s =~ /^:/
|
144
|
+
@params.index(key) + 1
|
145
|
+
end
|
138
146
|
end
|
139
147
|
|
140
148
|
class Cursor #:nodoc:
|
@@ -150,11 +158,11 @@ module PLSQL
|
|
150
158
|
@column_count = @metadata.getColumnCount
|
151
159
|
@column_type_names = [nil] # column numbering starts at 1
|
152
160
|
(1..@column_count).each do |i|
|
153
|
-
@column_type_names << {:
|
161
|
+
@column_type_names << { type_name: @metadata.getColumnTypeName(i), sql_type: @metadata.getColumnType(i) }
|
154
162
|
end
|
155
163
|
end
|
156
164
|
|
157
|
-
def self.new_from_query(conn, sql, bindvars=[], options={})
|
165
|
+
def self.new_from_query(conn, sql, bindvars = [], options = {})
|
158
166
|
stmt = conn.prepare_statement(sql, *bindvars)
|
159
167
|
if prefetch_rows = options[:prefetch_rows]
|
160
168
|
stmt.setRowPrefetch(prefetch_rows)
|
@@ -194,14 +202,14 @@ module PLSQL
|
|
194
202
|
CallableStatement.new(self, sql)
|
195
203
|
end
|
196
204
|
|
197
|
-
def cursor_from_query(sql, bindvars=[], options={})
|
205
|
+
def cursor_from_query(sql, bindvars = [], options = {})
|
198
206
|
Cursor.new_from_query(self, sql, bindvars, options)
|
199
207
|
end
|
200
208
|
|
201
209
|
def prepare_statement(sql, *bindvars)
|
202
210
|
stmt = raw_connection.prepareStatement(sql)
|
203
211
|
bindvars.each_with_index do |bv, i|
|
204
|
-
set_bind_variable(stmt, i+1, ruby_value_to_ora_value(bv))
|
212
|
+
set_bind_variable(stmt, i + 1, ruby_value_to_ora_value(bv))
|
205
213
|
end
|
206
214
|
stmt
|
207
215
|
end
|
@@ -209,7 +217,7 @@ module PLSQL
|
|
209
217
|
def prepare_call(sql, *bindvars)
|
210
218
|
stmt = raw_connection.prepareCall(sql)
|
211
219
|
bindvars.each_with_index do |bv, i|
|
212
|
-
set_bind_variable(stmt, i+1, bv)
|
220
|
+
set_bind_variable(stmt, i + 1, bv)
|
213
221
|
end
|
214
222
|
stmt
|
215
223
|
end
|
@@ -240,7 +248,7 @@ module PLSQL
|
|
240
248
|
java.sql.Types::NVARCHAR => String,
|
241
249
|
java.sql.Types::LONGVARCHAR => String,
|
242
250
|
java.sql.Types::NUMERIC => BigDecimal,
|
243
|
-
java.sql.Types::INTEGER =>
|
251
|
+
java.sql.Types::INTEGER => Integer,
|
244
252
|
java.sql.Types::DATE => Time,
|
245
253
|
java.sql.Types::TIMESTAMP => Time,
|
246
254
|
Java::oracle.jdbc.OracleTypes::TIMESTAMPTZ => Time,
|
@@ -256,8 +264,8 @@ module PLSQL
|
|
256
264
|
RUBY_CLASS_TO_SQL_TYPE[type || value.class] || java.sql.Types::VARCHAR
|
257
265
|
end
|
258
266
|
|
259
|
-
def set_bind_variable(stmt, i, value, type=nil, length=nil, metadata={})
|
260
|
-
key = i.kind_of?(Integer) ? nil : i.to_s.gsub(
|
267
|
+
def set_bind_variable(stmt, i, value, type = nil, length = nil, metadata = {})
|
268
|
+
key = i.kind_of?(Integer) ? nil : i.to_s.gsub(":", "")
|
261
269
|
type_symbol = (!value.nil? && type ? type : value.class).to_s.to_sym
|
262
270
|
case type_symbol
|
263
271
|
when :Fixnum, :Bignum, :Integer
|
@@ -277,10 +285,10 @@ module PLSQL
|
|
277
285
|
when :Time, :'Java::JavaSql::Timestamp'
|
278
286
|
stmt.send("setTimestamp#{key && "AtName"}", key || i, value)
|
279
287
|
when :NilClass
|
280
|
-
if [
|
288
|
+
if ["TABLE", "VARRAY", "OBJECT", "XMLTYPE"].include?(metadata[:data_type])
|
281
289
|
stmt.send("setNull#{key && "AtName"}", key || i, get_java_sql_type(value, type),
|
282
290
|
metadata[:sql_type_name])
|
283
|
-
elsif metadata[:data_type] ==
|
291
|
+
elsif metadata[:data_type] == "REF CURSOR"
|
284
292
|
# TODO: cannot bind NULL value to cursor parameter, getting error
|
285
293
|
# java.sql.SQLException: Unsupported feature: sqlType=-10
|
286
294
|
# Currently do nothing and assume that NULL values will not be passed to IN parameters
|
@@ -309,7 +317,7 @@ module PLSQL
|
|
309
317
|
stmt.getFloat(i)
|
310
318
|
when :BigDecimal
|
311
319
|
bd = stmt.getBigDecimal(i)
|
312
|
-
bd && BigDecimal
|
320
|
+
bd && BigDecimal(bd.to_s)
|
313
321
|
when :String
|
314
322
|
stmt.getString(i)
|
315
323
|
when :'Java::OracleSql::CLOB'
|
@@ -336,7 +344,6 @@ module PLSQL
|
|
336
344
|
end
|
337
345
|
|
338
346
|
def result_set_to_ruby_data_type(column_type, column_type_name)
|
339
|
-
|
340
347
|
end
|
341
348
|
|
342
349
|
def plsql_to_ruby_data_type(metadata)
|
@@ -351,7 +358,7 @@ module PLSQL
|
|
351
358
|
when "NUMBER"
|
352
359
|
[BigDecimal, nil]
|
353
360
|
when "NATURAL", "NATURALN", "POSITIVE", "POSITIVEN", "SIGNTYPE", "SIMPLE_INTEGER", "PLS_INTEGER", "BINARY_INTEGER"
|
354
|
-
[
|
361
|
+
[Integer, nil]
|
355
362
|
when "DATE"
|
356
363
|
[DateTime, nil]
|
357
364
|
when "TIMESTAMP", "TIMESTAMP WITH TIME ZONE", "TIMESTAMP WITH LOCAL TIME ZONE"
|
@@ -367,10 +374,10 @@ module PLSQL
|
|
367
374
|
end
|
368
375
|
end
|
369
376
|
|
370
|
-
def ruby_value_to_ora_value(value, type=nil, metadata={})
|
377
|
+
def ruby_value_to_ora_value(value, type = nil, metadata = {})
|
371
378
|
type ||= value.class
|
372
379
|
case type.to_s.to_sym
|
373
|
-
when :
|
380
|
+
when :Integer
|
374
381
|
value
|
375
382
|
when :String
|
376
383
|
value.to_s
|
@@ -419,9 +426,9 @@ module PLSQL
|
|
419
426
|
elem_list = value.map do |elem|
|
420
427
|
case elem_type
|
421
428
|
when Java::oracle.jdbc.OracleTypes::ARRAY
|
422
|
-
ruby_value_to_ora_value(elem, Java::OracleSql::ARRAY, :
|
429
|
+
ruby_value_to_ora_value(elem, Java::OracleSql::ARRAY, sql_type_name: elem_type_name)
|
423
430
|
when Java::oracle.jdbc.OracleTypes::STRUCT
|
424
|
-
ruby_value_to_ora_value(elem, Java::OracleSql::STRUCT, :
|
431
|
+
ruby_value_to_ora_value(elem, Java::OracleSql::STRUCT, sql_type_name: elem_type_name)
|
425
432
|
else
|
426
433
|
ruby_value_to_ora_value(elem)
|
427
434
|
end
|
@@ -435,7 +442,7 @@ module PLSQL
|
|
435
442
|
struct_metadata = descriptor.getMetaData
|
436
443
|
struct_fields = (1..descriptor.getLength).inject({}) do |hash, i|
|
437
444
|
hash[struct_metadata.getColumnName(i).downcase.to_sym] =
|
438
|
-
{:
|
445
|
+
{ type: struct_metadata.getColumnType(i), type_name: struct_metadata.getColumnTypeName(i) }
|
439
446
|
hash
|
440
447
|
end
|
441
448
|
object_attrs = java.util.HashMap.new
|
@@ -444,10 +451,10 @@ module PLSQL
|
|
444
451
|
case field[:type]
|
445
452
|
when Java::oracle.jdbc.OracleTypes::ARRAY
|
446
453
|
# nested collection
|
447
|
-
object_attrs.put(key.to_s.upcase, ruby_value_to_ora_value(attr_value, Java::OracleSql::ARRAY, :
|
454
|
+
object_attrs.put(key.to_s.upcase, ruby_value_to_ora_value(attr_value, Java::OracleSql::ARRAY, sql_type_name: field[:type_name]))
|
448
455
|
when Java::oracle.jdbc.OracleTypes::STRUCT
|
449
456
|
# nested object type
|
450
|
-
object_attrs.put(key.to_s.upcase, ruby_value_to_ora_value(attr_value, Java::OracleSql::STRUCT, :
|
457
|
+
object_attrs.put(key.to_s.upcase, ruby_value_to_ora_value(attr_value, Java::OracleSql::STRUCT, sql_type_name: field[:type_name]))
|
451
458
|
else
|
452
459
|
object_attrs.put(key.to_s.upcase, ruby_value_to_ora_value(attr_value))
|
453
460
|
end
|
@@ -468,7 +475,7 @@ module PLSQL
|
|
468
475
|
when Float, BigDecimal
|
469
476
|
ora_number_to_ruby_number(value)
|
470
477
|
when Java::JavaMath::BigDecimal
|
471
|
-
value && ora_number_to_ruby_number(BigDecimal
|
478
|
+
value && ora_number_to_ruby_number(BigDecimal(value.to_s))
|
472
479
|
when Java::OracleSql::DATE
|
473
480
|
if value
|
474
481
|
d = value.dateValue
|
@@ -493,12 +500,12 @@ module PLSQL
|
|
493
500
|
String.from_java_bytes(value.getBytes(1, value.length))
|
494
501
|
end
|
495
502
|
when Java::OracleSql::ARRAY
|
496
|
-
value.getArray.map{|e| ora_value_to_ruby_value(e)}
|
503
|
+
value.getArray.map { |e| ora_value_to_ruby_value(e) }
|
497
504
|
when Java::OracleSql::STRUCT
|
498
505
|
descriptor = value.getDescriptor
|
499
506
|
struct_metadata = descriptor.getMetaData
|
500
|
-
field_names = (1..descriptor.getLength).map {|i| struct_metadata.getColumnName(i).downcase.to_sym}
|
501
|
-
field_values = value.getAttributes.map{|e| ora_value_to_ruby_value(e)}
|
507
|
+
field_names = (1..descriptor.getLength).map { |i| struct_metadata.getColumnName(i).downcase.to_sym }
|
508
|
+
field_values = value.getAttributes.map { |e| ora_value_to_ruby_value(e) }
|
502
509
|
ArrayHelpers::to_hash(field_names, field_values)
|
503
510
|
when Java::java.sql.ResultSet
|
504
511
|
Cursor.new(self, value)
|
@@ -523,23 +530,21 @@ module PLSQL
|
|
523
530
|
|
524
531
|
private
|
525
532
|
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
|
530
|
-
def java_timestamp(value)
|
531
|
-
value && Java::java.sql.Timestamp.new(value.year-1900, value.month-1, value.day, value.hour, value.min, value.sec, value.usec * 1000)
|
532
|
-
end
|
533
|
+
def java_date(value)
|
534
|
+
value && Java::oracle.sql.DATE.new(value.strftime("%Y-%m-%d %H:%M:%S"))
|
535
|
+
end
|
533
536
|
|
534
|
-
|
535
|
-
|
536
|
-
|
537
|
+
def java_timestamp(value)
|
538
|
+
value && Java::java.sql.Timestamp.new(value.year - 1900, value.month - 1, value.day, value.hour, value.min, value.sec, value.usec * 1000)
|
539
|
+
end
|
537
540
|
|
538
|
-
|
539
|
-
|
540
|
-
|
541
|
-
end
|
541
|
+
def java_bigdecimal(value)
|
542
|
+
value && java.math.BigDecimal.new(value.to_s)
|
543
|
+
end
|
542
544
|
|
545
|
+
def ora_number_to_ruby_number(num)
|
546
|
+
# return BigDecimal instead of Float to avoid rounding errors
|
547
|
+
num == (num_to_i = num.to_i) ? num_to_i : (num.is_a?(BigDecimal) ? num : BigDecimal(num.to_s))
|
548
|
+
end
|
543
549
|
end
|
544
|
-
|
545
550
|
end
|