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にはラージオブジェクトを扱う機能はない。