252 lines
10 KiB
Ruby
252 lines
10 KiB
Ruby
#!/usr/bin/env ruby
|
|
ENV['RAILS_ENV'] ||= 'production'
|
|
require File.dirname(__FILE__) + '/../config/environment'
|
|
|
|
def test_times(num, records=-1)
|
|
$end_at = Time.now
|
|
puts "#{num} Step finished. clear records: #{records.is_a?(Array) ? records.size : records} ( #{$end_at - $begin_at}s )"
|
|
$begin_at = Time.now
|
|
$stdout.flush
|
|
end
|
|
|
|
$begin_at = Time.now
|
|
|
|
# close expired problems
|
|
problems = Problem.expired.all
|
|
problems.each do |problem|
|
|
if solution = problem.solutions.all.sort_by{|x| x.vote_score}.last
|
|
if solution.vote_score >= 5
|
|
Solution.transaction do
|
|
solution.update_attribute(:accept, true)
|
|
problem.update_attributes!(:status => Problem::STATUS["系统满意"], :accept_at => Time.now)
|
|
UserAskPart.increment_counter(:accepted_count, solution.user_ask_part_id)
|
|
|
|
solution_user = solution.user
|
|
solution_user.medal_item = solution
|
|
|
|
if problem.reward?
|
|
solution_user.update_attribute(:ask_score, solution_user.ask_score + problem.score + Solution::SYSTEM_EXTRA_SCORE)
|
|
else
|
|
UserAskPart.increment_counter(:zero_accepted_count, solution.user_ask_part_id)
|
|
solution_user.update_attribute(:ask_score, solution_user.ask_score + problem.score)
|
|
end
|
|
solution.user_ask_part.trigger_medal_checker
|
|
end
|
|
else
|
|
problem.update_attribute(:status, Problem::STATUS["系统不满意"])
|
|
end
|
|
else
|
|
problem.update_attribute(:status, Problem::STATUS["系统不满意"])
|
|
end
|
|
end
|
|
test_times 1, problems
|
|
|
|
# update my group topics
|
|
Group.find_all_by_active(true, :conditions => ["id not in (?)", [Group::JAVAEYE_WATER, Group::JAVAEYE_ADMIN]]).each do |g|
|
|
updated_at = g.topics.first.last_post.created_at unless g.topics.blank?
|
|
if updated_at
|
|
g.users.find_all_by_my_group_updated(false).each do |u|
|
|
User.update_all("my_group_updated = true", "id = #{u.id}") and u.expire_cache if u.session_updated_or_last_visit_at < updated_at
|
|
end
|
|
else
|
|
g.users.find_all_by_my_group_updated_and_admin(false, true).each do |u|
|
|
User.update_all("my_group_updated = true", "id = #{u.id}") and u.expire_cache
|
|
end unless g.users.unapproved.blank?
|
|
end
|
|
end
|
|
test_times 2
|
|
|
|
# clean no group's group blogs
|
|
#blogs = Blog.find :all, :joins => 'left join groups on topics.group_id = groups.id', :conditions => 'topics.group_id is not null and groups.id is null'
|
|
#blogs.each {|b| t = Topic.find b.id; t.group_id = nil; t.save!}
|
|
|
|
# clean no news's comment
|
|
nc = NewsComment.all(:select => "nc.*", :joins => "nc left join news n on nc.news_id = n.id", :conditions => "nc.news_id is not null and n.id is null" )
|
|
nc.each &:delete
|
|
test_times 3, nc
|
|
|
|
# clean no group's pictures
|
|
pictures = Picture.find :all, :select => 'p.*', :joins => 'p LEFT JOIN groups g ON p.group_id = g.id', :conditions => 'p.group_id IS NOT NULL AND g.id IS NULL'
|
|
pictures.each {|p| p.destroy; p.expire_cache}
|
|
test_times 4, pictures
|
|
|
|
# clean no user's pictures
|
|
pictures = Picture.find :all, :select => 'p.*', :joins => 'p LEFT JOIN users u ON p.user_id = u.id', :conditions => 'p.user_id IS NOT NULL AND u.id IS NULL'
|
|
pictures.each {|p| p.destroy; p.expire_cache}
|
|
test_times 5, pictures
|
|
|
|
# clean on picture's comments
|
|
pc = PictureComment.find :all, :select => 'pc.*', :joins => 'pc left join pictures p on pc.picture_id = p.id', :conditions => 'pc.picture_id is not null and p.id is null'
|
|
PictureComment.delete pc.map(&:id)
|
|
test_times 6, pc
|
|
|
|
# clean no user's key
|
|
keys = ActiveKey.find :all, :select => 'a.*', :joins => 'a LEFT JOIN users u ON a.user_id = u.id', :conditions => 'a.user_id is not null and u.id is null'
|
|
keys.each {|key| key.destroy}
|
|
test_times 7, keys
|
|
|
|
# clean no user's pdf
|
|
pdfs = PdfJob.find :all, :select => "p.*", :joins => "p LEFT JOIN users u ON p.user_id = u.id", :conditions => "p.user_id IS NOT NULL AND u.id IS NULL"
|
|
pdfs.each {|pdf| `rm -rf #{pdf.folder}`; pdf.destroy}
|
|
test_times 8, pdfs
|
|
|
|
# clean no user's group
|
|
gs = Group.find :all, :select => 'g.*', :joins => 'g LEFT JOIN users u ON g.owner_id = u.id', :conditions => 'g.owner_id IS NOT NULL AND u.id IS NULL'
|
|
ActiveRecord::Base.transaction do
|
|
gs.each do |g|
|
|
GroupAnnouncement.delete_all ['group_id = ?', g.id]
|
|
# GroupBlogCategory.delete_all ['group_id = ?', g.id]
|
|
GroupLink.delete_all ['group_id = ?', g.id]
|
|
GroupUser.delete_all ['group_id = ?', g.id]
|
|
GroupTopicTag.delete_all ['group_id = ?', g.id]
|
|
gts = GroupTopic.find :all, :conditions => ['group_id = ?', g.id]
|
|
gts.each do |gt|
|
|
gt.posts.each {|p| p.destroy }
|
|
gt.destroy
|
|
end
|
|
g.destroy
|
|
end
|
|
end
|
|
test_times 9, gs
|
|
|
|
# clean no group's topic
|
|
gts = GroupTopic.find :all, :select => 'gt.*', :joins => 'gt LEFT JOIN groups g ON gt.group_id = g.id', :conditions => 'gt.group_id IS NOT NULL AND g.id IS NULL'
|
|
ActiveRecord::Base.transaction do
|
|
gts.each do |gt|
|
|
gt.posts.each {|p| p.destroy }
|
|
gt.destroy
|
|
end
|
|
end
|
|
test_times 10, gts
|
|
|
|
# clean no user's message
|
|
ms = Message.find :all, :select => 'm.*', :joins => 'm LEFT JOIN users u ON m.receiver_id = u.id', :conditions => 'm.receiver_id IS NOT NULL AND u.id IS NULL'
|
|
ms.each { |m| m.message_text.destroy unless m.system_notice; m.destroy }
|
|
ms = Message.find :all, :select => 'm.*', :joins => 'm LEFT JOIN users u ON m.sender_id = u.id', :conditions => 'm.sender_id IS NOT NULL AND u.id IS NULL'
|
|
ms.each { |m| m.message_text.destroy unless m.system_notice; m.destroy }
|
|
test_times 11, ms
|
|
|
|
# clean no user's topic
|
|
ts = Topic.find :all, :select => "t.*", :joins => "t LEFT JOIN users u on t.user_id = u.id", :conditions => "t.user_id IS NOT NULL AND u.id IS NULL"
|
|
ActiveRecord::Base.transaction { ts.each { |t| t.posts.each {|p| p.post_text.destroy; p.destroy }; t.destroy } }
|
|
test_times 12, ts
|
|
|
|
# clean no post's topic
|
|
ts = Topic.find :all, :select => "t.*", :joins => "t LEFT JOIN new_posts p on t.post_id = p.id", :conditions => "p.id IS NULL"
|
|
ActiveRecord::Base.transaction { ts.each { |t| t.posts.each {|p| p.post_text.destroy; p.destroy }; t.destroy } }
|
|
test_times 13, ts
|
|
|
|
# clean no topic's posts
|
|
ps = Post.find :all, :select => 'p.*', :joins => "p LEFT JOIN new_topics t ON p.topic_id = t.id", :conditions => "p.topic_id IS NOT NULL AND t.id IS NULL"
|
|
ActiveRecord::Base.transaction do
|
|
ps.each do |post|
|
|
post.post_text.destroy
|
|
post.destroy
|
|
end
|
|
end
|
|
test_times 14, ps
|
|
|
|
# clean no user's visit
|
|
uv = UserVisit.all :select => "v.*", :joins => "v LEFT JOIN users u on v.visit_id = u.id", :conditions => "v.visit_id IS NOT NULL AND u.id IS NULL"
|
|
ActiveRecord::Base.transaction { uv.each {|v| v.destroy} }
|
|
test_times 15, uv
|
|
|
|
# clean no user's guestbook
|
|
gb = GuestBook.all :select => "g.*", :joins => "g LEFT JOIN users u ON g.user_id = u.id", :conditions => "g.user_id IS NOT NULL and u.id is null"
|
|
gb.each &:destroy
|
|
test_times 16, gb
|
|
|
|
#clean no user's problem
|
|
problems = Problem.all :select => "p.*", :joins => "p LEFT JOIN users u on p.user_id = u.id", :conditions => "p.user_id is not null and u.id is null"
|
|
problems.each &:destroy
|
|
test_times 17, problems
|
|
|
|
solutions = Solution.all(:select => "s.*", :joins => "s left join users u on s.user_id = u.id",:conditions => "s.user_id is not null and u.id is null")
|
|
solutions.each &:destroy
|
|
test_times 18, solutions
|
|
|
|
# clean deleted topics
|
|
#ts = Topic.find :all, :select => 'topics.id', :conditions => ['status_flag = "delete" AND created_at > ?', 2.months.ago]
|
|
#ActiveRecord::Base.transaction { ts.each { |t| t.posts.each {|p| p.post_text.destroy; p.destroy }; t.destroy } }
|
|
|
|
# clean deleted posts
|
|
#ps = Post.find :all, :conditions => 'status_flag = "delete"'
|
|
#ActiveRecord::Base.transaction do
|
|
# ps.each {|p| p.expire_cache}
|
|
# PostText.delete(ps.map(&:post_text_id))
|
|
# Post.delete(ps.map(&:id))
|
|
#end
|
|
|
|
# clean no user subscriptions
|
|
sbs = Subscription.find :all, :select => "s.*", :joins => "s LEFT JOIN users u ON s.subscribed_user_id = u.id", :conditions => "s.subscribed_user_id is not null and u.id is null"
|
|
sbs.each {|s| s.destroy}
|
|
test_times 19, sbs
|
|
|
|
# fix last post id for topic
|
|
ts = Topic.find :all, :select => "t.*", :joins => "t LEFT JOIN new_posts p ON t.last_post_id = p.id", :conditions => "t.last_post_id IS NOT NULL AND p.id IS NULL"
|
|
Topic.transaction do
|
|
ts.each do |topic|
|
|
p = Post.find :first, :order => "id DESC", :conditions => ["status_flag<>'hidden' AND topic_id = ?", topic.id]
|
|
topic.last_post_id = p.id
|
|
topic.save!
|
|
end
|
|
end
|
|
test_times 20, ts
|
|
|
|
# fix forum stats
|
|
Forum.find(:all).each do |forum|
|
|
topics_count = Topic.count :conditions => ['forum_id = ? and status_flag <> "hidden" and status_flag <> "delete"', forum.id]
|
|
forum.topics_count = topics_count
|
|
forum.save!
|
|
Forum.expire_cache "urlname/#{forum.urlname.downcase}"
|
|
end
|
|
test_times 21
|
|
|
|
# clean no user's blog
|
|
blogs = Blog.all :select => "b.*", :joins => "b LEFT JOIN users u ON b.user_id = u.id", :conditions => "b.user_id IS NOT NULL AND u.id IS NULL"
|
|
Blog.transaction do
|
|
blogs.each do |blog|
|
|
blog.expire_cache
|
|
BlogCommentBody.delete(blog.comments.map(&:blog_comment_body_id))
|
|
BlogComment.delete(blog.comments.map(&:id))
|
|
end
|
|
BlogBody.delete(blogs.map(&:blog_body_id))
|
|
Blog.delete(blogs.map(&:id))
|
|
end
|
|
test_times 22, blogs
|
|
|
|
# clean no user's blog comment
|
|
blog_comments = BlogComment.all :select => "blog_comments.*", :joins => "LEFT JOIN users ON blog_comments.user_id = users.id", :conditions => "blog_comments.user_id IS NOT NULL AND users.id IS NULL"
|
|
BlogComment.transaction do
|
|
BlogCommentBody.delete(blog_comments.map(&:blog_comment_body_id))
|
|
BlogComment.delete(blog_comments.map(&:id))
|
|
end
|
|
test_times 23, blog_comments
|
|
|
|
# clean no user's blog categories
|
|
blog_categories = BlogCategory.all(:select => "b.*", :joins => "b left join users u on b.user_id = u.id", :conditions => "b.user_id is not null and u.id is null")
|
|
blog_categories.each &:destroy
|
|
test_times 24, blog_categories
|
|
|
|
# clean no blog's blog_wiki_records
|
|
blog_wiki_records = BlogWikiRecord.all(:select => "bwr.*", :joins => "bwr left join blogs b on bwr.blog_id = b.id", :conditions => ["bwr.blog_id is not null and (b.id is null or b.status NOT IN (?))", [Blog.status[:active], Blog.status[:locked]] ])
|
|
blog_wiki_records.each &:delete
|
|
test_times 25, blog_wiki_records
|
|
|
|
# clean no user's medal
|
|
medals = Medal.all(:select => "m.*", :joins => "m left join user_ask_parts u on m.user_ask_part_id = u.id", :conditions => "m.user_ask_part_id is not null and u.id is null")
|
|
medals.each &:destroy
|
|
test_times 26, medals
|
|
|
|
# clean notifications
|
|
res = Notification::Base.delete_all(["`read` = ? and updated_at < ?", true, 3.months.ago])
|
|
test_times 27, res
|
|
|
|
# fix whole tag weight count
|
|
Whole::Tag.caculate_weight!
|
|
test_times 28
|
|
Whole::Tag.refresh_forum_counter!
|
|
test_times 29
|
|
Whole::Tag.update_last_post!
|
|
test_times 30
|
|
|