activerecord-oracle_enhanced-adapter 1.4.0 → 1.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/Gemfile +17 -6
- data/{History.txt → History.md} +36 -19
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +12 -9
- data/lib/active_record/connection_adapters/oracle_enhanced.rake +34 -25
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +105 -25
- data/lib/active_record/connection_adapters/oracle_enhanced_base_ext.rb +13 -7
- data/lib/active_record/connection_adapters/oracle_enhanced_connection.rb +2 -2
- data/lib/active_record/connection_adapters/oracle_enhanced_core_ext.rb +4 -3
- data/lib/active_record/connection_adapters/oracle_enhanced_jdbc_connection.rb +14 -9
- data/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb +2 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +8 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +93 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +23 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_core_ext_spec.rb +0 -20
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +1 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +2 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +47 -4
- data/spec/spec_helper.rb +6 -15
- metadata +124 -164
data/Gemfile
CHANGED
@@ -21,20 +21,31 @@ group :development do
|
|
21
21
|
gem 'railties', "=#{ENV['RAILS_GEM_VERSION']}"
|
22
22
|
end
|
23
23
|
else
|
24
|
-
# uses local copy of Rails 3 and Arel gems
|
25
|
-
ENV['RAILS_GEM_PATH'] ||= File.expand_path('../../rails', __FILE__)
|
26
24
|
%w(activerecord activemodel activesupport actionpack railties).each do |gem_name|
|
27
|
-
|
25
|
+
if ENV['RAILS_GEM_PATH']
|
26
|
+
gem gem_name, :path => File.join(ENV['RAILS_GEM_PATH'], gem_name)
|
27
|
+
else
|
28
|
+
gem gem_name, :git => "git://github.com/rails/rails"
|
29
|
+
end
|
28
30
|
end
|
29
31
|
|
30
|
-
ENV['AREL_GEM_PATH']
|
31
|
-
|
32
|
+
if ENV['AREL_GEM_PATH']
|
33
|
+
gem 'arel', :path => ENV['AREL_GEM_PATH']
|
34
|
+
else
|
35
|
+
gem 'arel', :git => "git://github.com/rails/arel"
|
36
|
+
end
|
37
|
+
|
38
|
+
if ENV['JOURNEY_GEM_PATH']
|
39
|
+
gem 'journey', :path => ENV['JOURNEY_GEM_PATH']
|
40
|
+
else
|
41
|
+
gem "journey", :git => "git://github.com/rails/journey"
|
42
|
+
end
|
32
43
|
end
|
33
44
|
|
34
45
|
gem 'ruby-plsql', '>=0.4.4'
|
35
46
|
|
36
47
|
platforms :ruby do
|
37
|
-
gem 'ruby-oci8', '
|
48
|
+
gem 'ruby-oci8', '>=2.0.4'
|
38
49
|
end
|
39
50
|
|
40
51
|
end
|
data/{History.txt → History.md}
RENAMED
@@ -1,4 +1,21 @@
|
|
1
|
-
|
1
|
+
### 1.4.1 / 2011-01-27
|
2
|
+
|
3
|
+
* Enhancements:
|
4
|
+
* Support for Rails 3.2
|
5
|
+
* Support for ActiveRecord 3.2 explain plans [#116]
|
6
|
+
* Support for ActiveRecord 3.1 statement pool, to avoid `ORA-01000` maximum open cursors exceeded (default `statement_limit` is 250 and can be changed in `database.yml`) [#100]
|
7
|
+
* Added error handling for `rename_table` method in migrations [#137]
|
8
|
+
* Bug fixes:
|
9
|
+
* Store primary key as `nil` in cache at first time for table without primary key [#84]
|
10
|
+
* Fixed inserting records with decimal type columns (`ORA-01722` invalid number exceptions) [#130]
|
11
|
+
* Check virtual columns only in models that are using `oracle-enhanced` adapter, to avoid problems when using multiple database adapters [#85]
|
12
|
+
* Don't drop the user in rake `db:create` and `db:drop` tasks [#103]
|
13
|
+
* Don't add `db:create` and `db:drop` when ActiveRecord is not used as the primary datastore [#128]
|
14
|
+
* Quote column names in LOB statements to avoid `ORA-00936` errors [#91]
|
15
|
+
* Don't add the `RETURNING` clause if using `composite_primary_keys` gem [#132]
|
16
|
+
* Added `join_to_update` method that is necessary for ActiveRecord 3.1 to ensure that correct UPDATE statement is generated using `WHERE ... IN` subquery with offset condition
|
17
|
+
|
18
|
+
### 1.4.0 / 2011-08-09
|
2
19
|
|
3
20
|
* Enhancements:
|
4
21
|
* Support for Rails 3.1
|
@@ -17,7 +34,7 @@
|
|
17
34
|
* Fixed schema dump not to conflict with other database adapters that are used in the same application
|
18
35
|
* Allow $ in table name prefix or suffix
|
19
36
|
|
20
|
-
|
37
|
+
### 1.3.2 / 2011-01-05
|
21
38
|
|
22
39
|
* Enhancements:
|
23
40
|
* If no :host or :port is provided then connect with :database name (do not default :host to localhost)
|
@@ -31,7 +48,7 @@
|
|
31
48
|
* Quote NCHAR and NVARCHAR2 type values with N'...'
|
32
49
|
* Numeric username and/or password in database.yml will be automatically converted to string
|
33
50
|
|
34
|
-
|
51
|
+
### 1.3.1 / 2010-09-09
|
35
52
|
|
36
53
|
* Enhancements:
|
37
54
|
* Tested with Rails 3.0.0 release
|
@@ -48,7 +65,7 @@
|
|
48
65
|
* removed String.mb_chars upcase and downcase methods for Ruby 1.9 as Rails 3.0.0 already includes Unicode aware upcase and downcase methods for Ruby 1.9
|
49
66
|
* Fixes for latest ActiveRecord unit tests
|
50
67
|
|
51
|
-
|
68
|
+
### 1.3.0 / 2010-06-21
|
52
69
|
|
53
70
|
* Enhancements:
|
54
71
|
* Rails 3.0.0.beta4 and Rails 2.3.x compatible
|
@@ -68,7 +85,7 @@
|
|
68
85
|
* Fixes for schema dump and structure dump (use correct statement separator)
|
69
86
|
* Only use Oracle specific schema dump for Oracle connections
|
70
87
|
|
71
|
-
|
88
|
+
### 1.2.4 / 2010-02-23
|
72
89
|
|
73
90
|
* Enhancements:
|
74
91
|
* rake db:test:purge will drop all schema objects from test schema (including views, synonyms, packages, functions, procedures) -
|
@@ -85,7 +102,7 @@
|
|
85
102
|
(to avoid issues with _before_type_cast values for id attributes because _before_type_cast is used in form helpers)
|
86
103
|
* clear table columns cache after columns definition change in migrations
|
87
104
|
|
88
|
-
|
105
|
+
### 1.2.3 / 2009-12-09
|
89
106
|
|
90
107
|
* Enhancements
|
91
108
|
* support fractional seconds in TIMESTAMP values
|
@@ -105,7 +122,7 @@
|
|
105
122
|
* fixed custom create/update/delete methods with ActiveRecord 2.3+ and timestamps
|
106
123
|
* do not call oracle_enhanced specific schema dump methods when using other database adapters
|
107
124
|
|
108
|
-
|
125
|
+
### 1.2.2 / 2009-09-28
|
109
126
|
|
110
127
|
* Enhancements
|
111
128
|
* improved RDoc documentation of public methods
|
@@ -139,7 +156,7 @@
|
|
139
156
|
* ignore :limit option for :text and :binary columns in migrations
|
140
157
|
* patches for ActiveRecord schema dumper to remove table prefixes and suffixes from schema.rb
|
141
158
|
|
142
|
-
|
159
|
+
### 1.2.1 / 2009-06-07
|
143
160
|
|
144
161
|
* Enhancements
|
145
162
|
* caching of table indexes query which makes schema dump much faster
|
@@ -150,7 +167,7 @@
|
|
150
167
|
* Made test tasks respect RAILS_ENV
|
151
168
|
* fixed support for composite primary keys for tables with LOBs
|
152
169
|
|
153
|
-
|
170
|
+
### 1.2.0 / 2009-03-22
|
154
171
|
|
155
172
|
* Enhancements
|
156
173
|
* support for JRuby and JDBC
|
@@ -161,7 +178,7 @@
|
|
161
178
|
* Bug fixes:
|
162
179
|
* several bug fixes that were identified during running of ActiveRecord unit tests
|
163
180
|
|
164
|
-
|
181
|
+
### 1.1.9 / 2009-01-02
|
165
182
|
|
166
183
|
* Enhancements
|
167
184
|
* Added support for table and column comments in migrations
|
@@ -171,7 +188,7 @@
|
|
171
188
|
* Do not mark empty decimals, strings and texts (stored as NULL in database) as changed when reassigning them (starting from Rails 2.1)
|
172
189
|
* Create booleans as VARCHAR2(1) columns if emulate_booleans_from_strings is true
|
173
190
|
|
174
|
-
|
191
|
+
### 1.1.8 / 2008-10-10
|
175
192
|
|
176
193
|
* Bug fixes:
|
177
194
|
* Fixed storing of serialized LOB columns
|
@@ -185,12 +202,12 @@
|
|
185
202
|
* Fixed bug when ActiveRecord::Base.allow_concurrency = true
|
186
203
|
(see http://dev.rubyonrails.org/ticket/11134)
|
187
204
|
|
188
|
-
|
205
|
+
### 1.1.7 / 2008-08-20
|
189
206
|
|
190
207
|
* Bug fixes:
|
191
208
|
* Fixed that adapter works without ruby-plsql gem (in this case just custom create/update/delete methods are not available)
|
192
209
|
|
193
|
-
|
210
|
+
### 1.1.6 / 2008-08-19
|
194
211
|
|
195
212
|
* Enhancements:
|
196
213
|
* Added support for set_date_columns and set_datetime_columns
|
@@ -200,7 +217,7 @@
|
|
200
217
|
* Bug fixes:
|
201
218
|
* Do not call write_lobs callback when custom create or update methods are defined
|
202
219
|
|
203
|
-
|
220
|
+
### 1.1.5 / 2008-07-27
|
204
221
|
|
205
222
|
* Bug fixes:
|
206
223
|
* Fixed that write_lobs callback works with partial_updates enabled (added additional record lock before writing BLOB data to database)
|
@@ -208,26 +225,26 @@
|
|
208
225
|
* Changed SQL SELECT in indexes method so that it will execute faster on some large data dictionaries
|
209
226
|
* Support for other date and time formats when assigning string to :date or :datetime column
|
210
227
|
|
211
|
-
|
228
|
+
### 1.1.4 / 2008-07-14
|
212
229
|
|
213
230
|
* Enhancements:
|
214
231
|
* Date/Time quoting changes to support composite_primary_keys
|
215
232
|
* Added additional methods that are used by composite_primary_keys
|
216
233
|
|
217
|
-
|
234
|
+
### 1.1.3 / 2008-07-10
|
218
235
|
|
219
236
|
* Enhancements:
|
220
237
|
* Added support for custom create, update and delete methods when working with legacy databases where
|
221
238
|
PL/SQL API should be used for create, update and delete operations
|
222
239
|
|
223
|
-
|
240
|
+
### 1.1.2 / 2008-07-08
|
224
241
|
|
225
242
|
* Bug fixes:
|
226
243
|
* Fixed after_save callback addition for session store in ActiveRecord version 2.0.2
|
227
244
|
* Changed date column name recognition - now should match regex /(^|_)date(_|$)/i
|
228
245
|
(previously "updated_at" was recognized as :date column and not as :datetime)
|
229
246
|
|
230
|
-
|
247
|
+
### 1.1.1 / 2008-06-28
|
231
248
|
|
232
249
|
* Enhancements:
|
233
250
|
* Added ignore_table_columns option
|
@@ -237,7 +254,7 @@
|
|
237
254
|
* Checks if CGI::Session::ActiveRecordStore::Session does not have enhanced_write_lobs callback before adding it
|
238
255
|
(Rails 2.0 does not add this callback, Rails 2.1 does)
|
239
256
|
|
240
|
-
|
257
|
+
### 1.1.0 / 2008-05-05
|
241
258
|
|
242
259
|
* Forked from original activerecord-oracle-adapter-1.0.0.9216
|
243
260
|
* Renamed oracle adapter to oracle_enhanced adapter
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.4.
|
1
|
+
1.4.1
|
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{activerecord-oracle_enhanced-adapter}
|
8
|
-
s.version = "1.4.
|
8
|
+
s.version = "1.4.1"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.date = %q{
|
11
|
+
s.authors = [%q{Raimonds Simanovskis}]
|
12
|
+
s.date = %q{2012-01-27}
|
13
13
|
s.description = %q{Oracle "enhanced" ActiveRecord adapter contains useful additional methods for working with new and legacy Oracle databases.
|
14
14
|
This adapter is superset of original ActiveRecord Oracle adapter.
|
15
15
|
}
|
@@ -20,7 +20,7 @@ This adapter is superset of original ActiveRecord Oracle adapter.
|
|
20
20
|
s.files = [
|
21
21
|
".rspec",
|
22
22
|
"Gemfile",
|
23
|
-
"History.
|
23
|
+
"History.md",
|
24
24
|
"License.txt",
|
25
25
|
"README.md",
|
26
26
|
"RUNNING_TESTS.md",
|
@@ -65,8 +65,8 @@ This adapter is superset of original ActiveRecord Oracle adapter.
|
|
65
65
|
"spec/spec_helper.rb"
|
66
66
|
]
|
67
67
|
s.homepage = %q{http://github.com/rsim/oracle-enhanced}
|
68
|
-
s.require_paths = [
|
69
|
-
s.rubygems_version = %q{1.6
|
68
|
+
s.require_paths = [%q{lib}]
|
69
|
+
s.rubygems_version = %q{1.8.6}
|
70
70
|
s.summary = %q{Oracle enhanced adapter for ActiveRecord}
|
71
71
|
s.test_files = [
|
72
72
|
"spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb",
|
@@ -97,8 +97,9 @@ This adapter is superset of original ActiveRecord Oracle adapter.
|
|
97
97
|
s.add_development_dependency(%q<actionpack>, [">= 0"])
|
98
98
|
s.add_development_dependency(%q<railties>, [">= 0"])
|
99
99
|
s.add_development_dependency(%q<arel>, [">= 0"])
|
100
|
+
s.add_development_dependency(%q<journey>, [">= 0"])
|
100
101
|
s.add_development_dependency(%q<ruby-plsql>, [">= 0.4.4"])
|
101
|
-
s.add_development_dependency(%q<ruby-oci8>, ["
|
102
|
+
s.add_development_dependency(%q<ruby-oci8>, [">= 2.0.4"])
|
102
103
|
else
|
103
104
|
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
104
105
|
s.add_dependency(%q<rspec>, ["~> 2.4"])
|
@@ -108,8 +109,9 @@ This adapter is superset of original ActiveRecord Oracle adapter.
|
|
108
109
|
s.add_dependency(%q<actionpack>, [">= 0"])
|
109
110
|
s.add_dependency(%q<railties>, [">= 0"])
|
110
111
|
s.add_dependency(%q<arel>, [">= 0"])
|
112
|
+
s.add_dependency(%q<journey>, [">= 0"])
|
111
113
|
s.add_dependency(%q<ruby-plsql>, [">= 0.4.4"])
|
112
|
-
s.add_dependency(%q<ruby-oci8>, ["
|
114
|
+
s.add_dependency(%q<ruby-oci8>, [">= 2.0.4"])
|
113
115
|
end
|
114
116
|
else
|
115
117
|
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
@@ -120,8 +122,9 @@ This adapter is superset of original ActiveRecord Oracle adapter.
|
|
120
122
|
s.add_dependency(%q<actionpack>, [">= 0"])
|
121
123
|
s.add_dependency(%q<railties>, [">= 0"])
|
122
124
|
s.add_dependency(%q<arel>, [">= 0"])
|
125
|
+
s.add_dependency(%q<journey>, [">= 0"])
|
123
126
|
s.add_dependency(%q<ruby-plsql>, [">= 0.4.4"])
|
124
|
-
s.add_dependency(%q<ruby-oci8>, ["
|
127
|
+
s.add_dependency(%q<ruby-oci8>, [">= 2.0.4"])
|
125
128
|
end
|
126
129
|
end
|
127
130
|
|
@@ -16,37 +16,46 @@ def redefine_task(*args, &block)
|
|
16
16
|
end
|
17
17
|
|
18
18
|
# Creates database user with db:create
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
19
|
+
if defined?(create_database) == 'method'
|
20
|
+
def create_database_with_oracle_enhanced(config)
|
21
|
+
if config['adapter'] == 'oracle_enhanced'
|
22
|
+
print "Please provide the SYSTEM password for your oracle installation\n>"
|
23
|
+
system_password = $stdin.gets.strip
|
24
|
+
ActiveRecord::Base.establish_connection(config.merge('username' => 'SYSTEM', 'password' => system_password))
|
25
|
+
begin
|
26
|
+
ActiveRecord::Base.connection.execute "CREATE USER #{config['username']} IDENTIFIED BY #{config['password']}"
|
27
|
+
rescue => e
|
28
|
+
if e.message =~ /ORA-01920/ # user name conflicts with another user or role name
|
29
|
+
ActiveRecord::Base.connection.execute "ALTER USER #{config['username']} IDENTIFIED BY #{config['password']}"
|
30
|
+
else
|
31
|
+
raise e
|
32
|
+
end
|
33
|
+
end
|
34
|
+
ActiveRecord::Base.connection.execute "GRANT unlimited tablespace TO #{config['username']}"
|
35
|
+
ActiveRecord::Base.connection.execute "GRANT create session TO #{config['username']}"
|
36
|
+
ActiveRecord::Base.connection.execute "GRANT create table TO #{config['username']}"
|
37
|
+
ActiveRecord::Base.connection.execute "GRANT create sequence TO #{config['username']}"
|
38
|
+
else
|
39
|
+
create_database_without_oracle_enhanced(config)
|
40
|
+
end
|
32
41
|
end
|
42
|
+
alias :create_database_without_oracle_enhanced :create_database
|
43
|
+
alias :create_database :create_database_with_oracle_enhanced
|
33
44
|
end
|
34
|
-
alias :create_database_without_oracle_enhanced :create_database
|
35
|
-
alias :create_database :create_database_with_oracle_enhanced
|
36
45
|
|
37
46
|
# Drops database user with db:drop
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
47
|
+
if defined?(drop_database) == 'method'
|
48
|
+
def drop_database_with_oracle_enhanced(config)
|
49
|
+
if config['adapter'] == 'oracle_enhanced'
|
50
|
+
ActiveRecord::Base.establish_connection(config)
|
51
|
+
ActiveRecord::Base.connection.execute_structure_dump(ActiveRecord::Base.connection.full_drop)
|
52
|
+
else
|
53
|
+
drop_database_without_oracle_enhanced(config)
|
54
|
+
end
|
46
55
|
end
|
56
|
+
alias :drop_database_without_oracle_enhanced :drop_database
|
57
|
+
alias :drop_database :drop_database_with_oracle_enhanced
|
47
58
|
end
|
48
|
-
alias :drop_database_without_oracle_enhanced :drop_database
|
49
|
-
alias :drop_database :drop_database_with_oracle_enhanced
|
50
59
|
|
51
60
|
namespace :db do
|
52
61
|
|
@@ -7,7 +7,7 @@
|
|
7
7
|
#
|
8
8
|
#########################################################################
|
9
9
|
#
|
10
|
-
# See History.
|
10
|
+
# See History.md for changes added to original oracle_adapter.rb
|
11
11
|
#
|
12
12
|
#########################################################################
|
13
13
|
#
|
@@ -235,11 +235,43 @@ module ActiveRecord
|
|
235
235
|
cattr_accessor :string_to_time_format
|
236
236
|
self.string_to_time_format = nil
|
237
237
|
|
238
|
-
|
239
|
-
|
238
|
+
class StatementPool
|
239
|
+
include Enumerable
|
240
|
+
|
241
|
+
def initialize(connection, max = 300)
|
242
|
+
@connection = connection
|
243
|
+
@max = max
|
244
|
+
@cache = {}
|
245
|
+
end
|
246
|
+
|
247
|
+
def each(&block); @cache.each(&block); end
|
248
|
+
def key?(key); @cache.key?(key); end
|
249
|
+
def [](key); @cache[key]; end
|
250
|
+
def length; @cache.length; end
|
251
|
+
def delete(key); @cache.delete(key); end
|
252
|
+
|
253
|
+
def []=(sql, key)
|
254
|
+
while @max <= @cache.size
|
255
|
+
@cache.shift.last.close
|
256
|
+
end
|
257
|
+
@cache[sql] = key
|
258
|
+
end
|
259
|
+
|
260
|
+
def clear
|
261
|
+
@cache.values.each do |cursor|
|
262
|
+
cursor.close
|
263
|
+
end
|
264
|
+
@cache.clear
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
def initialize(connection, logger, config) #:nodoc:
|
269
|
+
super(connection, logger)
|
240
270
|
@quoted_column_names, @quoted_table_names = {}, {}
|
241
|
-
@
|
271
|
+
@config = config
|
272
|
+
@statements = StatementPool.new(connection, config.fetch(:statement_limit) { 250 })
|
242
273
|
@enable_dbms_output = false
|
274
|
+
@visitor = Arel::Visitors::Oracle.new self if defined?(Arel::Visitors::Oracle)
|
243
275
|
end
|
244
276
|
|
245
277
|
def self.visitor_for(pool) # :nodoc:
|
@@ -337,6 +369,11 @@ module ActiveRecord
|
|
337
369
|
IDENTIFIER_MAX_LENGTH
|
338
370
|
end
|
339
371
|
|
372
|
+
# the maximum length of a sequence name
|
373
|
+
def sequence_name_length
|
374
|
+
IDENTIFIER_MAX_LENGTH
|
375
|
+
end
|
376
|
+
|
340
377
|
# To avoid ORA-01795: maximum number of expressions in a list is 1000
|
341
378
|
# tell ActiveRecord to limit us to 1000 ids at a time
|
342
379
|
def in_clause_length
|
@@ -563,9 +600,6 @@ module ActiveRecord
|
|
563
600
|
end
|
564
601
|
|
565
602
|
def clear_cache!
|
566
|
-
@statements.each_value do |cursor|
|
567
|
-
cursor.close
|
568
|
-
end
|
569
603
|
@statements.clear
|
570
604
|
end
|
571
605
|
|
@@ -591,15 +625,21 @@ module ActiveRecord
|
|
591
625
|
end
|
592
626
|
|
593
627
|
cursor.exec
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
|
598
|
-
|
599
|
-
|
600
|
-
|
628
|
+
|
629
|
+
if name == 'EXPLAIN'
|
630
|
+
res = true
|
631
|
+
else
|
632
|
+
columns = cursor.get_col_names.map do |col_name|
|
633
|
+
@connection.oracle_downcase(col_name)
|
634
|
+
end
|
635
|
+
rows = []
|
636
|
+
fetch_options = {:get_lob_value => (name != 'Writable Large Object')}
|
637
|
+
while row = cursor.fetch(fetch_options)
|
638
|
+
rows << row
|
639
|
+
end
|
640
|
+
res = ActiveRecord::Result.new(columns, rows)
|
601
641
|
end
|
602
|
-
|
642
|
+
|
603
643
|
cursor.close unless cached
|
604
644
|
res
|
605
645
|
end
|
@@ -609,6 +649,17 @@ module ActiveRecord
|
|
609
649
|
true
|
610
650
|
end
|
611
651
|
|
652
|
+
def supports_explain?
|
653
|
+
true
|
654
|
+
end
|
655
|
+
|
656
|
+
def explain(arel, binds = [])
|
657
|
+
sql = "EXPLAIN PLAN FOR #{to_sql(arel)}"
|
658
|
+
return if sql =~ /FROM all_/
|
659
|
+
exec_query(sql, 'EXPLAIN', binds)
|
660
|
+
select_values("SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY)", 'EXPLAIN').join("\n")
|
661
|
+
end
|
662
|
+
|
612
663
|
# Returns an array of arrays containing the field values.
|
613
664
|
# Order is the same as that returned by #columns.
|
614
665
|
def select_rows(sql, name = nil)
|
@@ -639,7 +690,7 @@ module ActiveRecord
|
|
639
690
|
# New method in ActiveRecord 3.1
|
640
691
|
# Will add RETURNING clause in case of trigger generated primary keys
|
641
692
|
def sql_for_insert(sql, pk, id_value, sequence_name, binds)
|
642
|
-
unless id_value || pk.nil?
|
693
|
+
unless id_value || pk.nil? || (defined?(CompositePrimaryKeys) && pk.kind_of?(CompositePrimaryKeys::CompositeKeys))
|
643
694
|
sql = "#{sql} RETURNING #{quote_column_name(pk)} INTO :returning_id"
|
644
695
|
(binds = binds.dup) << [:returning_id, nil]
|
645
696
|
end
|
@@ -682,18 +733,26 @@ module ActiveRecord
|
|
682
733
|
# New method in ActiveRecord 3.1
|
683
734
|
def exec_update(sql, name, binds)
|
684
735
|
log(sql, name, binds) do
|
685
|
-
|
686
|
-
|
736
|
+
cached = false
|
737
|
+
if binds.empty?
|
738
|
+
cursor = @connection.prepare(sql)
|
687
739
|
else
|
688
|
-
|
689
|
-
|
740
|
+
cursor = if @statements.key?(sql)
|
741
|
+
@statements[sql]
|
742
|
+
else
|
743
|
+
@statements[sql] = @connection.prepare(sql)
|
744
|
+
end
|
690
745
|
|
691
|
-
|
692
|
-
|
693
|
-
|
746
|
+
binds.each_with_index do |bind, i|
|
747
|
+
col, val = bind
|
748
|
+
cursor.bind_param(i + 1, type_cast(val, col), col && col.type)
|
749
|
+
end
|
750
|
+
cached = true
|
694
751
|
end
|
695
752
|
|
696
|
-
cursor.exec_update
|
753
|
+
res = cursor.exec_update
|
754
|
+
cursor.close unless cached
|
755
|
+
res
|
697
756
|
end
|
698
757
|
end
|
699
758
|
|
@@ -1078,7 +1137,11 @@ module ActiveRecord
|
|
1078
1137
|
def pk_and_sequence_for(table_name, owner=nil, desc_table_name=nil, db_link=nil) #:nodoc:
|
1079
1138
|
if @@cache_columns
|
1080
1139
|
@@pk_and_sequence_for_cache ||= {}
|
1081
|
-
@@pk_and_sequence_for_cache
|
1140
|
+
if @@pk_and_sequence_for_cache.key?(table_name)
|
1141
|
+
@@pk_and_sequence_for_cache[table_name]
|
1142
|
+
else
|
1143
|
+
@@pk_and_sequence_for_cache[table_name] = pk_and_sequence_for_without_cache(table_name, owner, desc_table_name, db_link)
|
1144
|
+
end
|
1082
1145
|
else
|
1083
1146
|
pk_and_sequence_for_without_cache(table_name, owner, desc_table_name, db_link)
|
1084
1147
|
end
|
@@ -1160,6 +1223,23 @@ module ActiveRecord
|
|
1160
1223
|
sql << " ORDER BY #{order}"
|
1161
1224
|
end
|
1162
1225
|
|
1226
|
+
# construct additional wrapper subquery if select.offset is used to avoid generation of invalid subquery
|
1227
|
+
# ... IN ( SELECT * FROM ( SELECT raw_sql_.*, rownum raw_rnum_ FROM ( ... ) raw_sql_ ) WHERE raw_rnum_ > ... )
|
1228
|
+
def join_to_update(update, select) #:nodoc:
|
1229
|
+
if select.offset
|
1230
|
+
subsubselect = select.clone
|
1231
|
+
subsubselect.projections = [update.key]
|
1232
|
+
|
1233
|
+
subselect = Arel::SelectManager.new(select.engine)
|
1234
|
+
subselect.project Arel.sql(quote_column_name update.key.name)
|
1235
|
+
subselect.from subsubselect.as('alias_join_to_update')
|
1236
|
+
|
1237
|
+
update.where update.key.in(subselect)
|
1238
|
+
else
|
1239
|
+
super
|
1240
|
+
end
|
1241
|
+
end
|
1242
|
+
|
1163
1243
|
protected
|
1164
1244
|
|
1165
1245
|
def translate_exception(exception, message) #:nodoc:
|