#   Copyright (c) 2010-2011, Diaspora Inc.  This file is
#   licensed under the Affero General Public License version 3 or later.  See
#   the COPYRIGHT file.

DatabaseCleaner::ActiveRecord::Truncation.class_eval do
  # You could argue that this technically isn't truncation. You'd be right.
  # But something in the MySQL adapter segfaults (!) on actual truncation, and we
  # don't have that much data in our tests, so a DELETE is not appreciably slower.
  def clean
    connection.disable_referential_integrity do
      tables_to_truncate.each do |table_name|
        connection.execute("DELETE FROM #{table_name};")
      end
    end
  end
end
#   Copyright (c) 2010-2011, Diaspora Inc.  This file is
#   licensed under the Affero General Public License version 3 or later.  See
#   the COPYRIGHT file.

# disable_referential_integrity doesn't work when using PostgreSQL
# with a non-root user.
# See http://kopongo.com/2008/7/25/postgres-ri_constrainttrigger-error
module ActiveRecord
  module ConnectionAdapters
    class PostgreSQLAdapter < AbstractAdapter
      def disable_referential_integrity(&block)
         transaction {
           begin
             execute "SET CONSTRAINTS ALL DEFERRED"
             yield
           ensure
             execute "SET CONSTRAINTS ALL IMMEDIATE"
           end
         }
      end
    end
  end
end

DatabaseCleaner::ActiveRecord::Truncation.class_eval do
  # You could argue that this technically isn't truncation. You'd be right.
  # But something in the MySQL adapter segfaults (!) on actual truncation, and we
  # don't have that much data in our tests, so a DELETE is not appreciably slower.
  def clean
    connection.disable_referential_integrity do
      tables_to_truncate.each do |table_name|
        connection.execute("DELETE FROM #{table_name};")
      end
    end
  end
end

Allow Cucumber tests to run with PostgreSQL with a non-root user.
Allow Cucumber tests to run with PostgreSQL with a non-root user.
