ruby-plsql 0.7.1 → 0.8.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 +4 -4
- data/.github/workflows/rubocop.yml +37 -0
- data/.github/workflows/test.yml +69 -0
- data/.rubocop.yml +5 -11
- data/.travis.yml +45 -6
- data/Gemfile +3 -0
- data/History.txt +24 -0
- data/README.md +1 -1
- data/VERSION +1 -1
- data/ci/network/admin/tnsnames.ora +7 -0
- data/ci/setup_accounts.sh +9 -0
- data/gemfiles/Gemfile.activerecord-6.0 +21 -0
- data/gemfiles/Gemfile.activerecord-6.1 +21 -0
- data/gemfiles/Gemfile.activerecord-main +21 -0
- data/lib/plsql/connection.rb +2 -2
- data/lib/plsql/jdbc_connection.rb +0 -2
- data/lib/plsql/procedure.rb +280 -0
- data/lib/plsql/procedure_call.rb +5 -0
- data/lib/plsql/table.rb +1 -0
- data/ruby-plsql.gemspec +28 -28
- data/spec/plsql/procedure_spec.rb +34 -4
- data/spec/plsql/schema_spec.rb +13 -5
- data/spec/plsql/table_spec.rb +5 -0
- data/spec/spec_helper.rb +1 -1
- metadata +52 -5
- data/.codeclimate.yml +0 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 786698aedb4dff545a44a91fda4b7529d392b6d3afaee1e5a4447ee3be81a9d6
|
4
|
+
data.tar.gz: fa71bb0ec3ad558ab6805b077069401225fb1d8e949f4dc00360ecd085bae81b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f814a2f6b9b2b0784e41f861f0ed0965cb814aaf4e8687293f8285e4758810fd4979e1ef96d7f7b0a305e701f0426fb81d3be0ece725abdf1888270a91131691
|
7
|
+
data.tar.gz: c17b7330167301d53715b4d43441acb67697a53a0b0378ea51f65824b96215ece3730db3af01be4e7442a2c3c632dc9fc14109425cfda73cfa535997d77444ba
|
@@ -0,0 +1,37 @@
|
|
1
|
+
name: RuboCop
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
pull_request:
|
6
|
+
schedule:
|
7
|
+
- cron: "0 0 * * *"
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
build:
|
11
|
+
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
|
14
|
+
steps:
|
15
|
+
- uses: actions/checkout@v1
|
16
|
+
- name: Set up Ruby 2.6
|
17
|
+
uses: actions/setup-ruby@v1
|
18
|
+
with:
|
19
|
+
ruby-version: 2.6.x
|
20
|
+
- name: Install required package
|
21
|
+
run: |
|
22
|
+
sudo apt-get install alien
|
23
|
+
- name: Download Oracle instant client
|
24
|
+
run: |
|
25
|
+
wget -q https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
|
26
|
+
wget -q https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm
|
27
|
+
wget -q https://download.oracle.com/otn_software/linux/instantclient/193000/oracle-instantclient19.3-devel-19.3.0.0.0-1.x86_64.rpm
|
28
|
+
- name: Install Oracle instant client
|
29
|
+
run: |
|
30
|
+
sudo alien -i oracle-instantclient19.3-basic-19.3.0.0.0-1.x86_64.rpm
|
31
|
+
sudo alien -i oracle-instantclient19.3-sqlplus-19.3.0.0.0-1.x86_64.rpm
|
32
|
+
sudo alien -i oracle-instantclient19.3-devel-19.3.0.0.0-1.x86_64.rpm
|
33
|
+
|
34
|
+
- name: Build and run RuboCop
|
35
|
+
run: |
|
36
|
+
bundle install --jobs 4 --retry 3
|
37
|
+
bundle exec rubocop --parallel
|
@@ -0,0 +1,69 @@
|
|
1
|
+
name: test
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
pull_request:
|
6
|
+
|
7
|
+
jobs:
|
8
|
+
build:
|
9
|
+
|
10
|
+
runs-on: ubuntu-20.04
|
11
|
+
continue-on-error: true
|
12
|
+
strategy:
|
13
|
+
matrix:
|
14
|
+
ruby: [
|
15
|
+
3.0,
|
16
|
+
2.7,
|
17
|
+
2.6,
|
18
|
+
2.5,
|
19
|
+
ruby-head,
|
20
|
+
ruby-debug
|
21
|
+
]
|
22
|
+
env:
|
23
|
+
ORACLE_HOME: /usr/lib/oracle/18.5/client64
|
24
|
+
LD_LIBRARY_PATH: /usr/lib/oracle/18.5/client64/lib
|
25
|
+
NLS_LANG: AMERICAN_AMERICA.AL32UTF8
|
26
|
+
TNS_ADMIN: ./ci/network/admin
|
27
|
+
DATABASE_NAME: XEPDB1
|
28
|
+
TZ: Europe/Riga
|
29
|
+
DATABASE_SYS_PASSWORD: Oracle18
|
30
|
+
DATABASE_VERSION: 18.4.0.0
|
31
|
+
|
32
|
+
services:
|
33
|
+
oracle:
|
34
|
+
image: quillbuilduser/oracle-18-xe
|
35
|
+
ports:
|
36
|
+
- 1521:1521
|
37
|
+
env:
|
38
|
+
TZ: Europe/Riga
|
39
|
+
steps:
|
40
|
+
- uses: actions/checkout@v2
|
41
|
+
- name: Set up Ruby
|
42
|
+
uses: ruby/setup-ruby@v1
|
43
|
+
with:
|
44
|
+
ruby-version: ${{ matrix.ruby }}
|
45
|
+
- name: Install required package
|
46
|
+
run: |
|
47
|
+
sudo apt-get install alien
|
48
|
+
- name: Download Oracle client
|
49
|
+
run: |
|
50
|
+
wget -q https://download.oracle.com/otn_software/linux/instantclient/185000/oracle-instantclient18.5-basic-18.5.0.0.0-3.x86_64.rpm
|
51
|
+
wget -q https://download.oracle.com/otn_software/linux/instantclient/185000/oracle-instantclient18.5-sqlplus-18.5.0.0.0-3.x86_64.rpm
|
52
|
+
wget -q https://download.oracle.com/otn_software/linux/instantclient/185000/oracle-instantclient18.5-devel-18.5.0.0.0-3.x86_64.rpm
|
53
|
+
- name: Install Oracle client
|
54
|
+
run: |
|
55
|
+
sudo alien -i oracle-instantclient18.5-basic-18.5.0.0.0-3.x86_64.rpm
|
56
|
+
sudo alien -i oracle-instantclient18.5-sqlplus-18.5.0.0.0-3.x86_64.rpm
|
57
|
+
sudo alien -i oracle-instantclient18.5-devel-18.5.0.0.0-3.x86_64.rpm
|
58
|
+
- name: Install JDBC Driver
|
59
|
+
run: |
|
60
|
+
cp $ORACLE_HOME/lib/ojdbc8.jar lib/.
|
61
|
+
- name: Create database user
|
62
|
+
run: |
|
63
|
+
./ci/setup_accounts.sh
|
64
|
+
- name: Bundle install
|
65
|
+
run: |
|
66
|
+
bundle install --jobs 4 --retry 3
|
67
|
+
- name: Run RSpec
|
68
|
+
run: |
|
69
|
+
bundle exec rspec
|
data/.rubocop.yml
CHANGED
@@ -2,19 +2,13 @@
|
|
2
2
|
# We should not use cops only available for Ruby 2.1 or later
|
3
3
|
# since ruby-plsql itself supports Ruby 1.9.3
|
4
4
|
AllCops:
|
5
|
-
TargetRubyVersion: 2.
|
5
|
+
TargetRubyVersion: 2.3
|
6
6
|
DisabledByDefault: true
|
7
7
|
|
8
8
|
# Prefer &&/|| over and/or.
|
9
9
|
Style/AndOr:
|
10
10
|
Enabled: true
|
11
11
|
|
12
|
-
# Do not use braces for hash literals when they are the last argument of a
|
13
|
-
# method call.
|
14
|
-
Style/BracesAroundHashParameters:
|
15
|
-
Enabled: true
|
16
|
-
EnforcedStyle: context_dependent
|
17
|
-
|
18
12
|
# Align `when` with `case`.
|
19
13
|
Layout/CaseIndentation:
|
20
14
|
Enabled: true
|
@@ -45,7 +39,7 @@ Layout/EmptyLinesAroundMethodBody:
|
|
45
39
|
Layout/EmptyLinesAroundModuleBody:
|
46
40
|
Enabled: true
|
47
41
|
|
48
|
-
Layout/
|
42
|
+
Layout/FirstArgumentIndentation:
|
49
43
|
Enabled: true
|
50
44
|
|
51
45
|
# Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
|
@@ -56,7 +50,7 @@ Style/HashSyntax:
|
|
56
50
|
# extra level of indentation.
|
57
51
|
Layout/IndentationConsistency:
|
58
52
|
Enabled: true
|
59
|
-
EnforcedStyle:
|
53
|
+
EnforcedStyle: indented_internal_methods
|
60
54
|
|
61
55
|
# Two spaces, no tabs (for indentation).
|
62
56
|
Layout/IndentationWidth:
|
@@ -122,7 +116,7 @@ Layout/Tab:
|
|
122
116
|
Enabled: true
|
123
117
|
|
124
118
|
# Blank lines should not have any spaces.
|
125
|
-
Layout/
|
119
|
+
Layout/TrailingEmptyLines:
|
126
120
|
Enabled: true
|
127
121
|
|
128
122
|
# No trailing whitespace.
|
@@ -130,7 +124,7 @@ Layout/TrailingWhitespace:
|
|
130
124
|
Enabled: true
|
131
125
|
|
132
126
|
# Use quotes for string literals when they are enough.
|
133
|
-
Style/
|
127
|
+
Style/RedundantPercentQ:
|
134
128
|
Enabled: true
|
135
129
|
|
136
130
|
# Align `end` with the matching keyword or starting expression except for
|
data/.travis.yml
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
dist: xenial
|
1
2
|
sudo: required
|
2
3
|
|
4
|
+
jdk:
|
5
|
+
- openjdk8
|
3
6
|
env:
|
4
7
|
global:
|
5
8
|
- ORACLE_COOKIE=sqldev
|
@@ -19,7 +22,7 @@ before_install:
|
|
19
22
|
- chmod +x .travis/oracle/download.sh
|
20
23
|
- chmod +x .travis/oracle/install.sh
|
21
24
|
- chmod +x .travis/setup_accounts.sh
|
22
|
-
- gem install bundler
|
25
|
+
- 'gem install bundler || gem install bundler -v 1.17.3'
|
23
26
|
|
24
27
|
install:
|
25
28
|
- .travis/oracle/download.sh
|
@@ -29,11 +32,13 @@ install:
|
|
29
32
|
|
30
33
|
language: ruby
|
31
34
|
rvm:
|
32
|
-
-
|
33
|
-
- 2.
|
34
|
-
- 2.
|
35
|
-
- 2.
|
36
|
-
-
|
35
|
+
- 3.0.2
|
36
|
+
- 2.7.4
|
37
|
+
- 2.6.8
|
38
|
+
- 2.5.9
|
39
|
+
- 2.4.10
|
40
|
+
- 2.3.8
|
41
|
+
- jruby-9.2.17.0
|
37
42
|
- ruby-head
|
38
43
|
- jruby-head
|
39
44
|
|
@@ -42,8 +47,42 @@ gemfile:
|
|
42
47
|
- gemfiles/Gemfile.activerecord-5.0
|
43
48
|
- gemfiles/Gemfile.activerecord-5.1
|
44
49
|
- gemfiles/Gemfile.activerecord-5.2
|
50
|
+
- gemfiles/Gemfile.activerecord-6.0
|
51
|
+
- gemfiles/Gemfile.activerecord-6.1
|
52
|
+
- gemfiles/Gemfile.activerecord-main
|
45
53
|
|
46
54
|
matrix:
|
55
|
+
exclude:
|
56
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
57
|
+
rvm: jruby-head
|
58
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
59
|
+
rvm: jruby-9.2.17.0
|
60
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
61
|
+
rvm: 2.6.8
|
62
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
63
|
+
rvm: 2.5.9
|
64
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
65
|
+
rvm: 2.4.10
|
66
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
67
|
+
rvm: 2.3.8
|
68
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
69
|
+
rvm: 2.2.10
|
70
|
+
- gemfile: gemfiles/Gemfile.activerecord-6.0
|
71
|
+
rvm: 2.4.10
|
72
|
+
- gemfile: gemfiles/Gemfile.activerecord-6.0
|
73
|
+
rvm: 2.3.8
|
74
|
+
- gemfile: gemfiles/Gemfile.activerecord-6.0
|
75
|
+
rvm: 2.2.10
|
76
|
+
- gemfile: gemfiles/Gemfile.activerecord-6.1
|
77
|
+
rvm: 2.4.10
|
78
|
+
- gemfile: gemfiles/Gemfile.activerecord-6.1
|
79
|
+
rvm: 2.3.8
|
80
|
+
- gemfile: gemfiles/Gemfile.activerecord-6.1
|
81
|
+
rvm: 2.2.10
|
47
82
|
allow_failures:
|
48
83
|
- rvm: ruby-head
|
49
84
|
- rvm: jruby-head
|
85
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
86
|
+
rvm: 3.0.2
|
87
|
+
- gemfile: gemfiles/Gemfile.activerecord-main
|
88
|
+
rvm: 2.7.4
|
data/Gemfile
CHANGED
@@ -3,6 +3,9 @@ source "http://rubygems.org"
|
|
3
3
|
group :development do
|
4
4
|
gem "juwelier", "~> 2.0"
|
5
5
|
gem "rspec_junit_formatter"
|
6
|
+
gem "rubocop", "0.81", require: false
|
7
|
+
gem "rubocop-performance", require: false
|
8
|
+
gem "rubocop-rails", require: false
|
6
9
|
end
|
7
10
|
|
8
11
|
group :test, :development do
|
data/History.txt
CHANGED
@@ -1,3 +1,27 @@
|
|
1
|
+
== 0.8.0 2021-08-10
|
2
|
+
* Improvements and fixes
|
3
|
+
* Support Rails 6.1 [#193]
|
4
|
+
* Support Rails 6.0 [#178]
|
5
|
+
* Support Oracle Database 18c or higher [#196]
|
6
|
+
* case-insensitive table names and proc params [#185]
|
7
|
+
* Use OCI driver type for RUBY_ENGINE TruffleRuby [#190]
|
8
|
+
* Replace NativeException with Java::JavaSql::SQLException [#192]
|
9
|
+
* Fixnum and Bignum are deprecated in Ruby 2.4 [#191]
|
10
|
+
|
11
|
+
* CI
|
12
|
+
* Run CI with GitHub Actions [#198]
|
13
|
+
* CI against Rails 6.1 [#193]
|
14
|
+
* CI against Rails 6.0 [#178]
|
15
|
+
* CI against Ruby 3.0.2, 2.7.4 and 2.6.8 [#197]
|
16
|
+
* Exclude jruby-head with Rails main [#194]
|
17
|
+
* Exclude jruby-head with Rails main [#194]
|
18
|
+
* Bump RuboCop version to 0.81.0 [#186]
|
19
|
+
* Run RuboCop using GitHub Actions [#180, #182]
|
20
|
+
* Remove .codeclimate.yml [#181]
|
21
|
+
* Fallback to bundler 1.7.13 [#171]
|
22
|
+
* Terminate CI against Ruby 2.2.x [#172]
|
23
|
+
* Use Ubuntu Xenial at Travis CI [#176]
|
24
|
+
|
1
25
|
== 0.7.1 2018-09-03
|
2
26
|
* Fix
|
3
27
|
* Address incorrect versions in Gemfile
|
data/README.md
CHANGED
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.8.0
|
@@ -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', '~> 6.0.0.rc1'
|
14
|
+
gem 'activerecord-oracle_enhanced-adapter', '~>6.0.0.rc1'
|
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', '~> 6.1.0'
|
14
|
+
gem 'activerecord-oracle_enhanced-adapter', '~>6.1.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', github: 'rails/rails', branch: 'main'
|
14
|
+
gem 'activerecord-oracle_enhanced-adapter', github: 'rsim/oracle-enhanced', branch: 'master'
|
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
@@ -37,8 +37,8 @@ module PLSQL
|
|
37
37
|
end
|
38
38
|
|
39
39
|
def self.driver_type #:nodoc:
|
40
|
-
# MRI 1.8.6 or YARV 1.9.1
|
41
|
-
@driver_type ||= if (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby") && defined?(OCI8)
|
40
|
+
# MRI 1.8.6 or YARV 1.9.1 or TruffleRuby
|
41
|
+
@driver_type ||= if (!defined?(RUBY_ENGINE) || RUBY_ENGINE == "ruby" || RUBY_ENGINE == "truffleruby") && defined?(OCI8)
|
42
42
|
:oci
|
43
43
|
# JRuby
|
44
44
|
elsif (defined?(RUBY_ENGINE) && RUBY_ENGINE == "jruby")
|
@@ -223,8 +223,6 @@ module PLSQL
|
|
223
223
|
end
|
224
224
|
|
225
225
|
RUBY_CLASS_TO_SQL_TYPE = {
|
226
|
-
Fixnum => java.sql.Types::INTEGER,
|
227
|
-
Bignum => java.sql.Types::INTEGER,
|
228
226
|
Integer => java.sql.Types::INTEGER,
|
229
227
|
Float => java.sql.Types::FLOAT,
|
230
228
|
BigDecimal => java.sql.Types::NUMERIC,
|
data/lib/plsql/procedure.rb
CHANGED
@@ -83,6 +83,14 @@ module PLSQL
|
|
83
83
|
|
84
84
|
# get procedure argument metadata from data dictionary
|
85
85
|
def get_argument_metadata #:nodoc:
|
86
|
+
if (@schema.connection.database_version <=> [18, 0, 0, 0]) >= 0
|
87
|
+
get_argument_metadata_from_18c
|
88
|
+
else
|
89
|
+
get_argument_metadata_below_18c
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def get_argument_metadata_below_18c #:nodoc:
|
86
94
|
@arguments = {}
|
87
95
|
@argument_list = {}
|
88
96
|
@out_list = {}
|
@@ -197,6 +205,99 @@ module PLSQL
|
|
197
205
|
construct_argument_list_for_overloads
|
198
206
|
end
|
199
207
|
|
208
|
+
# get procedure argument metadata from data dictionary
|
209
|
+
def get_argument_metadata_from_18c #:nodoc:
|
210
|
+
@arguments = {}
|
211
|
+
@argument_list = {}
|
212
|
+
@out_list = {}
|
213
|
+
@return = {}
|
214
|
+
@overloaded = false
|
215
|
+
|
216
|
+
# store tmp tables for each overload for table parameters with types defined inside packages
|
217
|
+
@tmp_table_names = {}
|
218
|
+
# store if tmp tables are created for specific overload
|
219
|
+
@tmp_tables_created = {}
|
220
|
+
|
221
|
+
@schema.select_all(
|
222
|
+
"SELECT subprogram_id, object_name, TO_NUMBER(overload), argument_name, position,
|
223
|
+
data_type, in_out, data_length, data_precision, data_scale, char_used,
|
224
|
+
char_length, type_owner, nvl(type_subname, type_name),
|
225
|
+
decode(type_object_type, 'PACKAGE', type_name, null), type_object_type, defaulted
|
226
|
+
FROM all_arguments
|
227
|
+
WHERE object_id = :object_id
|
228
|
+
AND owner = :owner
|
229
|
+
AND object_name = :procedure_name
|
230
|
+
ORDER BY overload, sequence",
|
231
|
+
@object_id, @schema_name, @procedure
|
232
|
+
) do |r|
|
233
|
+
|
234
|
+
subprogram_id, object_name, overload, argument_name, position,
|
235
|
+
data_type, in_out, data_length, data_precision, data_scale, char_used,
|
236
|
+
char_length, type_owner, type_name, type_package, type_object_type, defaulted = r
|
237
|
+
|
238
|
+
@overloaded ||= !overload.nil?
|
239
|
+
# if not overloaded then store arguments at key 0
|
240
|
+
overload ||= 0
|
241
|
+
@arguments[overload] ||= {}
|
242
|
+
@return[overload] ||= nil
|
243
|
+
@tmp_table_names[overload] ||= []
|
244
|
+
|
245
|
+
sql_type_name = build_sql_type_name(type_owner, type_package, type_name)
|
246
|
+
|
247
|
+
tmp_table_name = nil
|
248
|
+
# type defined inside package
|
249
|
+
if type_package
|
250
|
+
if collection_type?(data_type)
|
251
|
+
tmp_table_name = "#{Connection::RUBY_TEMP_TABLE_PREFIX}#{@schema.connection.session_id}_#{@object_id}_#{subprogram_id}_#{position}"
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
255
|
+
argument_metadata = {
|
256
|
+
position: position && position.to_i,
|
257
|
+
data_type: data_type,
|
258
|
+
in_out: in_out,
|
259
|
+
data_length: data_length && data_length.to_i,
|
260
|
+
data_precision: data_precision && data_precision.to_i,
|
261
|
+
data_scale: data_scale && data_scale.to_i,
|
262
|
+
char_used: char_used,
|
263
|
+
char_length: char_length && char_length.to_i,
|
264
|
+
type_owner: type_owner,
|
265
|
+
type_name: type_name,
|
266
|
+
# TODO: should be renamed to type_package, when support for legacy database versions is dropped
|
267
|
+
# due to the explicit change declaration of types in oracle plsql_type-catalogs (type_package + type_name),
|
268
|
+
# the assignment of type + subtype was switched here for 18c and beyond
|
269
|
+
type_subname: type_package,
|
270
|
+
sql_type_name: sql_type_name,
|
271
|
+
defaulted: defaulted,
|
272
|
+
type_object_type: type_object_type
|
273
|
+
}
|
274
|
+
if tmp_table_name
|
275
|
+
@tmp_table_names[overload] << [(argument_metadata[:tmp_table_name] = tmp_table_name), argument_metadata]
|
276
|
+
end
|
277
|
+
|
278
|
+
if composite_type?(data_type)
|
279
|
+
case data_type
|
280
|
+
when "PL/SQL RECORD", "REF CURSOR"
|
281
|
+
argument_metadata[:fields] = get_field_definitions(argument_metadata)
|
282
|
+
when "PL/SQL TABLE", "TABLE", "VARRAY"
|
283
|
+
argument_metadata[:element] = get_element_definition(argument_metadata)
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
# if function has return value
|
288
|
+
if argument_name.nil? && in_out == "OUT"
|
289
|
+
@return[overload] = argument_metadata
|
290
|
+
else
|
291
|
+
# sometime there are empty IN arguments in all_arguments view for procedures without arguments (e.g. for DBMS_OUTPUT.DISABLE)
|
292
|
+
@arguments[overload][argument_name.downcase.to_sym] = argument_metadata if argument_name
|
293
|
+
end
|
294
|
+
end
|
295
|
+
# if procedure is without arguments then create default empty argument list for default overload
|
296
|
+
@arguments[0] = {} if @arguments.keys.empty?
|
297
|
+
|
298
|
+
construct_argument_list_for_overloads
|
299
|
+
end
|
300
|
+
|
200
301
|
def construct_argument_list_for_overloads #:nodoc:
|
201
302
|
@overloads = @arguments.keys.sort
|
202
303
|
@overloads.each do |overload|
|
@@ -229,6 +330,185 @@ module PLSQL
|
|
229
330
|
@tmp_tables_created[overload] = true
|
230
331
|
end
|
231
332
|
|
333
|
+
def build_sql_type_name(type_owner, type_package, type_name) #:nodoc:
|
334
|
+
if type_owner == nil || type_owner == "PUBLIC"
|
335
|
+
type_owner_res = ""
|
336
|
+
else
|
337
|
+
type_owner_res = "#{type_owner}."
|
338
|
+
end
|
339
|
+
|
340
|
+
if type_package == nil
|
341
|
+
type_name_res = type_name
|
342
|
+
else
|
343
|
+
type_name_res = "#{type_package}.#{type_name}"
|
344
|
+
end
|
345
|
+
type_name_res && "#{type_owner_res}#{type_name_res}"
|
346
|
+
end
|
347
|
+
|
348
|
+
def get_field_definitions(argument_metadata) #:nodoc:
|
349
|
+
fields = {}
|
350
|
+
case argument_metadata[:type_object_type]
|
351
|
+
when "PACKAGE"
|
352
|
+
@schema.select_all(
|
353
|
+
"SELECT attr_no, attr_name, attr_type_owner, attr_type_name, attr_type_package, length, precision, scale, char_used
|
354
|
+
FROM ALL_PLSQL_TYPES t, ALL_PLSQL_TYPE_ATTRS ta
|
355
|
+
WHERE t.OWNER = :owner AND t.type_name = :type_name AND t.package_name = :package_name
|
356
|
+
AND ta.OWNER = t.owner AND ta.TYPE_NAME = t.TYPE_NAME AND ta.PACKAGE_NAME = t.PACKAGE_NAME
|
357
|
+
ORDER BY attr_no",
|
358
|
+
@schema_name, argument_metadata[:type_name], argument_metadata[:type_subname]) do |r|
|
359
|
+
|
360
|
+
attr_no, attr_name, attr_type_owner, attr_type_name, attr_type_package, attr_length, attr_precision, attr_scale, attr_char_used = r
|
361
|
+
|
362
|
+
fields[attr_name.downcase.to_sym] = {
|
363
|
+
position: attr_no.to_i,
|
364
|
+
data_type: attr_type_owner == nil ? attr_type_name : get_composite_type(attr_type_owner, attr_type_name, attr_type_package),
|
365
|
+
in_out: argument_metadata[:in_out],
|
366
|
+
data_length: attr_length && attr_length.to_i,
|
367
|
+
data_precision: attr_precision && attr_precision.to_i,
|
368
|
+
data_scale: attr_scale && attr_scale.to_i,
|
369
|
+
char_used: attr_char_used == nil ? "0" : attr_char_used,
|
370
|
+
char_length: attr_char_used && attr_length && attr_length.to_i,
|
371
|
+
type_owner: attr_type_owner,
|
372
|
+
type_name: attr_type_owner && attr_type_name,
|
373
|
+
type_subname: attr_type_package,
|
374
|
+
sql_type_name: attr_type_owner && build_sql_type_name(attr_type_owner, attr_type_package, attr_type_name),
|
375
|
+
defaulted: argument_metadata[:defaulted]
|
376
|
+
}
|
377
|
+
|
378
|
+
if fields[attr_name.downcase.to_sym][:data_type] == "TABLE" && fields[attr_name.downcase.to_sym][:type_subname] != nil
|
379
|
+
fields[attr_name.downcase.to_sym][:fields] = get_field_definitions(fields[attr_name.downcase.to_sym])
|
380
|
+
end
|
381
|
+
end
|
382
|
+
when "TABLE", "VIEW"
|
383
|
+
@schema.select_all(
|
384
|
+
"SELECT column_id, column_name, data_type, data_length, data_precision, data_scale, char_length, char_used
|
385
|
+
FROM ALL_TAB_COLS WHERE OWNER = :owner AND TABLE_NAME = :type_name
|
386
|
+
ORDER BY column_id",
|
387
|
+
@schema_name, argument_metadata[:type_name]) do |r|
|
388
|
+
|
389
|
+
col_no, col_name, col_type_name, col_length, col_precision, col_scale, col_char_length, col_char_used = r
|
390
|
+
|
391
|
+
fields[col_name.downcase.to_sym] = {
|
392
|
+
position: col_no.to_i,
|
393
|
+
data_type: col_type_name,
|
394
|
+
in_out: argument_metadata[:in_out],
|
395
|
+
data_length: col_length && col_length.to_i,
|
396
|
+
data_precision: col_precision && col_precision.to_i,
|
397
|
+
data_scale: col_scale && col_scale.to_i,
|
398
|
+
char_used: col_char_used == nil ? "0" : col_char_used,
|
399
|
+
char_length: col_char_length && col_char_length.to_i,
|
400
|
+
type_owner: nil,
|
401
|
+
type_name: nil,
|
402
|
+
type_subname: nil,
|
403
|
+
sql_type_name: nil,
|
404
|
+
defaulted: argument_metadata[:defaulted]
|
405
|
+
}
|
406
|
+
end
|
407
|
+
end
|
408
|
+
fields
|
409
|
+
end
|
410
|
+
|
411
|
+
def get_element_definition(argument_metadata) #:nodoc:
|
412
|
+
element_metadata = {}
|
413
|
+
if collection_type?(argument_metadata[:data_type])
|
414
|
+
case argument_metadata[:type_object_type]
|
415
|
+
when "PACKAGE"
|
416
|
+
r = @schema.select_first(
|
417
|
+
"SELECT elem_type_owner, elem_type_name, elem_type_package, length, precision, scale, char_used, index_by
|
418
|
+
FROM ALL_PLSQL_COLL_TYPES t
|
419
|
+
WHERE t.OWNER = :owner AND t.TYPE_NAME = :type_name AND t.PACKAGE_NAME = :package_name",
|
420
|
+
@schema_name, argument_metadata[:type_name], argument_metadata[:type_subname])
|
421
|
+
|
422
|
+
elem_type_owner, elem_type_name, elem_type_package, elem_length, elem_precision, elem_scale, elem_char_used, index_by = r
|
423
|
+
|
424
|
+
if index_by == "VARCHAR2"
|
425
|
+
raise ArgumentError, "Index-by Varchar-Table (associative array) #{argument_metadata[:type_name]} is not supported"
|
426
|
+
end
|
427
|
+
|
428
|
+
element_metadata = {
|
429
|
+
position: 1,
|
430
|
+
data_type: if elem_type_owner == nil
|
431
|
+
elem_type_name
|
432
|
+
else
|
433
|
+
elem_type_package != nil ? "PL/SQL RECORD" : "OBJECT"
|
434
|
+
end,
|
435
|
+
in_out: argument_metadata[:in_out],
|
436
|
+
data_length: elem_length && elem_length.to_i,
|
437
|
+
data_precision: elem_precision && elem_precision.to_i,
|
438
|
+
data_scale: elem_scale && elem_scale.to_i,
|
439
|
+
char_used: elem_char_used,
|
440
|
+
char_length: elem_char_used && elem_length && elem_length.to_i,
|
441
|
+
type_owner: elem_type_owner,
|
442
|
+
type_name: elem_type_name,
|
443
|
+
type_subname: elem_type_package,
|
444
|
+
sql_type_name: elem_type_owner && build_sql_type_name(elem_type_owner, elem_type_package, elem_type_name),
|
445
|
+
type_object_type: elem_type_package != nil ? "PACKAGE" : nil,
|
446
|
+
defaulted: argument_metadata[:defaulted]
|
447
|
+
}
|
448
|
+
|
449
|
+
if elem_type_package != nil
|
450
|
+
element_metadata[:fields] = get_field_definitions(element_metadata)
|
451
|
+
end
|
452
|
+
when "TYPE"
|
453
|
+
r = @schema.select_first(
|
454
|
+
"SELECT elem_type_owner, elem_type_name, length, precision, scale, char_used
|
455
|
+
FROM ALL_COLL_TYPES t
|
456
|
+
WHERE t.owner = :owner AND t.TYPE_NAME = :type_name",
|
457
|
+
@schema_name, argument_metadata[:type_name]
|
458
|
+
)
|
459
|
+
elem_type_owner, elem_type_name, elem_length, elem_precision, elem_scale, elem_char_used = r
|
460
|
+
|
461
|
+
element_metadata = {
|
462
|
+
position: 1,
|
463
|
+
data_type: elem_type_owner == nil ? elem_type_name : "OBJECT",
|
464
|
+
in_out: argument_metadata[:in_out],
|
465
|
+
data_length: elem_length && elem_length.to_i,
|
466
|
+
data_precision: elem_precision && elem_precision.to_i,
|
467
|
+
data_scale: elem_scale && elem_scale.to_i,
|
468
|
+
char_used: elem_char_used,
|
469
|
+
char_length: elem_char_used && elem_length && elem_length.to_i,
|
470
|
+
type_owner: elem_type_owner,
|
471
|
+
type_name: elem_type_name,
|
472
|
+
type_subname: nil,
|
473
|
+
sql_type_name: elem_type_owner && build_sql_type_name(elem_type_owner, nil, elem_type_name),
|
474
|
+
defaulted: argument_metadata[:defaulted]
|
475
|
+
}
|
476
|
+
end
|
477
|
+
else
|
478
|
+
element_metadata = {
|
479
|
+
position: 1,
|
480
|
+
data_type: "PL/SQL RECORD",
|
481
|
+
in_out: argument_metadata[:in_out],
|
482
|
+
data_length: nil,
|
483
|
+
data_precision: nil,
|
484
|
+
data_scale: nil,
|
485
|
+
char_used: "B",
|
486
|
+
char_length: 0,
|
487
|
+
type_owner: argument_metadata[:type_owner],
|
488
|
+
type_name: argument_metadata[:type_name],
|
489
|
+
type_subname: argument_metadata[:type_subname],
|
490
|
+
sql_type_name: build_sql_type_name(argument_metadata[:type_owner], argument_metadata[:type_subname], argument_metadata[:type_name]),
|
491
|
+
defaulted: argument_metadata[:defaulted]
|
492
|
+
}
|
493
|
+
|
494
|
+
if element_metadata[:type_subname] != nil
|
495
|
+
element_metadata[:fields] = get_field_definitions(element_metadata)
|
496
|
+
end
|
497
|
+
end
|
498
|
+
element_metadata
|
499
|
+
end
|
500
|
+
|
501
|
+
def get_composite_type(type_owner, type_name, type_package)
|
502
|
+
r = @schema.select_first("SELECT typecode FROM all_plsql_types WHERE owner = :owner AND type_name = :type_name AND package_name = :type_package
|
503
|
+
UNION ALL
|
504
|
+
SELECT typecode FROM all_types WHERE owner = :owner AND type_name = :type_name",
|
505
|
+
type_owner, type_name, type_package, type_owner, type_name)
|
506
|
+
typecode = r[0]
|
507
|
+
raise ArgumentError, "#{type_name} type #{build_sql_type_name(type_owner, type_package, type_name)} definition inside package is not supported as part of other type definition," <<
|
508
|
+
" use CREATE TYPE outside package" if typecode == "COLLECTION"
|
509
|
+
typecode
|
510
|
+
end
|
511
|
+
|
232
512
|
PLSQL_COMPOSITE_TYPES = ["PL/SQL RECORD", "PL/SQL TABLE", "TABLE", "VARRAY", "REF CURSOR"].freeze
|
233
513
|
def composite_type?(data_type) #:nodoc:
|
234
514
|
PLSQL_COMPOSITE_TYPES.include? data_type
|
data/lib/plsql/procedure_call.rb
CHANGED
@@ -6,6 +6,11 @@ module PLSQL
|
|
6
6
|
@dbms_output_stream = @schema.dbms_output_stream
|
7
7
|
@skip_self = options[:skip_self]
|
8
8
|
@self = options[:self]
|
9
|
+
|
10
|
+
if args.size == 1 && args[0].is_a?(Hash) && args[0].keys.all? { |k| k.is_a?(Symbol) }
|
11
|
+
args[0] = args[0].map { |k, v| [k.downcase, v] }.to_h
|
12
|
+
end
|
13
|
+
|
9
14
|
@overload = get_overload_from_arguments_list(args)
|
10
15
|
@procedure.ensure_tmp_tables_created(@overload) if @procedure.respond_to?(:ensure_tmp_tables_created)
|
11
16
|
construct_sql(args)
|
data/lib/plsql/table.rb
CHANGED
@@ -172,6 +172,7 @@ module PLSQL
|
|
172
172
|
end
|
173
173
|
|
174
174
|
table_proc = TableProcedure.new(@schema, self, :insert)
|
175
|
+
record = record.map { |k, v| [k.downcase.to_sym, v] }.to_h
|
175
176
|
table_proc.add_insert_arguments(record)
|
176
177
|
|
177
178
|
call = ProcedureCall.new(table_proc, table_proc.argument_values)
|
data/ruby-plsql.gemspec
CHANGED
@@ -2,11 +2,12 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Juwelier::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
|
5
|
+
|
6
|
+
# stub: ruby-plsql 0.8.0 ruby lib
|
6
7
|
|
7
8
|
Gem::Specification.new do |s|
|
8
9
|
s.name = "ruby-plsql".freeze
|
9
|
-
s.version = "0.
|
10
|
+
s.version = "0.8.0"
|
10
11
|
|
11
12
|
s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
|
12
13
|
s.require_paths = ["lib".freeze]
|
@@ -81,34 +82,33 @@ Gem::Specification.new do |s|
|
|
81
82
|
if s.respond_to? :specification_version then
|
82
83
|
s.specification_version = 4
|
83
84
|
|
84
|
-
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new(
|
85
|
-
s.add_development_dependency(
|
86
|
-
s.add_development_dependency(
|
87
|
-
s.add_development_dependency(
|
88
|
-
s.add_development_dependency(
|
89
|
-
s.add_development_dependency(
|
90
|
-
s.add_development_dependency(
|
91
|
-
s.add_development_dependency(
|
92
|
-
s.add_development_dependency(
|
85
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new("1.2.0") then
|
86
|
+
s.add_development_dependency("juwelier".freeze, ["~> 2.0"])
|
87
|
+
s.add_development_dependency("rspec_junit_formatter".freeze, [">= 0"])
|
88
|
+
s.add_development_dependency("rake".freeze, [">= 10.0"])
|
89
|
+
s.add_development_dependency("rspec".freeze, ["~> 3.1"])
|
90
|
+
s.add_development_dependency("activerecord".freeze, ["~> 5.0"])
|
91
|
+
s.add_development_dependency("activerecord-oracle_enhanced-adapter".freeze, ["~> 1.7"])
|
92
|
+
s.add_development_dependency("simplecov".freeze, [">= 0"])
|
93
|
+
s.add_development_dependency("ruby-oci8".freeze, ["~> 2.1"])
|
93
94
|
else
|
94
|
-
s.add_dependency(
|
95
|
-
s.add_dependency(
|
96
|
-
s.add_dependency(
|
97
|
-
s.add_dependency(
|
98
|
-
s.add_dependency(
|
99
|
-
s.add_dependency(
|
100
|
-
s.add_dependency(
|
101
|
-
s.add_dependency(
|
95
|
+
s.add_dependency("juwelier".freeze, ["~> 2.0"])
|
96
|
+
s.add_dependency("rspec_junit_formatter".freeze, [">= 0"])
|
97
|
+
s.add_dependency("rake".freeze, [">= 10.0"])
|
98
|
+
s.add_dependency("rspec".freeze, ["~> 3.1"])
|
99
|
+
s.add_dependency("activerecord".freeze, ["~> 5.0"])
|
100
|
+
s.add_dependency("activerecord-oracle_enhanced-adapter".freeze, ["~> 1.7"])
|
101
|
+
s.add_dependency("simplecov".freeze, [">= 0"])
|
102
|
+
s.add_dependency("ruby-oci8".freeze, ["~> 2.1"])
|
102
103
|
end
|
103
104
|
else
|
104
|
-
s.add_dependency(
|
105
|
-
s.add_dependency(
|
106
|
-
s.add_dependency(
|
107
|
-
s.add_dependency(
|
108
|
-
s.add_dependency(
|
109
|
-
s.add_dependency(
|
110
|
-
s.add_dependency(
|
111
|
-
s.add_dependency(
|
105
|
+
s.add_dependency("juwelier".freeze, ["~> 2.0"])
|
106
|
+
s.add_dependency("rspec_junit_formatter".freeze, [">= 0"])
|
107
|
+
s.add_dependency("rake".freeze, [">= 10.0"])
|
108
|
+
s.add_dependency("rspec".freeze, ["~> 3.1"])
|
109
|
+
s.add_dependency("activerecord".freeze, ["~> 5.0"])
|
110
|
+
s.add_dependency("activerecord-oracle_enhanced-adapter".freeze, ["~> 1.7"])
|
111
|
+
s.add_dependency("simplecov".freeze, [">= 0"])
|
112
|
+
s.add_dependency("ruby-oci8".freeze, ["~> 2.1"])
|
112
113
|
end
|
113
114
|
end
|
114
|
-
|
@@ -687,7 +687,7 @@ describe "Parameter type mapping /" do
|
|
687
687
|
is_approved BOOLEAN
|
688
688
|
);
|
689
689
|
|
690
|
-
TYPE table_of_records IS TABLE OF t_employee;
|
690
|
+
TYPE table_of_records IS TABLE OF test_record.t_employee;
|
691
691
|
|
692
692
|
FUNCTION test_full_name(p_employee t_employee)
|
693
693
|
RETURN VARCHAR2;
|
@@ -1101,7 +1101,7 @@ describe "Parameter type mapping /" do
|
|
1101
1101
|
last_name VARCHAR(50),
|
1102
1102
|
hire_date DATE
|
1103
1103
|
);
|
1104
|
-
TYPE t_employees IS TABLE OF t_employee;
|
1104
|
+
TYPE t_employees IS TABLE OF test_collections.t_employee;
|
1105
1105
|
FUNCTION test_employees (p_employees IN OUT t_employees)
|
1106
1106
|
RETURN t_employees;
|
1107
1107
|
-- these types with tables in lower level are not yet supported
|
@@ -1110,7 +1110,7 @@ describe "Parameter type mapping /" do
|
|
1110
1110
|
first_name VARCHAR2(50),
|
1111
1111
|
last_name VARCHAR(50),
|
1112
1112
|
hire_date DATE,
|
1113
|
-
numbers t_numbers
|
1113
|
+
numbers test_collections.t_numbers
|
1114
1114
|
);
|
1115
1115
|
FUNCTION test_employee2 (p_employee IN OUT t_employee2)
|
1116
1116
|
RETURN t_employee2;
|
@@ -1366,7 +1366,7 @@ describe "Parameter type mapping /" do
|
|
1366
1366
|
last_name VARCHAR(50),
|
1367
1367
|
hire_date DATE
|
1368
1368
|
);
|
1369
|
-
TYPE t_employees IS TABLE OF t_employee
|
1369
|
+
TYPE t_employees IS TABLE OF test_collections.t_employee
|
1370
1370
|
INDEX BY BINARY_INTEGER;
|
1371
1371
|
FUNCTION test_employees (p_employees IN OUT t_employees)
|
1372
1372
|
RETURN t_employees;
|
@@ -1508,6 +1508,12 @@ describe "Parameter type mapping /" do
|
|
1508
1508
|
end
|
1509
1509
|
|
1510
1510
|
describe "using Oracle 9.2" do
|
1511
|
+
before(:all) do
|
1512
|
+
# get actual database_version
|
1513
|
+
plsql.connect! CONNECTION_PARAMS
|
1514
|
+
skip "Skip if the actual database version is 18c or higher" if (plsql.connection.database_version <=> [18, 0, 0, 0]) >= 0
|
1515
|
+
end
|
1516
|
+
|
1511
1517
|
before do
|
1512
1518
|
# simulate Oracle 9.2 connection
|
1513
1519
|
plsql(:oracle_9).connection = get_connection
|
@@ -2358,3 +2364,27 @@ describe "#get_argument_metadata" do
|
|
2358
2364
|
end
|
2359
2365
|
end
|
2360
2366
|
end
|
2367
|
+
|
2368
|
+
describe "case-insensitive params" do
|
2369
|
+
before(:all) do
|
2370
|
+
plsql.connect! CONNECTION_PARAMS
|
2371
|
+
plsql.execute <<-SQL
|
2372
|
+
CREATE OR REPLACE FUNCTION test_func
|
2373
|
+
( p_string VARCHAR2 )
|
2374
|
+
RETURN VARCHAR2
|
2375
|
+
IS
|
2376
|
+
BEGIN
|
2377
|
+
RETURN UPPER(p_string);
|
2378
|
+
END test_func;
|
2379
|
+
SQL
|
2380
|
+
end
|
2381
|
+
|
2382
|
+
after(:all) do
|
2383
|
+
plsql.execute "DROP FUNCTION test_func"
|
2384
|
+
plsql.logoff
|
2385
|
+
end
|
2386
|
+
|
2387
|
+
it "should call procedure/function with case-insensitive param names" do
|
2388
|
+
expect { plsql.test_func(p_STRING: "xxx") }.not_to raise_error
|
2389
|
+
end
|
2390
|
+
end
|
data/spec/plsql/schema_spec.rb
CHANGED
@@ -229,11 +229,19 @@ describe "ActiveRecord connection" do
|
|
229
229
|
end
|
230
230
|
|
231
231
|
it "should safely close cursors in threaded environment" do
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
232
|
+
if (plsql.connection.database_version <=> [18, 0, 0, 0]) >= 0
|
233
|
+
expect {
|
234
|
+
t1 = Thread.new { plsql.dbms_session.sleep(1) }.tap { |t| t.abort_on_exception = true }
|
235
|
+
t2 = Thread.new { plsql.dbms_session.sleep(2) }.tap { |t| t.abort_on_exception = true }
|
236
|
+
[t2, t1].each { |t| t.join }
|
237
|
+
}.not_to raise_error
|
238
|
+
else
|
239
|
+
expect {
|
240
|
+
t1 = Thread.new { plsql.dbms_lock.sleep(1) }.tap { |t| t.abort_on_exception = true }
|
241
|
+
t2 = Thread.new { plsql.dbms_lock.sleep(2) }.tap { |t| t.abort_on_exception = true }
|
242
|
+
[t2, t1].each { |t| t.join }
|
243
|
+
}.not_to raise_error
|
244
|
+
end
|
237
245
|
end
|
238
246
|
|
239
247
|
end if defined?(ActiveRecord)
|
data/spec/plsql/table_spec.rb
CHANGED
@@ -215,6 +215,11 @@ describe "Table" do
|
|
215
215
|
expect(plsql.test_employees2.all("ORDER BY employee_id")).to eq(@employees2)
|
216
216
|
end
|
217
217
|
|
218
|
+
it "should insert with case-insensetive table name" do
|
219
|
+
plsql.test_employees.insert @employees.first.map { |k, v| [k.upcase.to_sym, v] }.to_h
|
220
|
+
expect(plsql.test_employees.all).to eq([@employees.first])
|
221
|
+
end
|
222
|
+
|
218
223
|
end
|
219
224
|
|
220
225
|
describe "insert values" do
|
data/spec/spec_helper.rb
CHANGED
@@ -85,7 +85,7 @@ def get_connection(user_number = 0)
|
|
85
85
|
OCI8.new(database_user, database_password, get_connection_url)
|
86
86
|
end
|
87
87
|
else
|
88
|
-
try_to_connect(
|
88
|
+
try_to_connect(Java::JavaSql::SQLException) do
|
89
89
|
java.sql.DriverManager.getConnection(get_connection_url, database_user, database_password)
|
90
90
|
end
|
91
91
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-plsql
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Raimonds Simanovskis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-08-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: juwelier
|
@@ -38,6 +38,48 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rubocop
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - '='
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0.81'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - '='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0.81'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop-performance
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rubocop-rails
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
41
83
|
- !ruby/object:Gem::Dependency
|
42
84
|
name: rake
|
43
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,8 +174,9 @@ extensions: []
|
|
132
174
|
extra_rdoc_files:
|
133
175
|
- README.md
|
134
176
|
files:
|
135
|
-
- ".codeclimate.yml"
|
136
177
|
- ".github/stale.yml"
|
178
|
+
- ".github/workflows/rubocop.yml"
|
179
|
+
- ".github/workflows/test.yml"
|
137
180
|
- ".rubocop.yml"
|
138
181
|
- ".travis.yml"
|
139
182
|
- ".travis/oracle/download.sh"
|
@@ -146,9 +189,14 @@ files:
|
|
146
189
|
- Rakefile
|
147
190
|
- VERSION
|
148
191
|
- Vagrantfile
|
192
|
+
- ci/network/admin/tnsnames.ora
|
193
|
+
- ci/setup_accounts.sh
|
149
194
|
- gemfiles/Gemfile.activerecord-5.0
|
150
195
|
- gemfiles/Gemfile.activerecord-5.1
|
151
196
|
- gemfiles/Gemfile.activerecord-5.2
|
197
|
+
- gemfiles/Gemfile.activerecord-6.0
|
198
|
+
- gemfiles/Gemfile.activerecord-6.1
|
199
|
+
- gemfiles/Gemfile.activerecord-main
|
152
200
|
- lib/plsql/connection.rb
|
153
201
|
- lib/plsql/helpers.rb
|
154
202
|
- lib/plsql/jdbc_connection.rb
|
@@ -205,8 +253,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
205
253
|
- !ruby/object:Gem::Version
|
206
254
|
version: '0'
|
207
255
|
requirements: []
|
208
|
-
|
209
|
-
rubygems_version: 2.7.7
|
256
|
+
rubygems_version: 3.2.22
|
210
257
|
signing_key:
|
211
258
|
specification_version: 4
|
212
259
|
summary: Ruby API for calling Oracle PL/SQL procedures.
|
data/.codeclimate.yml
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
checks:
|
2
|
-
argument-count:
|
3
|
-
enabled: false
|
4
|
-
complex-logic:
|
5
|
-
enabled: false
|
6
|
-
file-lines:
|
7
|
-
enabled: false
|
8
|
-
method-complexity:
|
9
|
-
enabled: false
|
10
|
-
method-count:
|
11
|
-
enabled: false
|
12
|
-
method-lines:
|
13
|
-
enabled: false
|
14
|
-
nested-control-flow:
|
15
|
-
enabled: false
|
16
|
-
return-statements:
|
17
|
-
enabled: false
|
18
|
-
similar-code:
|
19
|
-
enabled: false
|
20
|
-
identical-code:
|
21
|
-
enabled: false
|
22
|
-
|
23
|
-
engines:
|
24
|
-
rubocop:
|
25
|
-
enabled: true
|
26
|
-
channel: rubocop-0-58
|
27
|
-
|
28
|
-
ratings:
|
29
|
-
paths:
|
30
|
-
- "**.rb"
|