activerecord-oracle_enhanced-adapter 1.7.3 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/History.md +288 -0
- data/README.md +44 -0
- data/VERSION +1 -1
- data/lib/active_record/connection_adapters/emulation/oracle_adapter.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced/column.rb +7 -63
- data/lib/active_record/connection_adapters/oracle_enhanced/column_dumper.rb +6 -52
- data/lib/active_record/connection_adapters/oracle_enhanced/connection.rb +13 -16
- data/lib/active_record/connection_adapters/oracle_enhanced/context_index.rb +117 -119
- data/lib/active_record/connection_adapters/oracle_enhanced/database_statements.rb +33 -27
- data/lib/active_record/connection_adapters/oracle_enhanced/database_tasks.rb +10 -10
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_connection.rb +59 -77
- data/lib/active_record/connection_adapters/oracle_enhanced/jdbc_quoting.rb +0 -4
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_connection.rb +56 -82
- data/lib/active_record/connection_adapters/oracle_enhanced/oci_quoting.rb +4 -4
- data/lib/active_record/connection_adapters/oracle_enhanced/procedures.rb +77 -77
- data/lib/active_record/connection_adapters/oracle_enhanced/quoting.rb +16 -45
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_creation.rb +60 -65
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_definitions.rb +33 -51
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb +149 -162
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb +119 -122
- data/lib/active_record/connection_adapters/oracle_enhanced/schema_statements_ext.rb +3 -4
- data/lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb +69 -107
- data/lib/active_record/connection_adapters/oracle_enhanced/version.rb +1 -1
- data/lib/active_record/connection_adapters/oracle_enhanced_adapter.rb +315 -538
- data/lib/active_record/oracle_enhanced/type/boolean.rb +7 -11
- data/lib/active_record/oracle_enhanced/type/integer.rb +4 -5
- data/lib/active_record/oracle_enhanced/type/json.rb +8 -0
- data/lib/active_record/oracle_enhanced/type/national_character_string.rb +1 -2
- data/lib/active_record/oracle_enhanced/type/raw.rb +2 -4
- data/lib/active_record/oracle_enhanced/type/string.rb +2 -3
- data/lib/active_record/oracle_enhanced/type/text.rb +2 -4
- data/lib/active_record/oracle_enhanced/type/timestamptz.rb +23 -0
- data/lib/activerecord-oracle_enhanced-adapter.rb +14 -13
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +129 -166
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +50 -33
- data/spec/active_record/connection_adapters/oracle_enhanced_context_index_spec.rb +44 -42
- data/spec/active_record/connection_adapters/oracle_enhanced_data_types_spec.rb +283 -378
- data/spec/active_record/connection_adapters/oracle_enhanced_database_tasks_spec.rb +14 -7
- data/spec/active_record/connection_adapters/oracle_enhanced_dbms_output_spec.rb +5 -7
- data/spec/active_record/connection_adapters/oracle_enhanced_dirty_spec.rb +118 -127
- data/spec/active_record/connection_adapters/oracle_enhanced_emulate_oracle_adapter_spec.rb +2 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_procedures_spec.rb +74 -78
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_dump_spec.rb +68 -83
- data/spec/active_record/connection_adapters/oracle_enhanced_schema_statements_spec.rb +308 -321
- data/spec/active_record/connection_adapters/oracle_enhanced_structure_dump_spec.rb +103 -48
- data/spec/spec_config.yaml.template +11 -0
- data/spec/spec_helper.rb +59 -60
- data/spec/support/alter_system_user_password.sql +2 -0
- data/spec/support/create_oracle_enhanced_users.sql +31 -0
- metadata +25 -25
- data/.rspec +0 -2
- data/Gemfile +0 -22
- data/RUNNING_TESTS.md +0 -50
- data/Rakefile +0 -45
- data/activerecord-oracle_enhanced-adapter.gemspec +0 -95
- data/lib/active_record/connection_adapters/oracle_enhanced/cpk.rb +0 -21
- data/spec/active_record/connection_adapters/oracle_enhanced_cpk_spec.rb +0 -113
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
require
|
|
1
|
+
require "digest/sha1"
|
|
2
2
|
|
|
3
3
|
module ActiveRecord
|
|
4
4
|
module ConnectionAdapters
|
|
@@ -80,11 +80,12 @@ module ActiveRecord
|
|
|
80
80
|
if supports_comments? && !supports_comments_in_create?
|
|
81
81
|
change_table_comment(table_name, comment) if comment
|
|
82
82
|
td.columns.each do |column|
|
|
83
|
-
change_column_comment(table_name, column.name, column.comment) if column.comment
|
|
83
|
+
change_column_comment(table_name, column.name, column.comment) if column.comment.present?
|
|
84
84
|
end
|
|
85
85
|
end
|
|
86
|
-
td.indexes.each { |c,o| add_index table_name, c, o }
|
|
86
|
+
td.indexes.each { |c, o| add_index table_name, c, o }
|
|
87
87
|
|
|
88
|
+
rebuild_primary_key_index_to_default_tablespace(table_name, options)
|
|
88
89
|
end
|
|
89
90
|
|
|
90
91
|
def create_table_definition(*args)
|
|
@@ -112,22 +113,30 @@ module ActiveRecord
|
|
|
112
113
|
self.all_schema_indexes = nil
|
|
113
114
|
end
|
|
114
115
|
|
|
115
|
-
def
|
|
116
|
-
|
|
117
|
-
end
|
|
118
|
-
|
|
119
|
-
def initialize_schema_migrations_table
|
|
120
|
-
super
|
|
121
|
-
end
|
|
116
|
+
def insert_versions_sql(versions) # :nodoc:
|
|
117
|
+
sm_table = quote_table_name(ActiveRecord::SchemaMigration.table_name)
|
|
122
118
|
|
|
123
|
-
|
|
124
|
-
|
|
119
|
+
if supports_multi_insert?
|
|
120
|
+
versions.inject("INSERT ALL\n") { |sql, version|
|
|
121
|
+
sql << "INTO #{sm_table} (version) VALUES (#{quote(version)})\n"
|
|
122
|
+
} << "SELECT * FROM DUAL\n"
|
|
123
|
+
else
|
|
124
|
+
if versions.is_a?(Array)
|
|
125
|
+
# called from ActiveRecord::Base.connection#dump_schema_information
|
|
126
|
+
versions.map { |version|
|
|
127
|
+
"INSERT INTO #{sm_table} (version) VALUES (#{quote(version)})"
|
|
128
|
+
}.join("\n\n/\n\n")
|
|
129
|
+
else
|
|
130
|
+
# called from ActiveRecord::Base.connection#assume_migrated_upto_version
|
|
131
|
+
"INSERT INTO #{sm_table} (version) VALUES (#{quote(versions)})"
|
|
132
|
+
end
|
|
133
|
+
end
|
|
125
134
|
end
|
|
126
135
|
|
|
127
136
|
def add_index(table_name, column_name, options = {}) #:nodoc:
|
|
128
137
|
index_name, index_type, quoted_column_names, tablespace, index_options = add_index_options(table_name, column_name, options)
|
|
129
138
|
execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} (#{quoted_column_names})#{tablespace} #{index_options}"
|
|
130
|
-
if index_type ==
|
|
139
|
+
if index_type == "UNIQUE"
|
|
131
140
|
unless quoted_column_names =~ /\(.*\)/
|
|
132
141
|
execute "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{quote_column_name(index_name)} #{index_type} (#{quoted_column_names})"
|
|
133
142
|
end
|
|
@@ -152,29 +161,18 @@ module ActiveRecord
|
|
|
152
161
|
if index_name.to_s.length > max_index_length
|
|
153
162
|
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{max_index_length} characters"
|
|
154
163
|
end
|
|
155
|
-
if index_name_exists?(table_name, index_name
|
|
164
|
+
if table_exists?(table_name) && index_name_exists?(table_name, index_name)
|
|
156
165
|
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists"
|
|
157
166
|
end
|
|
158
167
|
|
|
159
168
|
quoted_column_names = column_names.map { |e| quote_column_name_or_expression(e) }.join(", ")
|
|
160
|
-
|
|
169
|
+
[index_name, index_type, quoted_column_names, tablespace, index_options]
|
|
161
170
|
end
|
|
162
171
|
|
|
163
172
|
# Remove the given index from the table.
|
|
164
173
|
# Gives warning if index does not exist
|
|
165
174
|
def remove_index(table_name, options = {}) #:nodoc:
|
|
166
175
|
index_name = index_name_for_remove(table_name, options)
|
|
167
|
-
unless index_name_exists?(table_name, index_name, true)
|
|
168
|
-
# sometimes options can be String or Array with column names
|
|
169
|
-
options = {} unless options.is_a?(Hash)
|
|
170
|
-
if options.has_key? :name
|
|
171
|
-
options_without_column = options.dup
|
|
172
|
-
options_without_column.delete :column
|
|
173
|
-
index_name_without_column = index_name(table_name, options_without_column)
|
|
174
|
-
return index_name_without_column if index_name_exists?(table_name, index_name_without_column, false)
|
|
175
|
-
end
|
|
176
|
-
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
|
|
177
|
-
end
|
|
178
176
|
#TODO: It should execute only when index_type == "UNIQUE"
|
|
179
177
|
execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_column_name(index_name)}" rescue nil
|
|
180
178
|
execute "DROP INDEX #{quote_column_name(index_name)}"
|
|
@@ -195,11 +193,11 @@ module ActiveRecord
|
|
|
195
193
|
|
|
196
194
|
# leave just first three letters from each word
|
|
197
195
|
if shortened_name.length > identifier_max_length
|
|
198
|
-
shortened_name = shortened_name.split(
|
|
196
|
+
shortened_name = shortened_name.split("_").map { |w| w[0, 3] }.join("_")
|
|
199
197
|
end
|
|
200
198
|
# generate unique name using hash function
|
|
201
199
|
if shortened_name.length > identifier_max_length
|
|
202
|
-
shortened_name =
|
|
200
|
+
shortened_name = "i" + Digest::SHA1.hexdigest(default_name)[0, identifier_max_length - 1]
|
|
203
201
|
end
|
|
204
202
|
@logger.warn "#{adapter_name} shortened default index name #{default_name} to #{shortened_name}" if @logger
|
|
205
203
|
shortened_name
|
|
@@ -211,7 +209,12 @@ module ActiveRecord
|
|
|
211
209
|
# as there's no way to determine the correct answer in that case.
|
|
212
210
|
#
|
|
213
211
|
# Will always query database and not index cache.
|
|
214
|
-
def index_name_exists?(table_name, index_name, default)
|
|
212
|
+
def index_name_exists?(table_name, index_name, default = nil)
|
|
213
|
+
unless default.nil?
|
|
214
|
+
ActiveSupport::Deprecation.warn(<<-MSG.squish)
|
|
215
|
+
Passing default to #index_name_exists? is deprecated without replacement.
|
|
216
|
+
MSG
|
|
217
|
+
end
|
|
215
218
|
(owner, table_name, db_link) = @connection.describe(table_name)
|
|
216
219
|
result = select_value(<<-SQL)
|
|
217
220
|
SELECT 1 FROM all_indexes#{db_link} i
|
|
@@ -224,31 +227,23 @@ module ActiveRecord
|
|
|
224
227
|
end
|
|
225
228
|
|
|
226
229
|
def rename_index(table_name, old_name, new_name) #:nodoc:
|
|
227
|
-
|
|
228
|
-
raise ArgumentError, "Index name '#{old_name}' on table '#{table_name}' does not exist"
|
|
229
|
-
end
|
|
230
|
-
if new_name.length > allowed_index_name_length
|
|
231
|
-
raise ArgumentError, "Index name '#{new_name}' on table '#{table_name}' is too long; the limit is #{allowed_index_name_length} characters"
|
|
232
|
-
end
|
|
230
|
+
validate_index_length!(table_name, new_name)
|
|
233
231
|
execute "ALTER INDEX #{quote_column_name(old_name)} rename to #{quote_column_name(new_name)}"
|
|
234
232
|
ensure
|
|
235
233
|
self.all_schema_indexes = nil
|
|
236
234
|
end
|
|
237
235
|
|
|
236
|
+
def add_reference(table_name, *args)
|
|
237
|
+
ActiveRecord::ConnectionAdapters::OracleEnhanced::ReferenceDefinition.new(*args).add_to(update_table_definition(table_name, self))
|
|
238
|
+
end
|
|
239
|
+
|
|
238
240
|
def add_column(table_name, column_name, type, options = {}) #:nodoc:
|
|
239
|
-
if type.to_sym == :virtual
|
|
240
|
-
type = options[:type]
|
|
241
|
-
end
|
|
242
241
|
type = aliased_types(type.to_s, type)
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
add_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, table_name, column_name) if type
|
|
249
|
-
|
|
250
|
-
execute(add_column_sql)
|
|
251
|
-
|
|
242
|
+
at = create_alter_table table_name
|
|
243
|
+
at.add_column(column_name, type, options)
|
|
244
|
+
add_column_sql = schema_creation.accept at
|
|
245
|
+
add_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, table_name, column_name)
|
|
246
|
+
execute add_column_sql
|
|
252
247
|
create_sequence_and_trigger(table_name, options) if type && type.to_sym == :primary_key
|
|
253
248
|
change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
|
|
254
249
|
ensure
|
|
@@ -273,7 +268,7 @@ module ActiveRecord
|
|
|
273
268
|
execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
|
|
274
269
|
end
|
|
275
270
|
|
|
276
|
-
change_column table_name, column_name, column.sql_type, :
|
|
271
|
+
change_column table_name, column_name, column.sql_type, null: null
|
|
277
272
|
end
|
|
278
273
|
|
|
279
274
|
def change_column(table_name, column_name, type, options = {}) #:nodoc:
|
|
@@ -287,14 +282,15 @@ module ActiveRecord
|
|
|
287
282
|
if type.to_sym == :virtual
|
|
288
283
|
type = options[:type]
|
|
289
284
|
end
|
|
290
|
-
change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{quote_column_name(column_name)} "
|
|
291
|
-
change_column_sql << "#{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" if type
|
|
292
|
-
|
|
293
|
-
add_column_options!(change_column_sql, options.merge(:type=>type, :column_name=>column_name, :table_name=>table_name))
|
|
294
|
-
|
|
295
|
-
change_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, options[:table_name], options[:column_name]) if type
|
|
296
285
|
|
|
286
|
+
td = create_table_definition(table_name)
|
|
287
|
+
cd = td.new_column_definition(column.name, type, options)
|
|
288
|
+
change_column_stmt = schema_creation.accept cd
|
|
289
|
+
change_column_stmt << tablespace_for((type_to_sql(type).downcase.to_sym), nil, options[:table_name], options[:column_name]) if type
|
|
290
|
+
change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{change_column_stmt}"
|
|
297
291
|
execute(change_column_sql)
|
|
292
|
+
|
|
293
|
+
change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
|
|
298
294
|
ensure
|
|
299
295
|
clear_table_columns_cache(table_name)
|
|
300
296
|
end
|
|
@@ -345,9 +341,9 @@ module ActiveRecord
|
|
|
345
341
|
end
|
|
346
342
|
|
|
347
343
|
# Maps logical Rails types to Oracle-specific data types.
|
|
348
|
-
def type_to_sql(type, limit
|
|
344
|
+
def type_to_sql(type, limit: nil, precision: nil, scale: nil, **) #:nodoc:
|
|
349
345
|
# Ignore options for :text and :binary columns
|
|
350
|
-
return super(type
|
|
346
|
+
return super(type) if ["text", "binary"].include?(type.to_s)
|
|
351
347
|
|
|
352
348
|
super
|
|
353
349
|
end
|
|
@@ -361,28 +357,11 @@ module ActiveRecord
|
|
|
361
357
|
SQL
|
|
362
358
|
end
|
|
363
359
|
|
|
364
|
-
def add_foreign_key(from_table, to_table, options = {})
|
|
365
|
-
if options[:dependent]
|
|
366
|
-
ActiveSupport::Deprecation.warn "`:dependent` option will be deprecated. Please use `:on_delete` option"
|
|
367
|
-
end
|
|
368
|
-
case options[:dependent]
|
|
369
|
-
when :delete then options[:on_delete] = :cascade
|
|
370
|
-
when :nullify then options[:on_delete] = :nullify
|
|
371
|
-
else
|
|
372
|
-
end
|
|
373
|
-
|
|
374
|
-
super
|
|
375
|
-
end
|
|
376
|
-
|
|
377
|
-
def remove_foreign_key(from_table, options_or_to_table = {})
|
|
378
|
-
super
|
|
379
|
-
end
|
|
380
|
-
|
|
381
360
|
# get table foreign keys for schema dump
|
|
382
361
|
def foreign_keys(table_name) #:nodoc:
|
|
383
362
|
(owner, desc_table_name, db_link) = @connection.describe(table_name)
|
|
384
363
|
|
|
385
|
-
fk_info = select_all(<<-SQL,
|
|
364
|
+
fk_info = select_all(<<-SQL, "Foreign Keys")
|
|
386
365
|
SELECT r.table_name to_table
|
|
387
366
|
,rc.column_name references_column
|
|
388
367
|
,cc.column_name
|
|
@@ -391,7 +370,7 @@ module ActiveRecord
|
|
|
391
370
|
FROM all_constraints#{db_link} c, all_cons_columns#{db_link} cc,
|
|
392
371
|
all_constraints#{db_link} r, all_cons_columns#{db_link} rc
|
|
393
372
|
WHERE c.owner = '#{owner}'
|
|
394
|
-
AND c.table_name = '#{desc_table_name}'
|
|
373
|
+
AND c.table_name = q'[#{desc_table_name}]'
|
|
395
374
|
AND c.constraint_type = 'R'
|
|
396
375
|
AND cc.owner = c.owner
|
|
397
376
|
AND cc.constraint_name = c.constraint_name
|
|
@@ -405,19 +384,19 @@ module ActiveRecord
|
|
|
405
384
|
|
|
406
385
|
fk_info.map do |row|
|
|
407
386
|
options = {
|
|
408
|
-
column: oracle_downcase(row[
|
|
409
|
-
name: oracle_downcase(row[
|
|
410
|
-
primary_key: oracle_downcase(row[
|
|
387
|
+
column: oracle_downcase(row["column_name"]),
|
|
388
|
+
name: oracle_downcase(row["name"]),
|
|
389
|
+
primary_key: oracle_downcase(row["references_column"])
|
|
411
390
|
}
|
|
412
|
-
options[:on_delete] = extract_foreign_key_action(row[
|
|
413
|
-
|
|
391
|
+
options[:on_delete] = extract_foreign_key_action(row["delete_rule"])
|
|
392
|
+
ActiveRecord::ConnectionAdapters::ForeignKeyDefinition.new(oracle_downcase(table_name), oracle_downcase(row["to_table"]), options)
|
|
414
393
|
end
|
|
415
394
|
end
|
|
416
395
|
|
|
417
396
|
def extract_foreign_key_action(specifier) # :nodoc:
|
|
418
397
|
case specifier
|
|
419
|
-
when
|
|
420
|
-
when
|
|
398
|
+
when "CASCADE"; :cascade
|
|
399
|
+
when "SET NULL"; :nullify
|
|
421
400
|
end
|
|
422
401
|
end
|
|
423
402
|
|
|
@@ -434,59 +413,62 @@ module ActiveRecord
|
|
|
434
413
|
old_constraints = select_all(sql_constraints)
|
|
435
414
|
begin
|
|
436
415
|
old_constraints.each do |constraint|
|
|
437
|
-
execute "ALTER TABLE #{constraint["table_name"]} DISABLE CONSTRAINT #{constraint["constraint_name"]}"
|
|
416
|
+
execute "ALTER TABLE #{quote_table_name(constraint["table_name"])} DISABLE CONSTRAINT #{quote_table_name(constraint["constraint_name"])}"
|
|
438
417
|
end
|
|
439
418
|
yield
|
|
440
419
|
ensure
|
|
441
420
|
old_constraints.each do |constraint|
|
|
442
|
-
execute "ALTER TABLE #{constraint["table_name"]} ENABLE CONSTRAINT #{constraint["constraint_name"]}"
|
|
421
|
+
execute "ALTER TABLE #{quote_table_name(constraint["table_name"])} ENABLE CONSTRAINT #{quote_table_name(constraint["constraint_name"])}"
|
|
443
422
|
end
|
|
444
423
|
end
|
|
445
424
|
end
|
|
446
425
|
|
|
447
|
-
private
|
|
448
|
-
|
|
449
426
|
def create_alter_table(name)
|
|
450
|
-
OracleEnhanced::AlterTable.new create_table_definition(name, false, {})
|
|
451
|
-
end
|
|
452
|
-
|
|
453
|
-
def tablespace_for(obj_type, tablespace_option, table_name=nil, column_name=nil)
|
|
454
|
-
tablespace_sql = ''
|
|
455
|
-
if tablespace = (tablespace_option || default_tablespace_for(obj_type))
|
|
456
|
-
tablespace_sql << if [:blob, :clob].include?(obj_type.to_sym)
|
|
457
|
-
" LOB (#{quote_column_name(column_name)}) STORE AS #{column_name.to_s[0..10]}_#{table_name.to_s[0..14]}_ls (TABLESPACE #{tablespace})"
|
|
458
|
-
else
|
|
459
|
-
" TABLESPACE #{tablespace}"
|
|
460
|
-
end
|
|
461
|
-
end
|
|
462
|
-
tablespace_sql
|
|
427
|
+
ActiveRecord::ConnectionAdapters::OracleEnhanced::AlterTable.new create_table_definition(name, false, {})
|
|
463
428
|
end
|
|
464
429
|
|
|
465
|
-
def
|
|
466
|
-
(
|
|
430
|
+
def update_table_definition(table_name, base)
|
|
431
|
+
ActiveRecord::ConnectionAdapters::OracleEnhanced::Table.new(table_name, base)
|
|
467
432
|
end
|
|
468
433
|
|
|
434
|
+
private
|
|
469
435
|
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
436
|
+
def tablespace_for(obj_type, tablespace_option, table_name = nil, column_name = nil)
|
|
437
|
+
tablespace_sql = ""
|
|
438
|
+
if tablespace = (tablespace_option || default_tablespace_for(obj_type))
|
|
439
|
+
if [:blob, :clob].include?(obj_type.to_sym)
|
|
440
|
+
tablespace_sql << " LOB (#{quote_column_name(column_name)}) STORE AS #{column_name.to_s[0..10]}_#{table_name.to_s[0..14]}_ls (TABLESPACE #{tablespace})"
|
|
441
|
+
else
|
|
442
|
+
tablespace_sql << " TABLESPACE #{tablespace}"
|
|
443
|
+
end
|
|
444
|
+
end
|
|
445
|
+
tablespace_sql
|
|
473
446
|
end
|
|
474
|
-
column
|
|
475
|
-
end
|
|
476
447
|
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
execute "CREATE SEQUENCE #{quote_table_name(seq_name)} START WITH #{seq_start_value}"
|
|
448
|
+
def default_tablespace_for(type)
|
|
449
|
+
(default_tablespaces[type] || default_tablespaces[native_database_types[type][:name]]) rescue nil
|
|
450
|
+
end
|
|
481
451
|
|
|
482
|
-
|
|
483
|
-
|
|
452
|
+
def column_for(table_name, column_name)
|
|
453
|
+
unless column = columns(table_name).find { |c| c.name == column_name.to_s }
|
|
454
|
+
raise "No such column: #{table_name}.#{column_name}"
|
|
455
|
+
end
|
|
456
|
+
column
|
|
457
|
+
end
|
|
484
458
|
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
459
|
+
def create_sequence_and_trigger(table_name, options)
|
|
460
|
+
seq_name = options[:sequence_name] || default_sequence_name(table_name)
|
|
461
|
+
seq_start_value = options[:sequence_start_value] || default_sequence_start_value
|
|
462
|
+
execute "CREATE SEQUENCE #{quote_table_name(seq_name)} START WITH #{seq_start_value}"
|
|
463
|
+
|
|
464
|
+
create_primary_key_trigger(table_name, options) if options[:primary_key_trigger]
|
|
465
|
+
end
|
|
466
|
+
|
|
467
|
+
def create_primary_key_trigger(table_name, options)
|
|
468
|
+
seq_name = options[:sequence_name] || default_sequence_name(table_name)
|
|
469
|
+
trigger_name = options[:trigger_name] || default_trigger_name(table_name)
|
|
470
|
+
primary_key = options[:primary_key] || Base.get_primary_key(table_name.to_s.singularize)
|
|
471
|
+
execute compress_lines(<<-SQL)
|
|
490
472
|
CREATE OR REPLACE TRIGGER #{quote_table_name(trigger_name)}
|
|
491
473
|
BEFORE INSERT ON #{quote_table_name(table_name)} FOR EACH ROW
|
|
492
474
|
BEGIN
|
|
@@ -497,13 +479,28 @@ module ActiveRecord
|
|
|
497
479
|
END IF;
|
|
498
480
|
END;
|
|
499
481
|
SQL
|
|
500
|
-
|
|
482
|
+
end
|
|
501
483
|
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
484
|
+
def default_trigger_name(table_name)
|
|
485
|
+
# truncate table name if necessary to fit in max length of identifier
|
|
486
|
+
"#{table_name.to_s[0, table_name_length - 4]}_pkt"
|
|
487
|
+
end
|
|
488
|
+
|
|
489
|
+
def rebuild_primary_key_index_to_default_tablespace(table_name, options)
|
|
490
|
+
tablespace = default_tablespace_for(:index)
|
|
506
491
|
|
|
492
|
+
return unless tablespace
|
|
493
|
+
|
|
494
|
+
index_name = Base.connection.select_value(
|
|
495
|
+
"SELECT index_name FROM all_constraints
|
|
496
|
+
WHERE table_name = #{quote(table_name.upcase)}
|
|
497
|
+
AND constraint_type = 'P'
|
|
498
|
+
AND owner = SYS_CONTEXT('userenv', 'current_schema')")
|
|
499
|
+
|
|
500
|
+
return unless index_name
|
|
501
|
+
|
|
502
|
+
execute("ALTER INDEX #{quote_column_name(index_name)} REBUILD TABLESPACE #{tablespace}")
|
|
503
|
+
end
|
|
507
504
|
end
|
|
508
505
|
end
|
|
509
506
|
end
|
|
@@ -16,7 +16,7 @@ module ActiveRecord
|
|
|
16
16
|
# # ...
|
|
17
17
|
# end
|
|
18
18
|
#
|
|
19
|
-
def add_primary_key_trigger(table_name, options={})
|
|
19
|
+
def add_primary_key_trigger(table_name, options = {})
|
|
20
20
|
# call the same private method that is used for create_table :primary_key_trigger => true
|
|
21
21
|
create_primary_key_trigger(table_name, options)
|
|
22
22
|
end
|
|
@@ -50,11 +50,10 @@ module ActiveRecord
|
|
|
50
50
|
# get synonyms for schema dump
|
|
51
51
|
def synonyms #:nodoc:
|
|
52
52
|
select_all("SELECT synonym_name, table_owner, table_name, db_link FROM all_synonyms where owner = SYS_CONTEXT('userenv', 'session_user')").collect do |row|
|
|
53
|
-
OracleEnhanced::SynonymDefinition.new(oracle_downcase(row[
|
|
54
|
-
oracle_downcase(row[
|
|
53
|
+
OracleEnhanced::SynonymDefinition.new(oracle_downcase(row["synonym_name"]),
|
|
54
|
+
oracle_downcase(row["table_owner"]), oracle_downcase(row["table_name"]), oracle_downcase(row["db_link"]))
|
|
55
55
|
end
|
|
56
56
|
end
|
|
57
|
-
|
|
58
57
|
end
|
|
59
58
|
end
|
|
60
59
|
end
|