From 0943b7e510ad5f69d66c57b754b78f53fb169cd1 Mon Sep 17 00:00:00 2001 From: Jacques Distler Date: Fri, 5 Jun 2009 00:39:12 -0500 Subject: [PATCH] Expire Caches for Redirected Links [[!redirect foo]] should expire all pages which reference "foo". Sounds simple, but this was a really gnarly bug to fix. --- app/models/page.rb | 4 ---- app/models/wiki_reference.rb | 15 +++++---------- app/views/wiki/edit.rhtml | 6 +++--- lib/page_renderer.rb | 7 ++++++- test/unit/page_renderer_test.rb | 1 + 5 files changed, 15 insertions(+), 18 deletions(-) diff --git a/app/models/page.rb b/app/models/page.rb index 7f8946dd..370a2ca7 100644 --- a/app/models/page.rb +++ b/app/models/page.rb @@ -71,10 +71,6 @@ class Page < ActiveRecord::Base def linked_from web.select.pages_that_link_to(name) end - - def redirects_for - wiki_references.select { |ref| ref.redirected_page?}.map { |ref| ref.referenced_name } - end def included_from web.select.pages_that_include(name) diff --git a/app/models/wiki_reference.rb b/app/models/wiki_reference.rb index a4b79c41..4c2d027f 100644 --- a/app/models/wiki_reference.rb +++ b/app/models/wiki_reference.rb @@ -54,14 +54,9 @@ class WikiReference < ActiveRecord::Base def self.pages_redirected_to(web, page_name) names = [] - if web.has_page?(page_name) - page = web.page(page_name) - redirected_names = page.redirects_for - redirected_names.each do |name| - names = names | self.pages_that_reference(web, name) - end - end - names + page = web.page(page_name) + Thread.current[:page_redirects][page.name].each { |name| names = names + self.pages_that_reference(web, name) } + names.uniq end def self.page_that_redirects_for(web, page_name) @@ -70,8 +65,8 @@ class WikiReference < ActiveRecord::Base 'WHERE wiki_references.referenced_name = ? ' + "AND wiki_references.link_type = '#{REDIRECTED_PAGE}' " + "AND pages.web_id = '#{web.id}'" - names = connection.select_all(sanitize_sql([query, page_name])).map { |row| row['name'] } - names[0] + row = connection.select_one(sanitize_sql([query, page_name])) + row['name'] if row end def self.pages_in_category(web, category) diff --git a/app/views/wiki/edit.rhtml b/app/views/wiki/edit.rhtml index ee5725a1..a5498ae7 100644 --- a/app/views/wiki/edit.rhtml +++ b/app/views/wiki/edit.rhtml @@ -12,6 +12,9 @@ <% form_tag({ :action => 'save', :web => @web.address, :id => @page.name }, { 'id' => 'editForm', 'method' => 'post', 'onsubmit' => 'cleanAuthorName()', 'accept-charset' => 'utf-8' }) do %> +
+ <% if @page_name != 'HomePage' -%>

<%= check_box_tag :alter_title, value = "1", checked=false, @@ -22,9 +25,6 @@ <% else -%> <%= hidden_field_tag 'new_name', @page_name %> <% end%> -

-
as <%= text_field_tag :author, h(@author.purify), diff --git a/lib/page_renderer.rb b/lib/page_renderer.rb index 222762a9..61fb59c6 100644 --- a/lib/page_renderer.rb +++ b/lib/page_renderer.rb @@ -179,7 +179,12 @@ class PageRenderer references.build :referenced_name => redirected_page_name, :link_type => WikiReference::REDIRECTED_PAGE end - + + # ugly hack: store these in a thread-local variable, so that the cache-sweeper has access to it. + Thread.current[:page_redirects] ? + Thread.current[:page_redirects].update({ @revision.page.name => redirects}) : + Thread.current[:page_redirects] = { @revision.page.name => redirects} + categories = rendering_result.find_chunks(Category).map { |cat| cat.list }.flatten categories.each do |category| references.build :referenced_name => category, :link_type => WikiReference::CATEGORY diff --git a/test/unit/page_renderer_test.rb b/test/unit/page_renderer_test.rb index 8479bfe7..bb9e7af4 100644 --- a/test/unit/page_renderer_test.rb +++ b/test/unit/page_renderer_test.rb @@ -524,6 +524,7 @@ END_THM end def test_revisions_diff + Thread.current[:page_redirects] = { @page.name => []} Revision.create(:page => @page, :content => 'What a blue and lovely morning', :author => Author.new('DavidHeinemeierHansson'), :revised_at => Time.now) Revision.create(:page => @page, :content => 'What a red and lovely morning today',