QDBMにはPerl言語用のAPIがある。QDBMの基本APIと拡張APIの関数群をPerlのクラス機構を用いてカプセル化したものである。C言語のAPIをXS言語を介して呼び出すように実装されている。データベースを扱うには、メソッドを明示的に呼び出す方法と、ハッシュにタイする方法がある。
メソッドを明示的に利用する場合、クラス `Depot' または `Curia' のコンストラクタ `new' を呼び出してデータベースを開き、その戻り値のオブジェクトをハンドルにする。データベースを閉じるにはメソッド `close' を呼ぶ。明示的にデータベースを閉じないでインスタンスが破棄される場合は、デストラクタによってデータベースが閉じられる。メソッド `put' はレコードを追加するために用いる。メソッド `out' はレコードを削除するために用いる。メソッド `get' はレコードを検索するために用いる。その他にも、C言語の基本APIおよび拡張APIとほぼ同じ操作を利用することができる。
ハッシュにタイする場合、`tie' 関数の第三引数以降にコンストラクタと同様の引数を与える。タイした以後はそのハッシュに対する操作はデータベースへの操作とみなされる。データベースを閉じるには `untie' 関数を用いる。
データベースに格納するレコードのキーと値は文字列として扱われるが、バイナリデータをそのまま格納することも可能である。`Depot' はファイルを用いてデータベースを実現し、`Curia' はディレクトリと複数のファイルを用いてデータベースを実現する。前者の方が高速だが、後者の方がスケーラブルである。
APIの詳細に関しては、サブディレクトリ `papidoc' の文書を参照すること。
Perlの5.6.0以降のバージョンがインストールされ、QDBMが `/usr/local' 以下にインストールされていることが必要である。
インストール作業は、サブディレクトリ `perl' をカレントディレクトリにして行う。
cd perl
ビルド環境を設定する。
./configure
プログラムをビルドする。
make
プログラムの自己診断テストを行う。
make check
プログラムをインストールする。作業は `root' ユーザで行う。
make install
一連の作業が終ると、Perlのインストールディレクトリに応じた適当な場所に `Depot.so'、`Depot.pm' 、`Curia.so' 、`Curia.pm' 等のライブラリがインストールされ、コマンド `pdptest' と `pcrtest' が `/usr/local/bin' にインストールされる。
名前と対応させて電話番号を格納し、それを検索するアプリケーションのサンプルコードを以下に示す。
use Depot; use constant NAME => "mikio"; use constant NUMBER => "000-1234-5678"; use constant DBNAME => "book"; sub main { my($depot, $val); # データベースを開く if(!($depot = new Depot(&DBNAME, Depot::OWRITER | Depot::OCREAT))){ printf(STDERR "new failed: %s\n", $Depot::errmsg); return 1; } # レコードを格納する if(!$depot->put(&NAME, &NUMBER)){ printf(STDERR "put failed: %s\n", $Depot::errmsg); } # レコードを検索する if(!($val = $depot->get(&NAME))){ printf(STDERR "get failed: %s\n", $Depot::errmsg); } else { printf("Name: %s\n", &NAME); printf("Number: %s\n", $val); } # データベースを閉じる if(!$depot->close()){ printf(STDERR "close failed: %s\n", $Depot::errmsg); return 1; } return 0; } exit(main());
上記の例をタイ関数を用いて書き直した例を以下に示す。
use Depot; use constant NAME => "mikio"; use constant NUMBER => "000-1234-5678"; use constant DBNAME => "book"; sub main { my(%hash, $val); # データベースを開く if(!tie(%hash, "Depot", &DBNAME, Depot::OWRITER | Depot::OCREAT)){ printf(STDERR "tie failed: %s\n", $Depot::errmsg); return 1; } # レコードを格納する if(!($hash{&NAME} = &NUMBER)){ printf(STDERR "store failed: %s\n", $Depot::errmsg); } # レコードを検索する if(!($val = $hash{&NAME})){ printf(STDERR "fetch failed: %s\n", $Depot::errmsg); } else { printf("Name: %s\n", &NAME); printf("Number: %s\n", $val); } # データベースを閉じる if(!untie(%hash)){ printf(STDERR "untie failed: %s\n", $Depot::errmsg); return 1; } return 0; } exit(main());
今のところ、AnyDBM_Fileの仲間ではない。
もしもPerlハッカー達の手にかかれば、より効率的な実装がなされるだろう。
インタフェースを簡潔にするため、Perl用のCuriaにはラージオブジェクトを扱う機能はない。