トップ «前の日記(2023-12-03 (Sun)) 最新 編集   RSS 1.0 FEED  

Journal InTime


2023-12-20 (Wed) [長年日記]

_ MatzにっきでMongoDBを使うのをやめた

MatzにっきをHeroku化した際にMongoDBを使うようにしていたが、MongoDBが不自由なライセンスになってしまったのでDefaultIO(ファイル)に戻した。

移行用のスクリプトはなさそうだったのでtdiary-io-mongodbに同梱されているtdiary-mongodb-convertを以下のように書き換えて使用した。

#!/usr/bin/env ruby

require 'optparse'
require 'erb'
require 'tdiary/view_helper'
require 'tdiary/base'
require 'tdiary/comment'
require 'tdiary/comment_manager'
require 'tdiary/referer_manager'
require 'tdiary/style'
require 'tdiary/cache/file'
require 'ostruct'
require 'tdiary/core_ext'
require 'tdiary/io/default'
require 'tdiary/io/mongodb'
require 'tdiary/application'

def load_diaries(mongo_url, style_path)
  options = {
    'style.path' => style_path
  }
  conf = OpenStruct.new({
    database_url: mongo_url,
    options: options
  })
  tdiary = OpenStruct.new({conf: conf})
  TDiary::IO::MongoDB.load_cgi_conf(conf)
  mongo_io = TDiary::IO::MongoDB.new(tdiary)

  mongo_io.calendar.each do |y, ms|
    ms.each do |m|
      puts "loading #{y}-#{m}"
      month = Time.local(y.to_i, m.to_i)
      mongo_io.transaction(month) do |diaries|
        yield month, diaries
        TDiary::TDiaryBase::DIRTY_NONE
      end
    end
  end
end

def update_diaries(default_io, month, new_diaries)
  default_io.transaction(month) do |diaries|
    diaries.update(new_diaries)
    TDiary::TDiaryBase::DIRTY_DIARY | TDiary::TDiaryBase::DIRTY_COMMENT
  end
end

def store_diaries(data_path, style_path, mongo_url = nil)
  options = {'style.path' => [style_path]}
  conf = OpenStruct.new({options: options, data_path: "#{data_path}/"})
  tdiary = OpenStruct.new({conf: conf})
  TDiary::IO::Default.load_cgi_conf(conf)
  default_io = TDiary::IO::Default.new(tdiary)

  load_diaries(mongo_url, style_path) do |month, diaries|
    p month
    update_diaries(default_io, month, diaries)
  end
end

def store_conf(conf_path, mongo_url = nil)
  conf = OpenStruct.new({options: {}, database_url: mongo_url})
  tdiary = OpenStruct.new({conf: conf})
  s = TDiary::IO::MongoDB.load_cgi_conf(conf)
  File.write(conf_path, s)
end

args = {}
OptionParser.new do |opts|
  opts.banner = 'Usage: tdiary-mongodb-convert [options] <data_path>'
  opts.on('-c CONF', '--conf=CONF', 'store only tdiary.conf'){|v| args[:conf] = v}
  opts.on('-s PATH', '--style=STYLE', 'style path'){|v| args[:style] = v}
  opts.on('-m URL',  '--mongo=URL', 'URL of mongoDB'){|v| args[:mongo] = v}
  opts.parse!(ARGV)

  args[:data] = ARGV.shift
  unless args[:data] || args[:conf]
    $stderr.print opts.help
    exit 1
  end
end

if args[:conf]
  store_conf(args[:conf], args[:mongo])
else
  store_diaries(args[:data], args[:style], args[:mongo])
end

実行手順は以下のとおり(~/diary下のファイルが上書きされてしまうので注意)。

$ bundle exec tdiary_mongodb2default -s lib/tdiary/style -m <MongoDBのURL> ~/diary
$ bundle exec tdiary_mongodb2default -c ~/diary/tdiary.conf -m <MongoDBのURL>
Tags: Ruby tDiary

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy