まつもと ゆきひろです

In message "[ruby-list:5098] Re: RubyでOODB"
    on 97/10/22, hisanori / sitc.toshiba.co.jp <hisanori / sitc.toshiba.co.jp> writes:

|松尾です。

|> あらら.「作りましょうか」というのは「*一緒に*作りましょうか?」
|> という意味です.^^;;;
|
|おお。まともなOODB(或いは既にあるOODBのruby binding)を自分で作るなんて
|想像もしなかったです。でも力不足だと分かっているのでごめんなさい。

ええと,松尾さんのニーズにもよるのですが「とりあえず永続化で
きれば良い」というレベルでしたら非常に簡単です.石塚さんは不
満かも知れませんが.プロトタイプ(70行弱)を添付します.

|OODBについてはObjectStoreのトランザクションに悩むただのユーザでしかな
|く、石塚さんの「オブジェクト指向データベース」の一読者なので、石塚さん
|がいらっしゃれば僕は応援するぐらいしか出来ないと思います。

書いた本人が出版後に「ObjectStoreと他のODBMSがこんなに違うと
は思わなかった」とのたもうた本ですね.^^;;;

私も今の職場に来るまではObjectStoreに悩まされました.凄いテ
クノロジーだとは思うんですけどねえ.

|# DBや言語そのものより、どちらかといえばユーザ向けのアプリケーションを
|# 作るのが好き。

それが普通でしょう.私や石塚さんはそういう意味では変人です.

|> |(HttpTunnelの)最新版とREADMEをputしておきました。

|# 直後にソケットのクローズ忘れとか見つかったのですが、他にも直す所があ
|# りそうなので、それも含めていずれまたputします(してもらうというか)。

待ってます.
                                まつもと ゆきひろ /:|)

おまけ:永続化ライブラリプロトタイプ

#!/usr/local/bin/ruby

require "marshal"

class PStore
  class Error<Exception
  end

  def initialize(file)
    @transaction = false
    @filename = file
    @abort = false
  end
  def in_transaction
    raise PStore::Error, "not in transaction" unless @transaction
  end
  def [](name)
    in_transaction
    value = @table[name]
    if value == nil
      raise PStore::Error, format("undefined root name %s", name)
    end
    value
  end
  def []=(name, value)
    @table[name] = value
  end
  def abort
    @abort = true
    throw :pstore_abort_transaction
  end
  def transaction
    raise PStore::Error, "nested transaction" if @transaction
    value = file = nil
    begin
      file = open(@filename, "r")
      @table = Marshal.load(file)
      file.close
    rescue Errno::ENOENT
      @table = {}
    end
    @transaction = true
    begin
      catch(:pstore_abort_transaction) do
	yield self
      end
    ensure
      unless @abort
	file = open(@filename, "w")
	Marshal.dump(@table, file)
	file.close
	@table = nil
      end
      @abort = @transaction = false
    end
  end
end

db = PStore.new("/tmp/foo")
db.transaction do
  ary = db["root"] = [1,2,3,4]
  ary[0] = [1,1.5]
end

db.transaction do
  p db["root"]
end