# PStore

Rubyのオブジェクトを外部ファイルに格納するためのクラス。 内部でMarshalを使っている。

## 使い方

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

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

データベースにアクセスするためには、transactionのブロック内である必要がある。 インターフェースはHashライクである。

## クラスメソッド

`PStore.new(file)`

  ファイル名fileでデータベースを読み書きする。 fileのあるディレクトリは書き込み可能である必要がある。 なぜなら、データベースを更新するときにバックアップファイルが作成されるからだ。 バックアップファイル名はファイル名の後に`~`がつく。

## メソッド

`transaction {|pstore| ... }`
`transaction(read_only=false) {|pstore| ... } ((<ruby 1.7 feature>))`

  トランザクションに入る。 このブロックの中でしかデータベースの読み書きはできない。

  ruby 1.7 feature: 1.7では読み込み専用のトランザクションが使用可能。

`[name]`

  ルートnameに対応する値を得る。 `Hash#[]`に相当。

`[name] = value`

  ルートnameに対応する値valueをセットする。 `Hash#[]=`に相当。

`fetch(name[, default]) ((<ruby 1.8 feature>))`

  ルートnameに対応する値を得る。 該当するルートが登録されていない時には、 引数 default が与えられていればその値を返し、 与えられていなければ例外 PStore::Error が発生します。 `Hash#fetch`に相当。

`delete(name)`

  ルートnameに対応する値を削除する。 `Hash#delete`に相当。

`roots`

  ルートの集合を配列で返す。 `Hash#keys`に相当。

`root?(name)`

  nameがルートであるかどうか。 `Hash#key?`に相当。

`path`

  データベースのファイル名を得る。

`commit`

  データベースの読み書きを終了する。 すなわち、transactionブロックから抜ける。 データベースの変更が反映される。

`abort`

  データベースの読み書きを終了する。 transactionブロックから抜けるが、データベースの変更は反映されない。

## プライベートメソッド

`in_transaction`

  トランザクションの中でなければ例外を発生させる。

links: [Marshal] [PStore::Error] [ruby 1.7 feature]
reverse links: [CGI] [PStore::Error] [YAML::Store] [添付ライブラリ]