[Ovirt-devel] [PATCH] enhance & fix foreigner plugin to manage correctly named foreign key
Loiseleur Michel
mloiseleur at linagora.com
Thu Oct 15 09:23:56 UTC 2009
This patch fixes current foreigner plugins in order to :
1) be able to add constraint on a named table
2) be able to drop fk with postgres
Signed-off-by: Loiseleur Michel <mloiseleur at linagora.com>
---
.../abstract/schema_definitions.rb | 2 +-
.../connection_adapters/postgresql_adapter.rb | 15 ++++++++++++-
.../lib/foreigner/connection_adapters/sql_2003.rb | 21 +++++++++----------
3 files changed, 24 insertions(+), 14 deletions(-)
diff --git a/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/abstract/schema_definitions.rb b/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/abstract/schema_definitions.rb
index e417c5b..3598d05 100644
--- a/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/abstract/schema_definitions.rb
+++ b/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/abstract/schema_definitions.rb
@@ -18,7 +18,7 @@ module Foreigner
module TableDefinition
class ForeignKey < Struct.new(:base, :to_table, :options)
def to_sql
- base.foreign_key_definition(to_table, options)
+ base.foreign_key_definition(@table_name, to_table, options)
end
alias to_s :to_sql
end
diff --git a/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/postgresql_adapter.rb b/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/postgresql_adapter.rb
index be662b3..fec81cd 100644
--- a/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/postgresql_adapter.rb
+++ b/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/postgresql_adapter.rb
@@ -23,7 +23,7 @@ module Foreigner
}
fk_info.map do |row|
- options = {:column => row['column'], :name => row['name'], :primary_key = row['primary_key']}
+ options = {:column => row['column'], :name => row['name'], :primary_key => row['primary_key']}
if row['dependency'] == 'CASCADE'
options[:dependent] = :delete
@@ -33,6 +33,17 @@ module Foreigner
ForeignKeyDefinition.new(table_name, row['to_table'], options)
end
end
+
+ def remove_foreign_key(table, options)
+ if Hash === options
+ foreign_key_name = foreign_key_name(table, options[:column], options)
+ else
+ foreign_key_name = foreign_key_name(table, "#{options.to_s.singularize}_id")
+ end
+
+ execute "ALTER TABLE #{quote_table_name(table)} DROP CONSTRAINT #{quote_column_name(foreign_key_name)}"
+ end
+
end
end
end
@@ -43,4 +54,4 @@ module ActiveRecord
include Foreigner::ConnectionAdapters::PostgreSQLAdapter
end
end
-end
\ No newline at end of file
+end
diff --git a/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/sql_2003.rb b/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/sql_2003.rb
index 1a1019b..957111b 100644
--- a/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/sql_2003.rb
+++ b/src/vendor/plugins/foreigner/lib/foreigner/connection_adapters/sql_2003.rb
@@ -4,25 +4,24 @@ module Foreigner
def supports_foreign_keys?
true
end
-
+
def add_foreign_key(from_table, to_table, options = {})
column = options[:column] || "#{to_table.to_s.singularize}_id"
- foreign_key_name = foreign_key_name(from_table, column, options)
- sql =
- "ALTER TABLE #{quote_table_name(from_table)} " +
- "ADD CONSTRAINT #{quote_column_name(foreign_key_name)} " +
- foreign_key_definition(to_table, options)
-
+ sql = "ALTER TABLE #{quote_table_name(from_table)} ADD " <<
+ foreign_key_definition(from_table, to_table, options)
+
execute(sql)
end
-
- def foreign_key_definition(to_table, options = {})
+
+ def foreign_key_definition(from_table, to_table, options = {})
column = options[:column] || "#{to_table.to_s.singularize}_id"
+ foreign_key_name = foreign_key_name(from_table, column, options)
primary_key = options[:primary_key] || "id"
dependency = dependency_sql(options[:dependent])
- sql = "FOREIGN KEY (#{quote_column_name(column)}) REFERENCES #{quote_table_name(to_table)}(#{primary_key})"
+ sql = "CONSTRAINT #{quote_column_name(foreign_key_name)} "
+ sql << "FOREIGN KEY (#{quote_column_name(column)}) REFERENCES #{quote_table_name(to_table)}(#{primary_key})"
sql << " #{dependency}" unless dependency.blank?
sql
end
@@ -36,7 +35,7 @@ module Foreigner
execute "ALTER TABLE #{quote_table_name(table)} DROP FOREIGN KEY #{quote_column_name(foreign_key_name)}"
end
-
+
private
def foreign_key_name(table, column, options = {})
if options[:name]
--
1.6.2.5
More information about the ovirt-devel
mailing list