2008年11月22日

GNU dbm(gdbm)のデータを変換する

Gaucheで書かれたWikiシステムのwilikiを活用してるのだが、x86アーキテクチャな旧マシンからx86-64アーキテクチャな新マシンへデータを移行しようとして、バックエンドデータベースのGNU dbmのデータがアーキテクチャ依存のために動かなくなってしまった。

ということで、RubyのPStoreを中間データにするようなダンプ/リストアツールを作成。rubyパッケージとlibgdbm-rubyパッケージを入れるだけで動くはず。gdbm_dump.rbは

#!/usr/bin/ruby
#  Copyright 2008 Kenshi Muto <kmuto@debian.org>
require 'pstore'
require 'gdbm'

if ARGV.size != 2 || !File.exists?(ARGV[0]) || File.exists?(ARGV[1])
  STDERR.puts "gdbm_dump.rb {GDBM file} {DUMP file}"
  exit(1)
end

db = PStore.new(ARGV[1])
gdbm = GDBM.new(ARGV[0])

db.transaction do
  gdbm.each_pair do |key, value|
    db[key] = value
  end
  gdbm.close
end

gdbm_restore.rbは

#!/usr/bin/ruby
#  Copyright 2008 Kenshi Muto <kmuto@debian.org>
require 'pstore'
require 'gdbm'

if ARGV.size != 2 || !File.exists?(ARGV[1]) || File.exists?(ARGV[0])
  STDERR.puts "gdbm_restore.rb {GDBM file} {DUMP file}"
  exit(1)
end

db = PStore.new(ARGV[1])
gdbm = GDBM.new(ARGV[0])

db.transaction do
  db.roots.each do |key|
    gdbm[key] = db[key]
  end
  gdbm.close
end

ダンプしたいアーキテクチャのほうで「gdbm_dump.rb GDBMファイル名 PStoreファイル名」を実行。PStoreファイルを新アーキテクチャのほうにコピーし、新アーキテクチャで「gdbm_restore.rb GDBMファイル名 PStoreファイル名」を実行してGDBMファイルを生成する。