Madeleineは、オブジェクト永続化機構です。
オブジェクトのスナップショットをとることができます。
gem をダウンロードしたとき(RubyGemsが必要です)
# gem install madeleine-0.7.1.gem
tar.gz をダウンロードしたとき
$ ruby install.rb config
$ ruby install.rb setup
# ruby install.rb install
require 'madeleine'
SnapshotMadeleine.new()で、インスタンスを生成します。
最初の引数は、オブジェクトを保存するディレクトリ名です。ディレクトリがなければ作成されます。
2番目の引数は、マーシャルに使用するクラスです。指定しない場合は Marshal になります。
ブロックは、オブジェクトを作成する処理です。永続化するオブジェクトを作成します。
madeleine = SnapshotMadeleine.new("data_dir") do
Array.new
end
ブロックの処理でオブジェクトを作成した後、ディレクトリにあるコマンドログを順次実行していき、オブジェクトの状態を復元します。
オブジェクトには、コマンドオブジェクトを通してアクセスします。 コマンドオブジェクトは execute(system) メソッドを実装したオブジェクトです。
require 'madeleine'
# データを追加するコマンド
class PushCommand
def initialize(data)
@data = data
end
def execute(system)
system.push(@data)
end
end
# 値を取得するコマンド
class QueryCommand
def initialize(data)
@data = data
end
def execute(system)
system[@data]
end
end
madeleine = SnapshotMadeleine.new("data_dir") do
Array.new
end
madeleine.execute_command(PushCommand.new('hoge'))
puts madeleine.execute_command(QueryCommand.new(0))
コマンドオブジェクトには、Madeleine::Automatic::Command という汎用的なクラスが用意されています。(使える?)
オブジェクトを保存するディレクトリには、コマンドを実行するとコマンドログのファイルが作成されます。
$ ls
000000000000000000001.command_log
000000000000000000002.command_log
000000000000000000003.command_log
このログファイルの内容は、コマンドオブジェクトをマーシャルしたデータです。
コンストラクタでは、このマーシャルしたコマンドオブジェクトを復元し、実行することで、オブジェクトの状態を復元します。