まつもと ゆきひろです
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