QDBM付属Ruby用API仕様書

Copyright (C) 2000-2003 Mikio Hirabayashi
Last Update: Sun, 04 May 2003 07:11:37 +0900
[API] [English] [Home]

目次

  1. 概要
  2. インストール
  3. サンプルコード
  4. バグ

概要

QDBMにはRuby言語用のAPIがある。QDBMの基本APIと拡張APIの関数群をRubyのクラス機構を用いてカプセル化したものである。また、Rubyのマルチスレッド機能においてスレッドセーフである。

クラス `Depot' または `Curia' のコンストラクタ `new' を呼び出してデータベースを開き、その戻り値のオブジェクトをハンドルにする。データベースを閉じるにはメソッド `close' を呼ぶ。ファイナライザは利用されないが、`new' のイテレータを用いることでデータベースの閉じ忘れを防ぐことができる。メソッド `put' はレコードを追加するために用いる。メソッド `out' はレコードを削除するために用いる。メソッド `get' はレコードを検索するために用いる。その他にも、C言語の基本APIおよび拡張APIとほぼ同じ操作を利用することができる。

データベースに格納するレコードのキーと値は文字列として扱われるが、バイナリデータをそのまま格納することも可能である。`Depot' はファイルを用いてデータベースを実現し、`Curia' はディレクトリと複数のファイルを用いてデータベースを実現する。前者の方が高速だが、後者の方がスケーラブルである。

`Depot' と `Curia' は `Enumerable' モジュールをMix-inしているので、`find' や `sort' といったメソッドが利用できる。また、`Hash' クラスに似せて '[]=' や '[]' 等のメソッドを定義しているので、普通のハッシュのように利用することができる。

APIの詳細に関しては、サブディレクトリ `rapidoc' の文書を参照すること。


インストール

Rubyの1.6.5以降のバージョンがインストールされ、QDBMが `/usr/local' 以下にインストールされていることが必要である。

インストール作業は、サブディレクトリ `ruby' をカレントディレクトリにして行う。

cd ruby

ビルド環境を設定する。

./configure

プログラムをビルドする。

make

プログラムの自己診断テストを行う。

make check

プログラムをインストールする。作業は `root' ユーザで行う。

make install

一連の作業が終ると、Rubyのインストールディレクトリに応じた適当な場所に `depot.rb'、`mod_depot.so' 、`curia.rb' 、`mod_curia.so' 等のライブラリがインストールされ、コマンド `rdptest' と `rcrtest' が `/usr/local/bin' にインストールされる。


サンプルコード

名前と対応させて電話番号を格納し、それを検索するアプリケーションのサンプルコードを以下に示す。

require 'depot'

NAME = "mikio"
NUMBER = "000-1234-5678"
DBNAME = "book"

def main
  depot = nil
  begin

    # データベースを開く
    depot = Depot::new(DBNAME, Depot::OWRITER | Depot::OCREAT)

    # レコードを格納する
    depot.put(NAME, NUMBER)

    # レコードを検索する
    printf("Name: %s\n", NAME)
    printf("Number: %s\n", depot.get(NAME))

  rescue
    printf("%s\n", $!)
    return 1
  ensure

    # データベースを閉じる
    if(depot)
      begin
        depot.close()
      rescue
        printf("%s\n", $!)
      end
    end

  end
  return 0
end

exit(main());

上記の例を `Hash' クラスに似せたインタフェースとイテレータを用いて書き直した例を以下に示す。

require 'depot'

NAME = "mikio"
NUMBER = "000-1234-5678"
DBNAME = "book"

def main
  begin

    # データベースを開いて自動的に閉じる
    Depot::new(DBNAME, Depot::OWRITER | Depot::OCREAT) do |depot|

      # レコードを格納する
      depot[NAME] = NUMBER

      # レコードを検索する
      printf("Name: %s\n", NAME)
      printf("Number: %s\n", depot[NAME])

    end

  rescue
    printf("%s\n", $!)
    return 1
  end
  return 0
end

exit(main());

バグ

標準添付ライブラリの `DBM' クラスのインタフェースと微妙に違うところがある。

もしもRubyハッカー達の手にかかれば、より効率的な実装がなされるだろう。

インタフェースを簡潔にするため、Ruby用のCuriaにはラージオブジェクトを扱う機能はない。