OSDN Git Service

Clear changesets and changes with raw sql when deleting a repository (#1627).
authorJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 13 Jul 2008 21:55:13 +0000 (21:55 +0000)
committerJean-Philippe Lang <jp_lang@yahoo.fr>
Sun, 13 Jul 2008 21:55:13 +0000 (21:55 +0000)
git-svn-id: http://redmine.rubyforge.org/svn/trunk@1666 e93f8b46-1217-0410-a6f0-8f06a7374b81

app/models/repository.rb
test/unit/repository_test.rb

index 2a8728f..9768e3e 100644 (file)
 
 class Repository < ActiveRecord::Base
   belongs_to :project
-  has_many :changesets, :dependent => :destroy, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"
+  has_many :changesets, :order => "#{Changeset.table_name}.committed_on DESC, #{Changeset.table_name}.id DESC"
   has_many :changes, :through => :changesets
   
+  # Raw SQL to delete changesets and changes in the database
+  # has_many :changesets, :dependent => :destroy is too slow for big repositories
+  before_destroy :clear_changesets
+  
   # Checks if the SCM is enabled when creating a repository
   validate_on_create { |r| r.errors.add(:type, :activerecord_error_invalid) unless Setting.enabled_scm.include?(r.class.name.demodulize) }
   
@@ -127,4 +131,9 @@ class Repository < ActiveRecord::Base
     root_url.strip!
     true
   end
+  
+  def clear_changesets
+    connection.delete("DELETE FROM changes WHERE changes.changeset_id IN (SELECT changesets.id FROM changesets WHERE changesets.repository_id = #{id})")
+    connection.delete("DELETE FROM changesets WHERE changesets.repository_id = #{id}")
+  end
 end
index 03d836e..9ea9fdd 100644 (file)
@@ -45,6 +45,16 @@ class RepositoryTest < Test::Unit::TestCase
     assert_equal repository, project.repository\r
   end
   
+  def test_destroy
+    changesets = Changeset.count(:all, :conditions => "repository_id = 10")
+    changes = Change.count(:all, :conditions => "repository_id = 10", :include => :changeset)
+    assert_difference 'Changeset.count', -changesets do
+      assert_difference 'Change.count', -changes do
+        Repository.find(10).destroy
+      end
+    end
+  end
+  
   def test_should_not_create_with_disabled_scm
     # disable Subversion
     Setting.enabled_scm = ['Darcs', 'Git']