ruby-plsql 0.7.1 → 0.8.0
Sign up to get free protection for your applications and to get access to all the features.
- 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"
|