#! %RUBY% # Copyright (C) 2005 Network Applied Communication Laboratory Co., Ltd. require "fileutils" require "bdb" OLD_METADATA_VERSION = 1 NEW_METADATA_VERSION = 3 BYTE_ORDER_TO_PACK_STR = { 0 => "V", 1 => "N", 2 => "I", } def get_metadata_version(db_name) metadata_filename = File.join(db_name, "METADATA") File.open(metadata_filename, "r") do |file| byte_order_flag = file.getc pack_str = BYTE_ORDER_TO_PACK_STR[byte_order_flag] return file.read.unpack(pack_str).first end end def lock_database(db_name) lock_filename = File.join(db_name, "lock") File.open(lock_filename, "w") do |file| file.flock(File::LOCK_EX) begin yield ensure file.flock(File::LOCK_UN) end end end def convert_text_db(db_name) text_db_filename = File.join(db_name, "text.db") text_dirname = File.join(db_name, "text") return if !File.exist?(text_dirname) BDB::Recno.open(text_db_filename, nil, BDB::CREATE) do |db| doc_id = 1 loop do p1, p2 = [doc_id].pack("v").unpack("H2H2") path = File.join(text_dirname, p1.upcase, p2.upcase, doc_id) if !File.exist?(path) break end db[doc_id] = File.read(path) doc_id += 1 end end File.rename(text_dirname, File.join(db_name, "OLD-text")) end def convert_metadata(db_name) metadata_filename = File.join(db_name, "METADATA") FileUtils.cp(metadata_filename, File.join(db_name, "OLD-METADATA"), {:preserve => true}) File.open(metadata_filename, "r+") do |file| byte_order_flag = file.getc pack_str = BYTE_ORDER_TO_PACK_STR[byte_order_flag] version_str = [NEW_METADATA_VERSION].pack(pack_str) file.write(version_str) end end if $0 == __FILE__ ARGV.each do |db_name| if get_metadata_version(db_name) > OLD_METADATA_VERSION puts("#{db_name} is newer database. Nothing to do.") next end lock_database(db_name) do convert_text_db(db_name) convert_metadata(db_name) end old_filenames = File.join(db_name, "OLD-*") puts("#{db_name} is converted.") puts("please run: rm -rf #{old_filenames}") end end