From: keiju@... (=?ISO-2022-JP?B?GyRCQFBETTc9PHkbKEI=?= ) Date: 1997-12-10T20:37:04+09:00 Subject: [ruby-dev:1035] ObjectDBM [ Re: Object#bind ] けいじゅ@日本ラショナルソフトウェアです. In [ruby-dev :01009 ] the message: "[ruby-dev:1009] Re: Object#bind ", on Dec/10 11:38(JST) matz@netlab.co.jp (Yukihiro Matsumoto) writes: >まつもと ゆきひろです >|現在は別件を開発中でrubyタイムはすべてそちらに回されているのでした. > >なにをやっているんだろう? オブジェクト指向データベース風オブジェクトベースdbmです. 前に, 松本氏がMarshalベースで簡単なオブジェクト指向データベース(?)を作 成しましたが, あれを, dbmベースにしたものだと思って下さい. rootオブジェ クトから先をmarshalを使ってdbmにしまい込みます. あと, 特徴としては, キャッシングを行なっていることですね. read/write用 にキャッシュを持っています. 機能的には, 以下のようになっています: class ObjectDBM include Enumerable def [](key, mode = nil) def update(key, obj = nil) def []=(key, obj) def delete(key) def indexes(*keys) def roots alias keys roots def size def roots(mode = nil) alias values roots def has_root_name?(root_name) alias root_name? has_root_name? alias include? has_root_name? def has_root?(root) alias root? has_root? def each(mode = nil) alias each_pair each def each_root_name alias each_key each_root_name def each_root(mode = nil) alias each_value each_root def transaction(mode = READ_CACHING) class Transaction class StaticTransaction < Transaction class DynamicTransaction < Transaction end こんな感じで使います. odbm = ObjectDBM.new(db_name) odbm.transaction do odbm[key] = Foo.new end odbm.transaction do foo = odbm[key] foo.bar = Bar.new odbm.update(key) end odbm.transaction do |txn1| odbm[key1] = Bar.new odbm.transaction do |txn2| odbm[key2] = Bar.new txn1.abort end end 意外と使えるものになるのではないかなと思っています. 一度完成したのですが, 入れ子トランザクションを実装するために大幅に書換 え中でした. きれいな実装にするためにだいぶ悩みましたが, どうにか満足いくものになった ようです(^^;;; 1.abortしたときは, そのアボートしたトランザクションの子どものトランザ クションもabortする. 2.commitしたときは, そのアボートしたトランザクションの子どものトランザ クションもcommitする. 3.例外でtransactionブロックを抜けた時にはabortする. 4.例外以外(catch/returnなど)でtransactionブロックを抜けた時にはcommit する. って, 感じの実装だったのですが, 4.はensureで受けなくてはならないのです が, 1-3もensureを通ることになりますので, ちょっと工夫が必要になりまし た. __ ................................石塚 圭樹@日本ラショナルソフトェア... ----------------------------------->> e-mail: keiju@rational.com <<---