activerecord-oracle_enhanced-adapter 1.7.7 → 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 +225 -0
- data/README.md +14 -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 +58 -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 +51 -79
- 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 +112 -132
- 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 +292 -539
- 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 +2 -3
- data/spec/active_record/connection_adapters/oracle_enhanced_adapter_spec.rb +82 -162
- data/spec/active_record/connection_adapters/oracle_enhanced_connection_spec.rb +35 -35
- 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 +270 -365
- 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 +73 -77
- 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 +263 -329
- 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 -83
- 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,10 +80,10 @@ 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
88
|
rebuild_primary_key_index_to_default_tablespace(table_name, options)
|
|
89
89
|
end
|
|
@@ -113,22 +113,30 @@ module ActiveRecord
|
|
|
113
113
|
self.all_schema_indexes = nil
|
|
114
114
|
end
|
|
115
115
|
|
|
116
|
-
def
|
|
117
|
-
|
|
118
|
-
end
|
|
119
|
-
|
|
120
|
-
def initialize_schema_migrations_table
|
|
121
|
-
super
|
|
122
|
-
end
|
|
116
|
+
def insert_versions_sql(versions) # :nodoc:
|
|
117
|
+
sm_table = quote_table_name(ActiveRecord::SchemaMigration.table_name)
|
|
123
118
|
|
|
124
|
-
|
|
125
|
-
|
|
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
|
|
126
134
|
end
|
|
127
135
|
|
|
128
136
|
def add_index(table_name, column_name, options = {}) #:nodoc:
|
|
129
137
|
index_name, index_type, quoted_column_names, tablespace, index_options = add_index_options(table_name, column_name, options)
|
|
130
138
|
execute "CREATE #{index_type} INDEX #{quote_column_name(index_name)} ON #{quote_table_name(table_name)} (#{quoted_column_names})#{tablespace} #{index_options}"
|
|
131
|
-
if index_type ==
|
|
139
|
+
if index_type == "UNIQUE"
|
|
132
140
|
unless quoted_column_names =~ /\(.*\)/
|
|
133
141
|
execute "ALTER TABLE #{quote_table_name(table_name)} ADD CONSTRAINT #{quote_column_name(index_name)} #{index_type} (#{quoted_column_names})"
|
|
134
142
|
end
|
|
@@ -153,29 +161,18 @@ module ActiveRecord
|
|
|
153
161
|
if index_name.to_s.length > max_index_length
|
|
154
162
|
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' is too long; the limit is #{max_index_length} characters"
|
|
155
163
|
end
|
|
156
|
-
if index_name_exists?(table_name, index_name
|
|
164
|
+
if table_exists?(table_name) && index_name_exists?(table_name, index_name)
|
|
157
165
|
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' already exists"
|
|
158
166
|
end
|
|
159
167
|
|
|
160
168
|
quoted_column_names = column_names.map { |e| quote_column_name_or_expression(e) }.join(", ")
|
|
161
|
-
|
|
169
|
+
[index_name, index_type, quoted_column_names, tablespace, index_options]
|
|
162
170
|
end
|
|
163
171
|
|
|
164
172
|
# Remove the given index from the table.
|
|
165
173
|
# Gives warning if index does not exist
|
|
166
174
|
def remove_index(table_name, options = {}) #:nodoc:
|
|
167
175
|
index_name = index_name_for_remove(table_name, options)
|
|
168
|
-
unless index_name_exists?(table_name, index_name, true)
|
|
169
|
-
# sometimes options can be String or Array with column names
|
|
170
|
-
options = {} unless options.is_a?(Hash)
|
|
171
|
-
if options.has_key? :name
|
|
172
|
-
options_without_column = options.dup
|
|
173
|
-
options_without_column.delete :column
|
|
174
|
-
index_name_without_column = index_name(table_name, options_without_column)
|
|
175
|
-
return index_name_without_column if index_name_exists?(table_name, index_name_without_column, false)
|
|
176
|
-
end
|
|
177
|
-
raise ArgumentError, "Index name '#{index_name}' on table '#{table_name}' does not exist"
|
|
178
|
-
end
|
|
179
176
|
#TODO: It should execute only when index_type == "UNIQUE"
|
|
180
177
|
execute "ALTER TABLE #{quote_table_name(table_name)} DROP CONSTRAINT #{quote_column_name(index_name)}" rescue nil
|
|
181
178
|
execute "DROP INDEX #{quote_column_name(index_name)}"
|
|
@@ -196,11 +193,11 @@ module ActiveRecord
|
|
|
196
193
|
|
|
197
194
|
# leave just first three letters from each word
|
|
198
195
|
if shortened_name.length > identifier_max_length
|
|
199
|
-
shortened_name = shortened_name.split(
|
|
196
|
+
shortened_name = shortened_name.split("_").map { |w| w[0, 3] }.join("_")
|
|
200
197
|
end
|
|
201
198
|
# generate unique name using hash function
|
|
202
199
|
if shortened_name.length > identifier_max_length
|
|
203
|
-
shortened_name =
|
|
200
|
+
shortened_name = "i" + Digest::SHA1.hexdigest(default_name)[0, identifier_max_length - 1]
|
|
204
201
|
end
|
|
205
202
|
@logger.warn "#{adapter_name} shortened default index name #{default_name} to #{shortened_name}" if @logger
|
|
206
203
|
shortened_name
|
|
@@ -212,7 +209,12 @@ module ActiveRecord
|
|
|
212
209
|
# as there's no way to determine the correct answer in that case.
|
|
213
210
|
#
|
|
214
211
|
# Will always query database and not index cache.
|
|
215
|
-
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
|
|
216
218
|
(owner, table_name, db_link) = @connection.describe(table_name)
|
|
217
219
|
result = select_value(<<-SQL)
|
|
218
220
|
SELECT 1 FROM all_indexes#{db_link} i
|
|
@@ -225,31 +227,23 @@ module ActiveRecord
|
|
|
225
227
|
end
|
|
226
228
|
|
|
227
229
|
def rename_index(table_name, old_name, new_name) #:nodoc:
|
|
228
|
-
|
|
229
|
-
raise ArgumentError, "Index name '#{old_name}' on table '#{table_name}' does not exist"
|
|
230
|
-
end
|
|
231
|
-
if new_name.length > allowed_index_name_length
|
|
232
|
-
raise ArgumentError, "Index name '#{new_name}' on table '#{table_name}' is too long; the limit is #{allowed_index_name_length} characters"
|
|
233
|
-
end
|
|
230
|
+
validate_index_length!(table_name, new_name)
|
|
234
231
|
execute "ALTER INDEX #{quote_column_name(old_name)} rename to #{quote_column_name(new_name)}"
|
|
235
232
|
ensure
|
|
236
233
|
self.all_schema_indexes = nil
|
|
237
234
|
end
|
|
238
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
|
+
|
|
239
240
|
def add_column(table_name, column_name, type, options = {}) #:nodoc:
|
|
240
|
-
if type.to_sym == :virtual
|
|
241
|
-
type = options[:type]
|
|
242
|
-
end
|
|
243
241
|
type = aliased_types(type.to_s, type)
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
add_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, table_name, column_name) if type
|
|
250
|
-
|
|
251
|
-
execute(add_column_sql)
|
|
252
|
-
|
|
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
|
|
253
247
|
create_sequence_and_trigger(table_name, options) if type && type.to_sym == :primary_key
|
|
254
248
|
change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
|
|
255
249
|
ensure
|
|
@@ -274,7 +268,7 @@ module ActiveRecord
|
|
|
274
268
|
execute("UPDATE #{quote_table_name(table_name)} SET #{quote_column_name(column_name)}=#{quote(default)} WHERE #{quote_column_name(column_name)} IS NULL")
|
|
275
269
|
end
|
|
276
270
|
|
|
277
|
-
change_column table_name, column_name, column.sql_type, :
|
|
271
|
+
change_column table_name, column_name, column.sql_type, null: null
|
|
278
272
|
end
|
|
279
273
|
|
|
280
274
|
def change_column(table_name, column_name, type, options = {}) #:nodoc:
|
|
@@ -288,14 +282,15 @@ module ActiveRecord
|
|
|
288
282
|
if type.to_sym == :virtual
|
|
289
283
|
type = options[:type]
|
|
290
284
|
end
|
|
291
|
-
change_column_sql = "ALTER TABLE #{quote_table_name(table_name)} MODIFY #{quote_column_name(column_name)} "
|
|
292
|
-
change_column_sql << "#{type_to_sql(type, options[:limit], options[:precision], options[:scale])}" if type
|
|
293
|
-
|
|
294
|
-
add_column_options!(change_column_sql, options.merge(:type=>type, :column_name=>column_name, :table_name=>table_name))
|
|
295
|
-
|
|
296
|
-
change_column_sql << tablespace_for((type_to_sql(type).downcase.to_sym), nil, options[:table_name], options[:column_name]) if type
|
|
297
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}"
|
|
298
291
|
execute(change_column_sql)
|
|
292
|
+
|
|
293
|
+
change_column_comment(table_name, column_name, options[:comment]) if options.key?(:comment)
|
|
299
294
|
ensure
|
|
300
295
|
clear_table_columns_cache(table_name)
|
|
301
296
|
end
|
|
@@ -346,9 +341,9 @@ module ActiveRecord
|
|
|
346
341
|
end
|
|
347
342
|
|
|
348
343
|
# Maps logical Rails types to Oracle-specific data types.
|
|
349
|
-
def type_to_sql(type, limit
|
|
344
|
+
def type_to_sql(type, limit: nil, precision: nil, scale: nil, **) #:nodoc:
|
|
350
345
|
# Ignore options for :text and :binary columns
|
|
351
|
-
return super(type
|
|
346
|
+
return super(type) if ["text", "binary"].include?(type.to_s)
|
|
352
347
|
|
|
353
348
|
super
|
|
354
349
|
end
|
|
@@ -362,28 +357,11 @@ module ActiveRecord
|
|
|
362
357
|
SQL
|
|
363
358
|
end
|
|
364
359
|
|
|
365
|
-
def add_foreign_key(from_table, to_table, options = {})
|
|
366
|
-
if options[:dependent]
|
|
367
|
-
ActiveSupport::Deprecation.warn "`:dependent` option will be deprecated. Please use `:on_delete` option"
|
|
368
|
-
end
|
|
369
|
-
case options[:dependent]
|
|
370
|
-
when :delete then options[:on_delete] = :cascade
|
|
371
|
-
when :nullify then options[:on_delete] = :nullify
|
|
372
|
-
else
|
|
373
|
-
end
|
|
374
|
-
|
|
375
|
-
super
|
|
376
|
-
end
|
|
377
|
-
|
|
378
|
-
def remove_foreign_key(from_table, options_or_to_table = {})
|
|
379
|
-
super
|
|
380
|
-
end
|
|
381
|
-
|
|
382
360
|
# get table foreign keys for schema dump
|
|
383
361
|
def foreign_keys(table_name) #:nodoc:
|
|
384
362
|
(owner, desc_table_name, db_link) = @connection.describe(table_name)
|
|
385
363
|
|
|
386
|
-
fk_info = select_all(<<-SQL,
|
|
364
|
+
fk_info = select_all(<<-SQL, "Foreign Keys")
|
|
387
365
|
SELECT r.table_name to_table
|
|
388
366
|
,rc.column_name references_column
|
|
389
367
|
,cc.column_name
|
|
@@ -392,7 +370,7 @@ module ActiveRecord
|
|
|
392
370
|
FROM all_constraints#{db_link} c, all_cons_columns#{db_link} cc,
|
|
393
371
|
all_constraints#{db_link} r, all_cons_columns#{db_link} rc
|
|
394
372
|
WHERE c.owner = '#{owner}'
|
|
395
|
-
AND c.table_name = '#{desc_table_name}'
|
|
373
|
+
AND c.table_name = q'[#{desc_table_name}]'
|
|
396
374
|
AND c.constraint_type = 'R'
|
|
397
375
|
AND cc.owner = c.owner
|
|
398
376
|
AND cc.constraint_name = c.constraint_name
|
|
@@ -406,19 +384,19 @@ module ActiveRecord
|
|
|
406
384
|
|
|
407
385
|
fk_info.map do |row|
|
|
408
386
|
options = {
|
|
409
|
-
column: oracle_downcase(row[
|
|
410
|
-
name: oracle_downcase(row[
|
|
411
|
-
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"])
|
|
412
390
|
}
|
|
413
|
-
options[:on_delete] = extract_foreign_key_action(row[
|
|
414
|
-
|
|
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)
|
|
415
393
|
end
|
|
416
394
|
end
|
|
417
395
|
|
|
418
396
|
def extract_foreign_key_action(specifier) # :nodoc:
|
|
419
397
|
case specifier
|
|
420
|
-
when
|
|
421
|
-
when
|
|
398
|
+
when "CASCADE"; :cascade
|
|
399
|
+
when "SET NULL"; :nullify
|
|
422
400
|
end
|
|
423
401
|
end
|
|
424
402
|
|
|
@@ -445,49 +423,52 @@ module ActiveRecord
|
|
|
445
423
|
end
|
|
446
424
|
end
|
|
447
425
|
|
|
448
|
-
private
|
|
449
|
-
|
|
450
426
|
def create_alter_table(name)
|
|
451
|
-
OracleEnhanced::AlterTable.new create_table_definition(name, false, {})
|
|
452
|
-
end
|
|
453
|
-
|
|
454
|
-
def tablespace_for(obj_type, tablespace_option, table_name=nil, column_name=nil)
|
|
455
|
-
tablespace_sql = ''
|
|
456
|
-
if tablespace = (tablespace_option || default_tablespace_for(obj_type))
|
|
457
|
-
tablespace_sql << if [:blob, :clob].include?(obj_type.to_sym)
|
|
458
|
-
" LOB (#{quote_column_name(column_name)}) STORE AS #{column_name.to_s[0..10]}_#{table_name.to_s[0..14]}_ls (TABLESPACE #{tablespace})"
|
|
459
|
-
else
|
|
460
|
-
" TABLESPACE #{tablespace}"
|
|
461
|
-
end
|
|
462
|
-
end
|
|
463
|
-
tablespace_sql
|
|
427
|
+
ActiveRecord::ConnectionAdapters::OracleEnhanced::AlterTable.new create_table_definition(name, false, {})
|
|
464
428
|
end
|
|
465
429
|
|
|
466
|
-
def
|
|
467
|
-
(
|
|
430
|
+
def update_table_definition(table_name, base)
|
|
431
|
+
ActiveRecord::ConnectionAdapters::OracleEnhanced::Table.new(table_name, base)
|
|
468
432
|
end
|
|
469
433
|
|
|
434
|
+
private
|
|
470
435
|
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
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
|
|
474
446
|
end
|
|
475
|
-
column
|
|
476
|
-
end
|
|
477
447
|
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
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
|
|
482
451
|
|
|
483
|
-
|
|
484
|
-
|
|
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
|
|
485
458
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
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)
|
|
491
472
|
CREATE OR REPLACE TRIGGER #{quote_table_name(trigger_name)}
|
|
492
473
|
BEFORE INSERT ON #{quote_table_name(table_name)} FOR EACH ROW
|
|
493
474
|
BEGIN
|
|
@@ -498,29 +479,28 @@ module ActiveRecord
|
|
|
498
479
|
END IF;
|
|
499
480
|
END;
|
|
500
481
|
SQL
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
def default_trigger_name(table_name)
|
|
504
|
-
# truncate table name if necessary to fit in max length of identifier
|
|
505
|
-
"#{table_name.to_s[0,table_name_length-4]}_pkt"
|
|
506
|
-
end
|
|
482
|
+
end
|
|
507
483
|
|
|
508
|
-
|
|
509
|
-
|
|
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
|
|
510
488
|
|
|
511
|
-
|
|
489
|
+
def rebuild_primary_key_index_to_default_tablespace(table_name, options)
|
|
490
|
+
tablespace = default_tablespace_for(:index)
|
|
512
491
|
|
|
513
|
-
|
|
514
|
-
"SELECT index_name FROM all_constraints
|
|
515
|
-
WHERE table_name = #{quote(table_name.upcase)}
|
|
516
|
-
AND constraint_type = 'P'
|
|
517
|
-
AND owner = SYS_CONTEXT('userenv', 'current_schema')")
|
|
492
|
+
return unless tablespace
|
|
518
493
|
|
|
519
|
-
|
|
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')")
|
|
520
499
|
|
|
521
|
-
|
|
522
|
-
end
|
|
500
|
+
return unless index_name
|
|
523
501
|
|
|
502
|
+
execute("ALTER INDEX #{quote_column_name(index_name)} REBUILD TABLESPACE #{tablespace}")
|
|
503
|
+
end
|
|
524
504
|
end
|
|
525
505
|
end
|
|
526
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
|