けいじゅ@日本ラショナルソフトウェアです.

In [ruby-dev :01035 ] the message: "[ruby-dev:1035] ObjectDBM [ Re:
Object#bind ] ", on Dec/10 20:37(JST) keiju / Rational.Com (石塚圭樹)
writes:

>オブジェクト指向データベース風オブジェクトベースdbmです.

ほとんど完成したみたいなのでリリースします.

  o_dbm-0.1.rb.tgz
  + o_dbm.rb
  + test-o_dbm.rb

test-o_dbm.rbはテストプログラムですがサンプルにもなるかなと...

ObjectDBMとは:

1. DBMでは, 文字列しかstoreできませんでしたが, ほとんど任意(marshal可
   能な)のオブジェクトをstoreできる様にしました. 
2. transactionを採り入れています. commitして始めてデータベースに書き込
   まれます.
3. 入れこのtransactionをサポートしています.
4. transactionとしては, 静的トランザクションと動的トランザクションをサ
   ポートしています.
5. 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

こんな感じです. DBMが持つ機能+transaction機能って感じです.

使い方:

# データベースを開く
>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
     # txn2のアボート
>    txn2.abort
>  end
>end

静的トランザクションをアボートするとそのブロックから抜け出します.

PS.
[ruby-list:5632]の回答もよろしく. 今のままではエラーチェックに抜けが
(;_;

__
................................石塚 圭樹@日本ラショナルソフトェア...
----------------------------------->> e-mail: keiju / rational.com <<---