[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