textpattern.rb
上传用户:netsea168
上传日期:2022-07-22
资源大小:4652k
文件大小:4k
源码类别:

Ajax

开发平台:

Others

  1. #!/usr/bin/env ruby
  2. # TextPattern 1.x converter for typo by Patrick Lenz <patrick@lenz.sh>
  3. #
  4. # MAKE BACKUPS OF EVERYTHING BEFORE RUNNING THIS SCRIPT!
  5. # THIS SCRIPT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND
  6. require File.dirname(__FILE__) + '/../../config/environment'
  7. require 'optparse'
  8. class TXPMigrate
  9.   attr_accessor :options
  10.   def initialize
  11.     self.options = {}
  12.     self.parse_options
  13.     self.convert_categories
  14.     self.convert_entries
  15.     self.convert_prefs
  16.   end
  17.   def convert_categories
  18.     txp_categories = ActiveRecord::Base.connection.select_all(%{
  19.       SELECT name
  20.       FROM `#{self.options[:txp_db]}`.`#{self.options[:txp_pfx]}`txp_category
  21.       WHERE parent = 'root'
  22.       AND type = 'article'
  23.     })
  24.     puts "Converting #{txp_categories.size} categories.."
  25.     txp_categories.each do |cat|
  26.       Category.create(cat) unless Category.find_by_name(cat['name'])
  27.     end
  28.   end
  29.   def convert_entries
  30.     txp_entries = ActiveRecord::Base.connection.select_all(%{
  31.       SELECT
  32.         ID,
  33.         Annotate AS allow_comments,
  34.         1 AS allow_pings,
  35.         Title AS title,
  36.         (CASE LENGTH(Body) WHEN 0 THEN Excerpt ELSE Body END) AS body,
  37.         Body_html AS body_html,
  38.         Excerpt AS excerpt,
  39.         Keywords AS keywords,
  40.         Posted AS created_at,
  41.         LastMod AS updated_at,
  42.         AuthorID AS author,
  43.         (CASE textile_body WHEN '1' THEN 'textile' ELSE 'none' END) AS text_filter,
  44.         (CASE Status WHEN '1' THEN '0' ELSE '1' END) AS published,
  45.         Category1, Category2
  46.       FROM `#{self.options[:txp_db]}`..`#{self.options[:txp_pfx]}`textpattern
  47.     })
  48.     puts "Converting #{txp_entries.size} entries.."
  49.     txp_entries.each do |entry|
  50.       a = Article.new
  51.       a.attributes = entry.reject { |k,v| k =~ /^(Category|ID)/ }
  52.       a.save
  53.       # Assign categories
  54.       puts "Assign primary category for entry #{entry['ID']}"
  55.       a.categories.push_with_attributes(Category.find_by_name(entry['Category1']), :is_primary => 1) rescue nil
  56.       puts "Assign secondary category for entry #{entry['ID']}"
  57.       a.categories.push_with_attributes(Category.find_by_name(entry['Category2']), :is_primary => 0) rescue nil
  58.       # Fetch comments
  59.       ActiveRecord::Base.connection.select_all(%{
  60.         SELECT
  61.           name AS author,
  62.           email AS email,
  63.           web AS url,
  64.           message AS body,
  65.           message as body_html,
  66.           posted AS created_at,
  67.           ip AS ip
  68.         FROM `#{self.options[:txp_db]}`..`#{self.options[:txp_pfx]}`txp_discuss
  69.         WHERE parentid = #{entry['ID']}
  70.       }).each do |c|
  71.         a.comments.create(c)
  72.       end
  73.     end
  74.   end
  75.   def convert_prefs
  76.     puts "Converting prefs"
  77.     ActiveRecord::Base.connection.select_all(%{
  78.       SELECT
  79.         (CASE name
  80.           WHEN 'sitename' THEN 'blog_name'
  81.           WHEN 'comments_on_default' THEN 'default_allow_comments'
  82.           WHEN 'use_textile' THEN 'text_filter'
  83.          END) AS name,
  84.         val AS value
  85.       FROM `#{self.options[:txp_db]}`..`#{self.options[:txp_pfx]}`txp_prefs
  86.       WHERE name IN ('sitename', 'comments_on_default', 'use_textile')
  87.     }).each do |pref|
  88.       if pref['name'] == "text_filter" and pref['value'].to_i > 0
  89.         pref['value'] = 'textile'
  90.       end
  91.       begin
  92.         Setting.find_by_name(pref['name']).update_attribute("value", pref['value'])
  93.       rescue
  94.         Setting.create(pref)
  95.       end
  96.     end
  97.   end
  98.   def parse_options
  99.     OptionParser.new do |opt|
  100.       opt.banner = "Usage: textpattern.rb [options]"
  101.       opt.on('--db DBNAME', String, 'Text Pattern database name.') { |d| self.options[:txp_db] = d }
  102.       opt.on('--pf PREFIX', String, 'Textpattern table prefix.') { |p| self.options[:txp_pfx] = p }
  103.       opt.on_tail('-h', '--help', 'Show this message.') do
  104.         puts opt
  105.         exit
  106.       end
  107.       opt.parse!(ARGV)
  108.     end
  109.     unless self.options.include?(:txp_db)
  110.       puts "See textpattern.rb --help for help."
  111.       exit
  112.     end
  113.   end
  114. end
  115. TXPMigrate.new