activerecord-oracle_enhanced-adapter 1.6.4 → 1.6.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/History.md +6 -1
- data/README.md +17 -0
- data/RUNNING_TESTS.md +3 -0
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +2 -2
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +8 -2
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +5 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +9 -9
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +8 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +24 -0
- data/spec/spec_helper.rb +11 -0
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60a3ec980dcf98f634383b6ae254f5de37b549f7
|
4
|
+
data.tar.gz: d217ce9bc4b2ee4352746ca29eae5c639496b92f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 091010e46da037032c6714d2522c9097dbb3acd156a9ebecd240fc9154c73163f4e84e0e996ddbe27ae0ca64e2f13261370d61825aca3ab20fd997602362e3fc
|
7
|
+
data.tar.gz: 81622c33e2565fbe6292aa70214f865db3dd9d3cb623aac56ae65ebf7669e911e09a6c6251503654e5ce893c34b56e140d105def665be8fa6dc58e68e5fa215a
|
data/History.md
CHANGED
@@ -1,6 +1,11 @@
|
|
1
|
+
## 1.6.5 / 2015-12-01
|
2
|
+
|
3
|
+
* Enhancement
|
4
|
+
* Support `schema` option to use schema objects owned by another schema[#742]
|
5
|
+
|
1
6
|
## 1.6.4 / 2015-11-09
|
2
7
|
|
3
|
-
* Changes and bug fixes since 1.6.
|
8
|
+
* Changes and bug fixes since 1.6.3
|
4
9
|
* Add table and column comments to structure dump and schema dump [#734]
|
5
10
|
* Remove `serialized_attributes` which is removed in Rails 5 [#694]
|
6
11
|
* fixing bundler dependency conflict with head of rails vs arel 6.0[#714]
|
data/README.md
CHANGED
@@ -489,6 +489,23 @@ ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.default_tablespaces =
|
|
489
489
|
{:clob => 'TS_LOB', :blob => 'TS_LOB', :index => 'TS_INDEX', :table => 'TS_DATA'}
|
490
490
|
```
|
491
491
|
|
492
|
+
### Switching to another schema
|
493
|
+
|
494
|
+
There are some requirements to connect to Oracle database first and switch to another user.
|
495
|
+
Oracle enhanced adapter supports schema: option.
|
496
|
+
|
497
|
+
Note: Oracle enhanced adapter does not take care if the database user specified in username: parameter
|
498
|
+
has appropriate privilege to select, insert, update and delete database objects owned by the schema specified in schema: parameter.
|
499
|
+
|
500
|
+
```yml
|
501
|
+
development:
|
502
|
+
adapter: oracle_enhanced
|
503
|
+
database: xe
|
504
|
+
username: user
|
505
|
+
password: secret
|
506
|
+
schema: tableowner
|
507
|
+
```
|
508
|
+
|
492
509
|
TROUBLESHOOTING
|
493
510
|
---------------
|
494
511
|
|
data/RUNNING_TESTS.md
CHANGED
@@ -26,6 +26,9 @@ Running tests
|
|
26
26
|
SQL> CREATE USER oracle_enhanced IDENTIFIED BY oracle_enhanced;
|
27
27
|
SQL> GRANT unlimited tablespace, create session, create table, create sequence, create procedure, create trigger, create view, create materialized view, create database link, create synonym, create type, ctxapp TO oracle_enhanced;
|
28
28
|
|
29
|
+
SQL> CREATE USER oracle_enhanced_schema IDENTIFIED BY oracle_enhanced_schema;
|
30
|
+
SQL> GRANT unlimited tablespace, create session, create table, create sequence, create procedure, create trigger, create view, create materialized view, create database link, create synonym, create type, ctxapp TO oracle_enhanced_schema;
|
31
|
+
|
29
32
|
* If you use RVM then switch to corresponding Ruby (1.8.7, 1.9.2 or JRuby) and it is recommended to create isolated gemset for test purposes (e.g. rvm create gemset oracle_enhanced)
|
30
33
|
|
31
34
|
* Install bundler with
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.6.
|
1
|
+
1.6.5
|
@@ -5,12 +5,12 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{activerecord-oracle_enhanced-adapter}
|
8
|
-
s.version = "1.6.
|
8
|
+
s.version = "1.6.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.license = 'MIT'
|
12
12
|
s.authors = [%q{Raimonds Simanovskis}]
|
13
|
-
s.date = %q{2015-
|
13
|
+
s.date = %q{2015-12-01}
|
14
14
|
s.description = %q{Oracle "enhanced" ActiveRecord adapter contains useful additional methods for working with new and legacy Oracle databases.
|
15
15
|
This adapter is superset of original ActiveRecord Oracle adapter.
|
16
16
|
}
|
@@ -159,8 +159,14 @@ module ActiveRecord
|
|
159
159
|
|
160
160
|
self.autocommit = true
|
161
161
|
|
162
|
-
|
163
|
-
|
162
|
+
schema = config[:schema] && config[:schema].to_s
|
163
|
+
if schema.blank?
|
164
|
+
# default schema owner
|
165
|
+
@owner = username.upcase unless username.nil?
|
166
|
+
else
|
167
|
+
exec "alter session set current_schema = #{schema}"
|
168
|
+
@owner = schema
|
169
|
+
end
|
164
170
|
|
165
171
|
@raw_connection
|
166
172
|
end
|
@@ -25,7 +25,9 @@ module ActiveRecord
|
|
25
25
|
def initialize(config)
|
26
26
|
@raw_connection = OCI8EnhancedAutoRecover.new(config, OracleEnhancedOCIFactory)
|
27
27
|
# default schema owner
|
28
|
-
@owner = config[:
|
28
|
+
@owner = config[:schema]
|
29
|
+
@owner ||= config[:username]
|
30
|
+
@owner = @owner.to_s.upcase
|
29
31
|
end
|
30
32
|
|
31
33
|
def raw_oci_connection
|
@@ -306,6 +308,7 @@ module ActiveRecord
|
|
306
308
|
username = config[:username] && config[:username].to_s
|
307
309
|
password = config[:password] && config[:password].to_s
|
308
310
|
database = config[:database] && config[:database].to_s
|
311
|
+
schema = config[:schema] && config[:schema].to_s
|
309
312
|
host, port = config[:host], config[:port]
|
310
313
|
privilege = config[:privilege] && config[:privilege].to_sym
|
311
314
|
async = config[:allow_concurrency]
|
@@ -333,6 +336,7 @@ module ActiveRecord
|
|
333
336
|
conn.prefetch_rows = prefetch_rows
|
334
337
|
conn.exec "alter session set cursor_sharing = #{cursor_sharing}" rescue nil
|
335
338
|
conn.exec "alter session set time_zone = '#{time_zone}'" unless time_zone.blank?
|
339
|
+
conn.exec "alter session set current_schema = #{schema}" unless schema.blank?
|
336
340
|
|
337
341
|
# Initialize NLS parameters
|
338
342
|
OracleEnhancedAdapter::DEFAULT_NLS_PARAMETERS.each do |key, default_value|
|
@@ -10,7 +10,7 @@ module ActiveRecord #:nodoc:
|
|
10
10
|
"CREATE SEQUENCE \"#{seq}\""
|
11
11
|
end
|
12
12
|
select_values("SELECT table_name FROM all_tables t
|
13
|
-
WHERE owner = SYS_CONTEXT('userenv', '
|
13
|
+
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'
|
14
14
|
AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv WHERE mv.owner = t.owner AND mv.mview_name = t.table_name)
|
15
15
|
AND NOT EXISTS (SELECT mvl.log_table FROM all_mview_logs mvl WHERE mvl.log_owner = t.owner AND mvl.log_table = t.table_name)
|
16
16
|
ORDER BY 1").each do |table_name|
|
@@ -79,7 +79,7 @@ module ActiveRecord #:nodoc:
|
|
79
79
|
ON a.constraint_name = c.constraint_name
|
80
80
|
WHERE c.table_name = '#{table.upcase}'
|
81
81
|
AND c.constraint_type = 'P'
|
82
|
-
AND c.owner = SYS_CONTEXT('userenv', '
|
82
|
+
AND c.owner = SYS_CONTEXT('userenv', 'current_schema')
|
83
83
|
SQL
|
84
84
|
pks.each do |row|
|
85
85
|
opts[:name] = row['constraint_name']
|
@@ -97,7 +97,7 @@ module ActiveRecord #:nodoc:
|
|
97
97
|
ON a.constraint_name = c.constraint_name
|
98
98
|
WHERE c.table_name = '#{table.upcase}'
|
99
99
|
AND c.constraint_type = 'U'
|
100
|
-
AND c.owner = SYS_CONTEXT('userenv', '
|
100
|
+
AND c.owner = SYS_CONTEXT('userenv', 'current_schema')
|
101
101
|
SQL
|
102
102
|
uks.each do |uk|
|
103
103
|
keys[uk['constraint_name']] ||= []
|
@@ -125,7 +125,7 @@ module ActiveRecord #:nodoc:
|
|
125
125
|
end
|
126
126
|
|
127
127
|
def structure_dump_fk_constraints #:nodoc:
|
128
|
-
fks = select_all("SELECT table_name FROM all_tables WHERE owner = SYS_CONTEXT('userenv', '
|
128
|
+
fks = select_all("SELECT table_name FROM all_tables WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1").map do |table|
|
129
129
|
if respond_to?(:foreign_keys) && (foreign_keys = foreign_keys(table["table_name"])).any?
|
130
130
|
foreign_keys.map do |fk|
|
131
131
|
sql = "ALTER TABLE #{quote_table_name(fk.from_table)} ADD CONSTRAINT #{quote_column_name(fk.options[:name])} "
|
@@ -196,14 +196,14 @@ module ActiveRecord #:nodoc:
|
|
196
196
|
FROM all_source
|
197
197
|
WHERE type IN ('PROCEDURE', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION', 'TRIGGER', 'TYPE')
|
198
198
|
AND name NOT LIKE 'BIN$%'
|
199
|
-
AND owner = SYS_CONTEXT('userenv', '
|
199
|
+
AND owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY type").each do |source|
|
200
200
|
ddl = "CREATE OR REPLACE \n"
|
201
201
|
select_all(%Q{
|
202
202
|
SELECT text
|
203
203
|
FROM all_source
|
204
204
|
WHERE name = '#{source['name']}'
|
205
205
|
AND type = '#{source['type']}'
|
206
|
-
AND owner = SYS_CONTEXT('userenv', '
|
206
|
+
AND owner = SYS_CONTEXT('userenv', 'current_schema')
|
207
207
|
ORDER BY line
|
208
208
|
}).each do |row|
|
209
209
|
ddl << row['text']
|
@@ -220,7 +220,7 @@ module ActiveRecord #:nodoc:
|
|
220
220
|
# export synonyms
|
221
221
|
select_all("SELECT owner, synonym_name, table_name, table_owner
|
222
222
|
FROM all_synonyms
|
223
|
-
WHERE owner = SYS_CONTEXT('userenv', '
|
223
|
+
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ").each do |synonym|
|
224
224
|
structure << "CREATE OR REPLACE #{synonym['owner'] == 'PUBLIC' ? 'PUBLIC' : '' } SYNONYM #{synonym['synonym_name']}
|
225
225
|
FOR #{synonym['table_owner']}.#{synonym['table_name']}"
|
226
226
|
end
|
@@ -233,7 +233,7 @@ module ActiveRecord #:nodoc:
|
|
233
233
|
"DROP SEQUENCE \"#{seq}\""
|
234
234
|
end
|
235
235
|
select_values("SELECT table_name from all_tables t
|
236
|
-
WHERE owner = SYS_CONTEXT('userenv', '
|
236
|
+
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'
|
237
237
|
AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv WHERE mv.owner = t.owner AND mv.mview_name = t.table_name)
|
238
238
|
AND NOT EXISTS (SELECT mvl.log_table FROM all_mview_logs mvl WHERE mvl.log_owner = t.owner AND mvl.log_table = t.table_name)
|
239
239
|
ORDER BY 1").each do |table|
|
@@ -245,7 +245,7 @@ module ActiveRecord #:nodoc:
|
|
245
245
|
def temp_table_drop #:nodoc:
|
246
246
|
join_with_statement_token(select_values(
|
247
247
|
"SELECT table_name FROM all_tables
|
248
|
-
WHERE owner = SYS_CONTEXT('userenv', '
|
248
|
+
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N' AND temporary = 'Y' ORDER BY 1").map do |table|
|
249
249
|
"DROP TABLE \"#{table}\" CASCADE CONSTRAINTS"
|
250
250
|
end)
|
251
251
|
end
|
@@ -849,14 +849,19 @@ module ActiveRecord
|
|
849
849
|
select_value("SELECT SYS_CONTEXT('userenv', 'session_user') FROM dual")
|
850
850
|
end
|
851
851
|
|
852
|
+
# Current database session schema
|
853
|
+
def current_schema
|
854
|
+
select_value("SELECT SYS_CONTEXT('userenv', 'current_schema') FROM dual")
|
855
|
+
end
|
856
|
+
|
852
857
|
# Default tablespace name of current user
|
853
858
|
def default_tablespace
|
854
|
-
select_value("SELECT LOWER(default_tablespace) FROM user_users WHERE username = SYS_CONTEXT('userenv', '
|
859
|
+
select_value("SELECT LOWER(default_tablespace) FROM user_users WHERE username = SYS_CONTEXT('userenv', 'current_schema')")
|
855
860
|
end
|
856
861
|
|
857
862
|
def tables(name = nil) #:nodoc:
|
858
863
|
select_values(
|
859
|
-
"SELECT DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name) FROM all_tables WHERE owner = SYS_CONTEXT('userenv', '
|
864
|
+
"SELECT DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name) FROM all_tables WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'",
|
860
865
|
name)
|
861
866
|
end
|
862
867
|
|
@@ -869,7 +874,7 @@ module ActiveRecord
|
|
869
874
|
end
|
870
875
|
|
871
876
|
def materialized_views #:nodoc:
|
872
|
-
select_values("SELECT LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', '
|
877
|
+
select_values("SELECT LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', 'current_schema')")
|
873
878
|
end
|
874
879
|
|
875
880
|
cattr_accessor :all_schema_indexes #:nodoc:
|
@@ -35,6 +35,30 @@ describe "OracleEnhancedConnection" do
|
|
35
35
|
|
36
36
|
end
|
37
37
|
|
38
|
+
describe "create connection with schema option" do
|
39
|
+
before(:all) do
|
40
|
+
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_WITH_SCHEMA_PARAMS)
|
41
|
+
end
|
42
|
+
|
43
|
+
before(:each) do
|
44
|
+
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(CONNECTION_WITH_SCHEMA_PARAMS) unless @conn.active?
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should create new connection" do
|
48
|
+
@conn.should be_active
|
49
|
+
end
|
50
|
+
|
51
|
+
it "should swith to specified schema" do
|
52
|
+
@conn.select_value("select SYS_CONTEXT('userenv', 'current_schema') from dual").should == CONNECTION_WITH_SCHEMA_PARAMS[:schema].upcase
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should swith to specified schema after reset" do
|
56
|
+
@conn.reset!
|
57
|
+
@conn.select_value("select SYS_CONTEXT('userenv', 'current_schema') from dual").should == CONNECTION_WITH_SCHEMA_PARAMS[:schema].upcase
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
38
62
|
describe "create connection with NLS parameters" do
|
39
63
|
after do
|
40
64
|
ENV['NLS_DATE_FORMAT'] = nil
|
data/spec/spec_helper.rb
CHANGED
@@ -125,6 +125,7 @@ DATABASE_HOST = config["database"]["host"] || ENV['DATABASE_HOST
|
|
125
125
|
DATABASE_PORT = config["database"]["port"] || ENV['DATABASE_PORT'] || 1521
|
126
126
|
DATABASE_USER = config["database"]["user"] || ENV['DATABASE_USER'] || 'oracle_enhanced'
|
127
127
|
DATABASE_PASSWORD = config["database"]["password"] || ENV['DATABASE_PASSWORD'] || 'oracle_enhanced'
|
128
|
+
DATABASE_SCHEMA = config["database"]["schema"] || ENV['DATABASE_SCHEMA'] || 'oracle_enhanced_schema'
|
128
129
|
DATABASE_SYS_PASSWORD = config["database"]["sys_password"] || ENV['DATABASE_SYS_PASSWORD'] || 'admin'
|
129
130
|
|
130
131
|
CONNECTION_PARAMS = {
|
@@ -136,6 +137,16 @@ CONNECTION_PARAMS = {
|
|
136
137
|
:password => DATABASE_PASSWORD
|
137
138
|
}
|
138
139
|
|
140
|
+
CONNECTION_WITH_SCHEMA_PARAMS = {
|
141
|
+
:adapter => "oracle_enhanced",
|
142
|
+
:database => DATABASE_NAME,
|
143
|
+
:host => DATABASE_HOST,
|
144
|
+
:port => DATABASE_PORT,
|
145
|
+
:username => DATABASE_USER,
|
146
|
+
:password => DATABASE_PASSWORD,
|
147
|
+
:schema => DATABASE_SCHEMA
|
148
|
+
}
|
149
|
+
|
139
150
|
SYS_CONNECTION_PARAMS = {
|
140
151
|
:adapter => "oracle_enhanced",
|
141
152
|
:database => DATABASE_NAME,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activerecord-oracle_enhanced-adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.6.
|
4
|
+
version: 1.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Raimonds Simanovskis
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-12-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: jeweler
|