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

Ajax

开发平台:

Others

  1. #!/usr/bin/env ruby
  2. # Serendipity (S9Y) 0.8.x converter for typo by Jochen Schalanda <jochen@schalanda.de>
  3. # heavily based on the Wordpress 1.5x converter by Patrick Lenz <patrick@lenz.sh>
  4. #
  5. # MAKE BACKUPS OF EVERYTHING BEFORE RUNNING THIS SCRIPT!
  6. # THIS SCRIPT IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND
  7. #
  8. #
  9. # SECURITY NOTICE:
  10. #
  11. # Migrated users will have the default password "password", since the
  12. # MD5 hashes of S9Y cannot be converted to salted SHA1 hashes which are
  13. # used by Typo.
  14. #
  15. require File.dirname(__FILE__) + '/../../config/environment'
  16. require 'optparse'
  17. class S9YMigrate
  18.   attr_accessor :options
  19.   def initialize
  20.     self.options = {}
  21.     self.parse_options
  22.     self.convert_users
  23.     self.convert_categories
  24.     self.convert_entries
  25.     self.convert_prefs
  26.   end
  27.   def convert_categories
  28.     s9y_categories = ActiveRecord::Base.connection.select_all(%{
  29.       SELECT category_name AS name
  30.       FROM `#{self.options[:s9y_db]}`.`#{self.options[:s9y_prefix]}category`
  31.     })
  32.     puts "Converting #{s9y_categories.size} categories.."
  33.     s9y_categories.each do |cat|
  34.       Category.create(cat) unless Category.find_by_name(cat['name'])
  35.     end
  36.   end
  37.   def convert_entries
  38.     s9y_entries = ActiveRecord::Base.connection.select_all(%{
  39.       SELECT
  40.        id,
  41.         (CASE allow_comments WHEN 'true' THEN '1' ELSE '0' END) AS allow_comments,
  42.         title,
  43.         body,
  44.         extended,
  45.         FROM_UNIXTIME(timestamp) AS created_at,
  46.         FROM_UNIXTIME(last_modified) AS updated_at,
  47.         author,
  48.         authorid AS user_id,
  49.         (CASE isdraft WHEN 'true' THEN '0' ELSE '1' END) AS published
  50.       FROM `#{self.options[:s9y_db]}`.`#{self.options[:s9y_prefix]}entries`
  51.     })
  52.     puts "Converting #{s9y_entries.size} entries.."
  53.     s9y_entries.each do |entry|
  54.       a = Article.new
  55.       a.attributes = entry.reject { |k,v| k =~ /^(id)/ }
  56.       a.save
  57.       # Fetch category assignments
  58.       ActiveRecord::Base.connection.select_all(%{
  59.         SELECT category_name
  60.         FROM `#{self.options[:s9y_db]}`.`#{self.options[:s9y_prefix]}category`, `#{self.options[:s9y_db]}`.`#{self.options[:s9y_prefix]}entrycat`
  61.         WHERE entryid = #{entry['id']}
  62.         AND `#{self.options[:s9y_prefix]}entrycat`.categoryid = `#{self.options[:s9y_prefix]}category`.categoryid
  63.       }).each do |c|
  64.         a.categories.push_with_attributes(Category.find_by_name(c['category_name']), :is_primary => 0)
  65.       end
  66.       # Fetch comments
  67.       ActiveRecord::Base.connection.select_all(%{
  68.         SELECT
  69.           author,
  70.           email,
  71.           url,
  72.           body,
  73.           FROM_UNIXTIME(timestamp) AS created_at,
  74.           ip
  75.         FROM `#{self.options[:s9y_db]}`.`#{self.options[:s9y_prefix]}comments`
  76.         WHERE id = #{entry['id']}
  77.         AND type != 'TRACKBACK'
  78.         AND status = 'approved'
  79.       }).each do |c|
  80.         a.comments.create(c)
  81.       end
  82.       # Fetch trackbacks
  83.       ActiveRecord::Base.connection.select_all(%{
  84.         SELECT
  85.           author AS blog_name,
  86.           url,
  87.           title,
  88.           body AS excerpt,
  89.           FROM_UNIXTIME(timestamp) AS created_at,
  90.           ip
  91.         FROM `#{self.options[:s9y_db]}`.`#{self.options[:s9y_prefix]}comments`
  92.         WHERE entry_id = #{entry['id']}
  93.         AND type = 'TRACKBACK'
  94.         AND status = 'approved'
  95.       }).each do |c|
  96.         a.trackbacks.create(c)
  97.       end
  98.     end
  99.   end
  100.   def convert_prefs
  101.     puts "Converting prefs"
  102.     ActiveRecord::Base.connection.select_all(%{
  103.       SELECT
  104.         (CASE name
  105.           WHEN 'blogTitle' THEN 'blog_name'
  106.           WHEN 'blogDescription' THEN 'blog_subtitle'
  107.          END) AS name,
  108.         value
  109.       FROM `#{self.options[:s9y_db]}`.`#{self.options[:s9y_prefix]}config`
  110.       WHERE name IN ('blogTitle', 'blogDescription')
  111.     }).each do |pref|
  112.       begin
  113.         Setting.find_by_name(pref['name']).update_attribute("value", pref['value'])
  114.       rescue
  115.         Setting.create(pref)
  116.       end
  117.     end
  118.   end
  119. def convert_users
  120.     puts "Converting users"
  121. puts "** all users will have the default password "password" **"
  122. puts "** you should change it as soon as possible!           **"
  123.     ActiveRecord::Base.connection.select_all(%{
  124.       SELECT
  125.         realname AS name,
  126.         username AS login,
  127.         email
  128.       FROM `#{self.options[:s9y_db]}`.`#{self.options[:s9y_prefix]}authors`
  129.     }).each do |user|
  130.       u = User.new
  131.       u.attributes = user
  132.   u.password = "password"
  133.       u.save
  134.     end
  135.   end
  136.   def parse_options
  137.     OptionParser.new do |opt|
  138.       opt.banner = "Usage: s9y.rb [options]"
  139.       opt.on('--db DBNAME', String, 'S9Y database name.') { |d| self.options[:s9y_db] = d }
  140.       opt.on('--prefix PREFIX', String, 'S9Y table prefix (defaults to empty string).') { |d| self.options[:s9y_prefix] = d }
  141.       opt.on_tail('-h', '--help', 'Show this message.') do
  142.         puts opt
  143.         exit
  144.       end
  145.       opt.parse!(ARGV)
  146.     end
  147.     unless self.options.include?(:s9y_db)
  148.       puts "See s9y.rb --help for help."
  149.       exit
  150.     end
  151. unless self.options.include?(:s9y_prefix)
  152.       self.options[:s9y_prefix] = ""
  153.     end
  154.   end
  155. end
  156. S9YMigrate.new