activerecord-oracle_enhanced-adapter 1.4.1 → 1.4.2.rc1
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 +1 -0
- data/History.md +16 -1
- data/README.md +60 -35
- data/Rakefile +14 -1
- data/VERSION +1 -1
- data/activerecord-oracle_enhanced-adapter.gemspec +2 -2
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +27 -9
- data/lib/active_record/connection_adapters/oracle_enhanced_base_ext.rb +13 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_column.rb +7 -2
- data/lib/active_record/connection_adapters/oracle_enhanced_context_index.rb +31 -0
- data/lib/active_record/connection_adapters/oracle_enhanced_dirty.rb +6 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_jdbc_connection.rb +17 -5
- data/lib/active_record/connection_adapters/oracle_enhanced_oci_connection.rb +2 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_definitions.rb +29 -11
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_dumper.rb +9 -4
- data/lib/active_record/connection_adapters/oracle_enhanced_schema_statements.rb +31 -7
- data/lib/active_record/connection_adapters/oracle_enhanced_structure_dump.rb +5 -1
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +34 -5
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +22 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +1 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +52 -6
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +20 -0
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +6 -2
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +79 -21
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +203 -35
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +17 -1
- data/spec/spec_helper.rb +3 -1
- metadata +74 -51
@@ -23,7 +23,8 @@ begin
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
-
|
26
|
+
ORACLE_DRIVER = Java::oracle.jdbc.OracleDriver.new
|
27
|
+
java.sql.DriverManager.registerDriver ORACLE_DRIVER
|
27
28
|
|
28
29
|
# set tns_admin property from TNS_ADMIN environment variable
|
29
30
|
if !java.lang.System.get_property("oracle.net.tns_admin") && ENV["TNS_ADMIN"]
|
@@ -94,15 +95,19 @@ module ActiveRecord
|
|
94
95
|
# to_s needed if username, password or database is specified as number in database.yml file
|
95
96
|
username = config[:username] && config[:username].to_s
|
96
97
|
password = config[:password] && config[:password].to_s
|
97
|
-
database = config[:database] && config[:database].to_s
|
98
|
+
database = config[:database] && config[:database].to_s || 'XE'
|
98
99
|
host, port = config[:host], config[:port]
|
99
100
|
privilege = config[:privilege] && config[:privilege].to_s
|
100
101
|
|
101
102
|
# connection using TNS alias
|
102
103
|
if database && !host && !config[:url] && ENV['TNS_ADMIN']
|
103
|
-
url = "jdbc:oracle:thin:@#{database
|
104
|
+
url = "jdbc:oracle:thin:@#{database}"
|
104
105
|
else
|
105
|
-
|
106
|
+
unless database.match(/^(\:|\/)/)
|
107
|
+
# assume database is a SID if no colon or slash are supplied (backward-compatibility)
|
108
|
+
database = ":#{database}"
|
109
|
+
end
|
110
|
+
url = config[:url] || "jdbc:oracle:thin:@#{host || 'localhost'}:#{port || 1521}#{database}"
|
106
111
|
end
|
107
112
|
|
108
113
|
prefetch_rows = config[:prefetch_rows] || 100
|
@@ -115,7 +120,14 @@ module ActiveRecord
|
|
115
120
|
properties.put("defaultRowPrefetch", "#{prefetch_rows}") if prefetch_rows
|
116
121
|
properties.put("internal_logon", privilege) if privilege
|
117
122
|
|
118
|
-
|
123
|
+
begin
|
124
|
+
@raw_connection = java.sql.DriverManager.getConnection(url, properties)
|
125
|
+
rescue
|
126
|
+
# bypass DriverManager to work in cases where ojdbc*.jar
|
127
|
+
# is added to the load path at runtime and not on the
|
128
|
+
# system classpath
|
129
|
+
@raw_connection = ORACLE_DRIVER.connect(url, properties)
|
130
|
+
end
|
119
131
|
|
120
132
|
# Set session time zone to current time zone
|
121
133
|
@raw_connection.setSessionTimeZone(time_zone)
|
@@ -309,7 +309,8 @@ module ActiveRecord
|
|
309
309
|
host ||= 'localhost'
|
310
310
|
host = "[#{host}]" if host =~ /^[^\[].*:/ # IPv6
|
311
311
|
port ||= 1521
|
312
|
-
"
|
312
|
+
database = "/#{database}" unless database.match(/^\//)
|
313
|
+
"//#{host}:#{port}#{database}"
|
313
314
|
# if no host is specified then assume that
|
314
315
|
# database parameter is TNS alias or TNS connection string
|
315
316
|
else
|
@@ -19,8 +19,9 @@ module ActiveRecord
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def to_sql_with_virtual_columns
|
22
|
-
if type
|
23
|
-
|
22
|
+
if type == :virtual
|
23
|
+
sql_type = base.type_to_sql(default[:type], limit, precision, scale) if default[:type]
|
24
|
+
"#{base.quote_column_name(name)} #{sql_type} AS (#{default[:as]})"
|
24
25
|
else
|
25
26
|
to_sql_without_virtual_columns
|
26
27
|
end
|
@@ -56,22 +57,39 @@ module ActiveRecord
|
|
56
57
|
alias to_s :to_sql
|
57
58
|
end
|
58
59
|
|
59
|
-
def raw(name, options={})
|
60
|
-
column(name, :raw, options)
|
61
|
-
end
|
62
|
-
|
63
60
|
def self.included(base) #:nodoc:
|
64
61
|
base.class_eval do
|
65
62
|
alias_method_chain :references, :foreign_keys
|
66
63
|
alias_method_chain :to_sql, :foreign_keys
|
67
64
|
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
column_names.each { |name| column(name, :virtual, options) }
|
72
|
-
end
|
65
|
+
alias_method_chain :column, :virtual_columns
|
66
|
+
end
|
67
|
+
end
|
73
68
|
|
69
|
+
def raw(name, options={})
|
70
|
+
column(name, :raw, options)
|
71
|
+
end
|
72
|
+
|
73
|
+
def virtual(* args)
|
74
|
+
options = args.extract_options!
|
75
|
+
column_names = args
|
76
|
+
column_names.each { |name| column(name, :virtual, options) }
|
77
|
+
end
|
78
|
+
|
79
|
+
def column_with_virtual_columns(name, type, options = {})
|
80
|
+
if type == :virtual
|
81
|
+
default = {:type => options[:type]}
|
82
|
+
if options[:as]
|
83
|
+
default[:as] = options[:as]
|
84
|
+
elsif options[:default]
|
85
|
+
warn "[DEPRECATION] virtual column `:default` option is deprecated. Please use `:as` instead."
|
86
|
+
default[:as] = options[:default]
|
87
|
+
else
|
88
|
+
raise "No virtual column definition found."
|
89
|
+
end
|
90
|
+
options[:default] = default
|
74
91
|
end
|
92
|
+
column_without_virtual_columns(name, type, options)
|
75
93
|
end
|
76
94
|
|
77
95
|
# Adds a :foreign_key option to TableDefinition.references.
|
@@ -176,18 +176,23 @@ module ActiveRecord #:nodoc:
|
|
176
176
|
spec = {}
|
177
177
|
spec[:name] = column.name.inspect
|
178
178
|
spec[:type] = column.virtual? ? 'virtual' : column.type.to_s
|
179
|
+
spec[:type] = column.virtual? ? 'virtual' : column.type.to_s
|
180
|
+
spec[:virtual_type] = column.type.inspect if column.virtual?
|
179
181
|
spec[:limit] = column.limit.inspect if column.limit != @types[column.type][:limit] && column.type != :decimal
|
180
182
|
spec[:precision] = column.precision.inspect if !column.precision.nil?
|
181
183
|
spec[:scale] = column.scale.inspect if !column.scale.nil?
|
182
184
|
spec[:null] = 'false' if !column.null
|
183
|
-
spec[:
|
184
|
-
spec[:default]
|
185
|
-
(spec.keys - [:name, :type]).each
|
185
|
+
spec[:as] = column.virtual_column_data_default if column.virtual?
|
186
|
+
spec[:default] = default_string(column.default) if column.has_default? && !column.virtual?
|
187
|
+
(spec.keys - [:name, :type]).each do |k|
|
188
|
+
key_s = (k == :virtual_type ? ":type => " : "#{k.inspect} => ")
|
189
|
+
spec[k] = key_s + spec[k]
|
190
|
+
end
|
186
191
|
spec
|
187
192
|
end.compact
|
188
193
|
|
189
194
|
# find all migration keys used in this table
|
190
|
-
keys = [:name, :limit, :precision, :scale, :default, :null] & column_specs.map(&:keys).flatten
|
195
|
+
keys = [:name, :limit, :precision, :scale, :default, :null, :as, :virtual_type] & column_specs.map(&:keys).flatten
|
191
196
|
|
192
197
|
# figure out the lengths for each column based on above keys
|
193
198
|
lengths = keys.map{ |key| column_specs.map{ |spec| spec[key] ? spec[key].length + 2 : 0 }.max }
|
@@ -210,9 +210,16 @@ module ActiveRecord
|
|
210
210
|
end
|
211
211
|
|
212
212
|
def add_column(table_name, column_name, type, options = {}) #:nodoc:
|
213
|
-
|
213
|
+
if type.to_sym == :virtual
|
214
|
+
type = options[:type]
|
215
|
+
end
|
216
|
+
add_column_sql = "ALTER TABLE #{quote_table_name(table_name)} ADD #{quote_column_name(column_name)} "
|
217
|
+
add_column_sql << type_to_sql(type, options[:limit], options[:precision], options[:scale]) if type
|
218
|
+
|
214
219
|
add_column_options!(add_column_sql, options.merge(:type=>type, :column_name=>column_name, :table_name=>table_name))
|
215
|
-
|
220
|
+
|
221
|
+
add_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, table_name, column_name) if type
|
222
|
+
|
216
223
|
execute(add_column_sql)
|
217
224
|
ensure
|
218
225
|
clear_table_columns_cache(table_name)
|
@@ -242,10 +249,16 @@ module ActiveRecord
|
|
242
249
|
if options.has_key?(:null) && options[:null] == column.null
|
243
250
|
options[:null] = nil
|
244
251
|
end
|
252
|
+
if type.to_sym == :virtual
|
253
|
+
type = options[:type]
|
254
|
+
end
|
255
|
+
change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{quote_column_name(column_name)} "
|
256
|
+
change_column_sql << "#{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" if type
|
245
257
|
|
246
|
-
change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{quote_column_name(column_name)} #{type_to_sql(type, options[:limit], options[:precision], options[:scale])}"
|
247
258
|
add_column_options!(change_column_sql, options.merge(:type=>type, :column_name=>column_name, :table_name=>table_name))
|
248
|
-
|
259
|
+
|
260
|
+
change_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, options[:table_name], options[:column_name]) if type
|
261
|
+
|
249
262
|
execute(change_column_sql)
|
250
263
|
ensure
|
251
264
|
clear_table_columns_cache(table_name)
|
@@ -257,8 +270,19 @@ module ActiveRecord
|
|
257
270
|
clear_table_columns_cache(table_name)
|
258
271
|
end
|
259
272
|
|
260
|
-
def remove_column(table_name,
|
261
|
-
|
273
|
+
def remove_column(table_name, *column_names) #:nodoc:
|
274
|
+
major, minor = ActiveRecord::VERSION::MAJOR, ActiveRecord::VERSION::MINOR
|
275
|
+
is_deprecated = (major == 3 and minor >= 2) or major > 3
|
276
|
+
|
277
|
+
if column_names.flatten! and is_deprecated
|
278
|
+
message = 'Passing array to remove_columns is deprecated, please use ' +
|
279
|
+
'multiple arguments, like: `remove_columns(:posts, :foo, :bar)`'
|
280
|
+
ActiveSupport::Deprecation.warn message, caller
|
281
|
+
end
|
282
|
+
|
283
|
+
column_names.each do |column_name|
|
284
|
+
execute "ALTER TABLE #{quote_table_name(table_name)} DROP COLUMN #{quote_column_name(column_name)}"
|
285
|
+
end
|
262
286
|
ensure
|
263
287
|
clear_table_columns_cache(table_name)
|
264
288
|
end
|
@@ -341,7 +365,7 @@ module ActiveRecord
|
|
341
365
|
|
342
366
|
create_primary_key_trigger(table_name, options) if options[:primary_key_trigger]
|
343
367
|
end
|
344
|
-
|
368
|
+
|
345
369
|
def create_primary_key_trigger(table_name, options)
|
346
370
|
seq_name = options[:sequence_name] || default_sequence_name(table_name)
|
347
371
|
trigger_name = options[:trigger_name] || default_trigger_name(table_name)
|
@@ -117,7 +117,7 @@ module ActiveRecord #:nodoc:
|
|
117
117
|
else
|
118
118
|
index_type = options
|
119
119
|
end
|
120
|
-
quoted_column_names = column_names.map { |e|
|
120
|
+
quoted_column_names = column_names.map { |e| quote_column_name_or_expression(e) }.join(", ")
|
121
121
|
"CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} (#{quoted_column_names})"
|
122
122
|
end
|
123
123
|
end
|
@@ -232,6 +232,10 @@ module ActiveRecord #:nodoc:
|
|
232
232
|
elsif options[:null] == true
|
233
233
|
sql << " NULL" unless type == :primary_key
|
234
234
|
end
|
235
|
+
# add AS expression for virtual columns
|
236
|
+
if options[:as].present?
|
237
|
+
sql << " AS (#{options[:as]})"
|
238
|
+
end
|
235
239
|
end
|
236
240
|
|
237
241
|
def execute_structure_dump(string)
|
@@ -209,7 +209,11 @@ describe "OracleEnhancedAdapter" do
|
|
209
209
|
end
|
210
210
|
# Another class using the same table
|
211
211
|
class ::TestEmployee2 < ActiveRecord::Base
|
212
|
-
|
212
|
+
if self.respond_to?(:table_name=)
|
213
|
+
self.table_name = "test_employees"
|
214
|
+
else
|
215
|
+
set_table_name "test_employees"
|
216
|
+
end
|
213
217
|
end
|
214
218
|
end
|
215
219
|
|
@@ -332,7 +336,11 @@ describe "OracleEnhancedAdapter" do
|
|
332
336
|
SQL
|
333
337
|
Object.send(:remove_const, 'CompositePrimaryKeys') if defined?(CompositePrimaryKeys)
|
334
338
|
class ::TestEmployee < ActiveRecord::Base
|
335
|
-
|
339
|
+
if self.respond_to?(:primary_key=)
|
340
|
+
self.primary_key = :employee_id
|
341
|
+
else
|
342
|
+
set_primary_key :employee_id
|
343
|
+
end
|
336
344
|
end
|
337
345
|
end
|
338
346
|
|
@@ -509,7 +517,11 @@ describe "OracleEnhancedAdapter" do
|
|
509
517
|
it "should allow creation of a table with non alphanumeric characters" do
|
510
518
|
create_warehouse_things_table
|
511
519
|
class ::WarehouseThing < ActiveRecord::Base
|
512
|
-
|
520
|
+
if self.respond_to?(:table_name=)
|
521
|
+
self.table_name = "warehouse-things"
|
522
|
+
else
|
523
|
+
set_table_name "warehouse-things"
|
524
|
+
end
|
513
525
|
end
|
514
526
|
|
515
527
|
wh = WarehouseThing.create!(:name => "Foo", :foo => 2)
|
@@ -521,7 +533,11 @@ describe "OracleEnhancedAdapter" do
|
|
521
533
|
it "should allow creation of a table with CamelCase name" do
|
522
534
|
create_camel_case_table
|
523
535
|
class ::CamelCase < ActiveRecord::Base
|
524
|
-
|
536
|
+
if self.respond_to?(:table_name=)
|
537
|
+
self.table_name = "CamelCase"
|
538
|
+
else
|
539
|
+
set_table_name "CamelCase"
|
540
|
+
end
|
525
541
|
end
|
526
542
|
|
527
543
|
cc = CamelCase.create!(:name => "Foo", :foo => 2)
|
@@ -553,7 +569,11 @@ describe "OracleEnhancedAdapter" do
|
|
553
569
|
@conn.execute "CREATE OR REPLACE SYNONYM test_posts_seq FOR test_posts_seq@#{@db_link}"
|
554
570
|
class ::TestPost < ActiveRecord::Base
|
555
571
|
end
|
556
|
-
TestPost.
|
572
|
+
if TestPost.respond_to?(:table_name=)
|
573
|
+
TestPost.table_name = "test_posts"
|
574
|
+
else
|
575
|
+
TestPost.set_table_name "test_posts"
|
576
|
+
end
|
557
577
|
end
|
558
578
|
|
559
579
|
after(:all) do
|
@@ -724,6 +744,7 @@ describe "OracleEnhancedAdapter" do
|
|
724
744
|
|
725
745
|
describe "explain" do
|
726
746
|
before(:all) do
|
747
|
+
@conn = ActiveRecord::Base.connection
|
727
748
|
schema_define do
|
728
749
|
drop_table :test_posts rescue nil
|
729
750
|
create_table :test_posts
|
@@ -745,5 +766,13 @@ describe "OracleEnhancedAdapter" do
|
|
745
766
|
explain.should include("Cost")
|
746
767
|
explain.should include("INDEX UNIQUE SCAN")
|
747
768
|
end
|
769
|
+
|
770
|
+
it "should explain query with binds" do
|
771
|
+
pk = TestPost.columns.find { |c| c.primary }
|
772
|
+
sub = @conn.substitute_at(pk, 0)
|
773
|
+
explain = TestPost.where(TestPost.arel_table[pk.name].eq(sub)).bind([pk, 1]).explain
|
774
|
+
explain.should include("Cost")
|
775
|
+
explain.should include("INDEX UNIQUE SCAN")
|
776
|
+
end
|
748
777
|
end if ENV['RAILS_GEM_VERSION'] >= '3.2'
|
749
778
|
end
|
@@ -74,6 +74,18 @@ describe "OracleEnhancedConnection" do
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
+
describe "with slash-prefixed database name (service name)" do
|
78
|
+
before(:all) do
|
79
|
+
params = CONNECTION_PARAMS.dup
|
80
|
+
params[:database] = "/#{params[:database]}" unless params[:database].match(/^\//)
|
81
|
+
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
82
|
+
end
|
83
|
+
|
84
|
+
it "should create new connection" do
|
85
|
+
@conn.should be_active
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
77
89
|
if defined?(RUBY_ENGINE) && RUBY_ENGINE == 'jruby'
|
78
90
|
|
79
91
|
describe "create JDBC connection" do
|
@@ -143,6 +155,16 @@ describe "OracleEnhancedConnection" do
|
|
143
155
|
|
144
156
|
end
|
145
157
|
|
158
|
+
it "should fall back to directly instantiating OracleDriver" do
|
159
|
+
params = CONNECTION_PARAMS.dup
|
160
|
+
params[:url] = "jdbc:oracle:thin:@#{DATABASE_HOST && "#{DATABASE_HOST}:"}#{DATABASE_PORT && "#{DATABASE_PORT}:"}#{DATABASE_NAME}"
|
161
|
+
params[:host] = nil
|
162
|
+
params[:database] = nil
|
163
|
+
java.sql.DriverManager.stub!(:getConnection).and_raise('no suitable driver found')
|
164
|
+
@conn = ActiveRecord::ConnectionAdapters::OracleEnhancedConnection.create(params)
|
165
|
+
@conn.should be_active
|
166
|
+
end
|
167
|
+
|
146
168
|
end
|
147
169
|
|
148
170
|
describe "SQL execution" do
|
@@ -406,6 +406,7 @@ describe "OracleEnhancedAdapter context index" do
|
|
406
406
|
:name => 'xxx_post_and_comments_i',
|
407
407
|
:index_column => :all_text, :index_column_trigger_on => :updated_at,
|
408
408
|
:lexer => { :type => "BASIC_LEXER", :base_letter_type => 'GENERIC', :base_letter => true },
|
409
|
+
:wordlist => { :type => "BASIC_WORDLIST", :prefix_index => true },
|
409
410
|
:sync => 'ON COMMIT'
|
410
411
|
}
|
411
412
|
schema_define do
|
@@ -5,6 +5,8 @@ describe "OracleEnhancedAdapter date type detection based on column names" do
|
|
5
5
|
before(:all) do
|
6
6
|
ActiveRecord::Base.establish_connection(CONNECTION_PARAMS)
|
7
7
|
@conn = ActiveRecord::Base.connection
|
8
|
+
@conn.execute "DROP TABLE test_employees" rescue nil
|
9
|
+
@conn.execute "DROP SEQUENCE test_employees_seq" rescue nil
|
8
10
|
@conn.execute <<-SQL
|
9
11
|
CREATE TABLE test_employees (
|
10
12
|
employee_id NUMBER(6,0) PRIMARY KEY,
|
@@ -87,7 +89,11 @@ describe "OracleEnhancedAdapter date type detection based on column names" do
|
|
87
89
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = false
|
88
90
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates = false
|
89
91
|
class ::TestEmployee < ActiveRecord::Base
|
90
|
-
|
92
|
+
if self.respond_to?(:primary_key=)
|
93
|
+
self.primary_key = "employee_id"
|
94
|
+
else
|
95
|
+
set_primary_key "employee_id"
|
96
|
+
end
|
91
97
|
end
|
92
98
|
end
|
93
99
|
|
@@ -563,7 +569,11 @@ describe "OracleEnhancedAdapter timestamp with timezone support" do
|
|
563
569
|
describe "/ TIMESTAMP WITH TIME ZONE values from ActiveRecord model" do
|
564
570
|
before(:all) do
|
565
571
|
class ::TestEmployee < ActiveRecord::Base
|
566
|
-
|
572
|
+
if self.respond_to?(:primary_key=)
|
573
|
+
self.primary_key = "employee_id"
|
574
|
+
else
|
575
|
+
set_primary_key "employee_id"
|
576
|
+
end
|
567
577
|
end
|
568
578
|
end
|
569
579
|
|
@@ -645,7 +655,11 @@ describe "OracleEnhancedAdapter date and timestamp with different NLS date forma
|
|
645
655
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates = false
|
646
656
|
ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = false
|
647
657
|
class ::TestEmployee < ActiveRecord::Base
|
648
|
-
|
658
|
+
if self.respond_to?(:primary_key=)
|
659
|
+
self.primary_key = "employee_id"
|
660
|
+
else
|
661
|
+
set_primary_key "employee_id"
|
662
|
+
end
|
649
663
|
end
|
650
664
|
@today = Date.new(2008,6,28)
|
651
665
|
@now = Time.local(2008,6,28,13,34,33)
|
@@ -730,7 +744,11 @@ describe "OracleEnhancedAdapter assign string to :date and :datetime columns" do
|
|
730
744
|
INCREMENT BY 1 CACHE 20 NOORDER NOCYCLE
|
731
745
|
SQL
|
732
746
|
class ::TestEmployee < ActiveRecord::Base
|
733
|
-
|
747
|
+
if self.respond_to?(:primary_key=)
|
748
|
+
self.primary_key = "employee_id"
|
749
|
+
else
|
750
|
+
set_primary_key "employee_id"
|
751
|
+
end
|
734
752
|
end
|
735
753
|
@today = Date.new(2008,6,28)
|
736
754
|
@today_iso = "2008-06-28"
|
@@ -899,6 +917,10 @@ describe "OracleEnhancedAdapter handling of CLOB columns" do
|
|
899
917
|
class ::Test2Employee < ActiveRecord::Base
|
900
918
|
serialize :comments
|
901
919
|
end
|
920
|
+
class ::TestEmployeeReadOnlyClob < ActiveRecord::Base
|
921
|
+
set_table_name :test_employees
|
922
|
+
attr_readonly :comments
|
923
|
+
end
|
902
924
|
end
|
903
925
|
|
904
926
|
after(:all) do
|
@@ -908,6 +930,7 @@ describe "OracleEnhancedAdapter handling of CLOB columns" do
|
|
908
930
|
@conn.execute "DROP SEQUENCE test2_employees_seq"
|
909
931
|
Object.send(:remove_const, "TestEmployee")
|
910
932
|
Object.send(:remove_const, "Test2Employee")
|
933
|
+
Object.send(:remove_const, "TestEmployeeReadOnlyClob")
|
911
934
|
ActiveRecord::Base.clear_cache! if ActiveRecord::Base.respond_to?(:"clear_cache!")
|
912
935
|
end
|
913
936
|
|
@@ -926,6 +949,21 @@ describe "OracleEnhancedAdapter handling of CLOB columns" do
|
|
926
949
|
@employee.should be_valid
|
927
950
|
end
|
928
951
|
|
952
|
+
it "should respect attr_readonly setting for CLOB column" do
|
953
|
+
@employee = TestEmployeeReadOnlyClob.create!(
|
954
|
+
:first_name => "First",
|
955
|
+
:comments => "initial"
|
956
|
+
)
|
957
|
+
@employee.should be_valid
|
958
|
+
@employee.reload
|
959
|
+
@employee.comments.should == 'initial'
|
960
|
+
@employee.comments = "changed"
|
961
|
+
@employee.save.should == true
|
962
|
+
@employee.reload
|
963
|
+
@employee.comments.should == 'initial'
|
964
|
+
end
|
965
|
+
|
966
|
+
|
929
967
|
it "should create record with CLOB data" do
|
930
968
|
@employee = TestEmployee.create!(
|
931
969
|
:first_name => "First",
|
@@ -1043,7 +1081,11 @@ describe "OracleEnhancedAdapter handling of BLOB columns" do
|
|
1043
1081
|
|
1044
1082
|
before(:each) do
|
1045
1083
|
class ::TestEmployee < ActiveRecord::Base
|
1046
|
-
|
1084
|
+
if self.respond_to?(:primary_key=)
|
1085
|
+
self.primary_key = "employee_id"
|
1086
|
+
else
|
1087
|
+
set_primary_key "employee_id"
|
1088
|
+
end
|
1047
1089
|
end
|
1048
1090
|
end
|
1049
1091
|
|
@@ -1169,7 +1211,11 @@ describe "OracleEnhancedAdapter handling of RAW columns" do
|
|
1169
1211
|
|
1170
1212
|
before(:each) do
|
1171
1213
|
class ::TestEmployee < ActiveRecord::Base
|
1172
|
-
|
1214
|
+
if self.respond_to?(:primary_key=)
|
1215
|
+
self.primary_key = "employee_id"
|
1216
|
+
else
|
1217
|
+
set_primary_key "employee_id"
|
1218
|
+
end
|
1173
1219
|
end
|
1174
1220
|
end
|
1175
1221
|
|