DB_FILE(3) USER COMMANDS DB_FILE(3)
NAME
DB_File - Perl5 からバークレイ DB へのアクセスを行なう
SYNOPSIS
use DB_File ;
[$X =] tie %hash, DB_File, $filename [, $flags, $mode, $DB_HASH] ;
[$X =] tie %hash, DB_File, $filename, $flags, $mode, $DB_BTREE ;
[$X =] tie @array, DB_File, $filename, $flags, $mode, $DB_RECNO ;
$status = $X->del($key [, $flags]) ;
$status = $X->put($key, $value [, $flags]) ;
$status = $X->get($key, $value [, $flags]) ;
$status = $X->seq($key, $value [, $flags]) ;
$status = $X->sync([$flags]) ;
$status = $X->fd ;
untie %hash ;
untie @array ;
DESCRIPTION
DB_File は、Perl プログラムがバークレイ DB で用意された機能
を使えるようにするためのモジュールです。 このモジュールを使
おうとするならば、バークレイ DB のマニュアルを必ず入手してお
くべきでしょう。 ここに定義されるインタフェースは、バークレ
イ DB インタフェースをそっくりまねています。
バークレイ DB は、多くのデータベース形式への一貫したインタフ
ェースを提供する C ライブラリです。 DB_File は、バークレイ
DB で現在サポートされている、三つのデータベースタイプへのイ
ンタフェースを提供します。
ファイルタイプ:
DB_HASH
このデータベースタイプでは、データファイルに任意の key
と data のペアを蓄えることができるものです。 これは、
DBM、NDBM、ODBM、GDBM、SDBM のような他のハッシュを行な
うパッケージが提供する機能と同じものです。 しかながら、
DB_HASH で作られたファイルは、他のパッケージでのものと
互換性がありません。
デフォルトのハッシュアルゴリズムは、ほとんどのアプリケ
ーションに適合できるもので、バークレイ DB に組み込まれ
ています。 自分のハッシュアルゴリズムを使う必要がある
ときには、Perl で書いて、DB_File に使わせることもできま
す。
DB_BTREE
btree 形式では、key と data のペアをソートした平衡型バ
イナリトリーに蓄えます。
Perl module manpages Last change: Release 5.0 Patchlevel 00 1
DB_FILE(3) USER COMMANDS DB_FILE(3)
DB_HASH 形式と同じく、key の比較を行なう Perl ルーティ
ンをユーザが定義することができますが、デフォルトでは、
key は文字の順に蓄えられます。
DB_RECNO
DB_RECNO では、DB_HASH や DB_BTREE と同じ key と value
のペアのインタフェースを使って操作できる、固定長、可変
長のテキストファイルが許容されます。 この場合、key は、
レコード (行) 番号が使われます。
DB_File は、どのようにバークレイ DB とやり取りを行なうのでし
ょうか。
DB_File は、Perl 5 の tie() 機構を使ってバークレイ DB ファイ
ルをアクセスします (詳しくは、perlfunc manpage の tie() の項
を参照してください)。 この機能によって、DB_File はバークレ
イ DB ファイルを (DB_HASH と DB_BTREE ファイル型のため) 連想
配列でも、(DB_RECNO ファイル型のため) 通常の配列でもアクセス
することができます。
tie() インタフェースに加えて、バークレイ DB API で用意されて
いるほとんどの関数を使うことができます。
バークレイ DB との違い
バークレイ DB では、データベースをオープンしたり、生成したり
するのに dbopen() 関数を使います。 以下は、dbopen() の C プ
ロトタイプです。
DB*
dbopen (const char * file, int flags, int mode,
DBTYPE type, const void * openinfo)
パラメータ type は、三つのインタフェース手法 (DB_HASH、
DB_BTREE、DB_RECNO) のどれが使われるかを示す列挙型です。 こ
のどれを選ぶかによって、最終パラメータ openinfo が、特定のイ
ンタフェース手法の合わせたデータ構造を指します。
このインタフェースは、DB_File では、多少異なった形で扱われま
す。 DB_File を使った呼び出しは、以下のようになります。
tie %array, DB_File, $filename, $flags, $mode, $DB_HASH ;
パラメータ filename と flags と mode は、dbopen() のものと同
じです。 最終パラメータ $DB_HASH は、dbopen() のパラメータ
type と openinfo の両方の役割を果たすものとなります。
たとえば、上記の $DB_HASH は、実際にはハッシュオブジェクトへ
のリファレンスです。 DB_File には、あらかじめ定義された三つ
のリファレンスがあります。 $DB_HASH の他に、$DB_BTREE と
$DB_RECNO が定義されています。
Perl module manpages Last change: Release 5.0 Patchlevel 00 2
DB_FILE(3) USER COMMANDS DB_FILE(3)
これらのあらかじめ定義されたリファレンスで許される key は、
同値な C の構造体で使われている名前に限られます。 これは、
たとえば、リファレンス $DB_HASH では、bsize、cashesize、
ffactor、hash、lorder、nelem という key だけが許されます。
これらの要素のいずれかの変更を行なうには、
$DB_HASH{cachesize} = 10000 ;
のように代入するだけです。
RECNO
RECNO をより Perl とコンパチブルにするために、すべての RECNO
配列の配列オフセットをバークレイ DN のように 1 とするのでは
なく、0 から始めるようにしています。
メモリ内データベース
バークレイ DB では、ファイル名の場所に NULL (これは、C の
(char *)0 です) を使うことによって、メモリ内データベースが作
れます。 DB_File で、この機能を使うには、NULL の代わりに
undef を使います。
バークレイ DB インタフェースを直接使う
結合されたハッシュや配列を使ったバークレイ DB のアクセスはも
ちろん、バークレイ DB のドキュメントに定義された、ほとんどの
関数を直接使うことも可能です。
そのためには、tie からの返却値を覚えておく必要があります。
$db = tie %hash, DB_File, "filename"
一旦これを行なえば、バークレイ DB API を直接アクセスすること
ができます。
$db->put($key, $value, R_NOOVERWRITE) ;
dbx(3X) manapge で定義されている関数は、close() と dbopen()
を除いて使用可能です。 これらの関数への DB_File インタフェ
ースは、バークレイ DB の動作をまねるようにインプリメントされ
ています。 特に、すべての関数は、ステータス値だけを返すこと
に注意しなくてはなりません。 バークレイ DB 関数が、パラメー
タを介してデータを返すときには、DB_File の方も全く同じことを
行ないます。
dbopen manpage で定義されている定数も、すべて利用可能です。
Perl module manpages Last change: Release 5.0 Patchlevel 00 3
DB_FILE(3) USER COMMANDS DB_FILE(3)
以下に利用可能な関数をあげます。
get flags パラメータが省略可であることを除いて、recno での
場合と同じです。 要求した key に伴う value は、$value
パラメータに返されます。
put 通常どおり、flags パラメータは省略可。
flags に R_IAFTER か R_IBEFORE を使っていれば、key パラ
メータは、挿入する key/value ペアのレコード番号が設定さ
れます。
del flags パラメータは省略可。
fd recno と同じ。
seq flags パラメータは省略可。
key パラメータと value パラメータ両方が設定されます。
sync flags パラメータは省略可。
EXAMPLES
実例を見た方が、理解しやすいことでしょうから、ここにいくつか
示すことにします。
HASH を使う
use DB_File ;
use Fcntl ;
tie %h, DB_File, "hashed", O_RDWR|O_CREAT, 0640, $DB_HASH ;
# key/value をファイルに追加する
$h{"apple"} = "orange" ;
# key の存在を確認する
print "Exists\n" if $h{"banana"} ;
# 削除
delete $h{"apple"} ;
untie %h ;
BTREE を使う
次は、BTREE を使った実例です。 少しでも興味あるものとするだ
けのために、デフォルトの比較ルーティンを使わないようにしまし
た。 代わりに Perl のサブルーティン Compare() で、大文字小
文字を区別しない比較を行なっています。
Perl module manpages Last change: Release 5.0 Patchlevel 00 4
DB_FILE(3) USER COMMANDS DB_FILE(3)
use DB_File ;
use Fcntl ;
sub Compare
{
my ($key1, $key2) = @_ ;
"\L$key1" cmp "\L$key2" ;
}
$DB_BTREE->{compare} = 'Compare' ;
tie %h, DB_File, "tree", O_RDWR|O_CREAT, 0640, $DB_BTREE ;
# key/value ペアをファイルに追加する
$h{'Wall'} = 'Larry' ;
$h{'Smith'} = 'John' ;
$h{'mouse'} = 'mickey' ;
$h{'duck'} = 'donald' ;
# 削除
delete $h{"duck"} ;
# key を一通り巡って、順に出力します。
# btree では、自動的に順番に並べられますので、key の
# sort は必要ないことに注意
foreach (keys %h)
{ print "$_\n" }
untie %h ;
以下は、上記の出力です。
mouse
Smith
Wall
Perl module manpages Last change: Release 5.0 Patchlevel 00 5
DB_FILE(3) USER COMMANDS DB_FILE(3)
RECNO を使う
use DB_File ;
use Fcntl ;
$DB_RECNO->{psize} = 3000 ;
tie @h, DB_File, "text", O_RDWR|O_CREAT, 0640, $DB_RECNO ;
# key/value ペアをファイルに追加する
$h[0] = "orange" ;
# key の存在を確認する
print "Exists\n" if $h[1] ;
untie @h ;
WARNINGS
このモジュールのソースに定義されている関数で、このドキュメン
トに書かれていないものがあれば、注意してください。 すぐに、
捨ててしまったかもしれません。
もし、そういったものが見つからなければ、探し方が悪いか、時間
が経って、破棄してしまったものです。
BUGS
バージョンの古いバークレイ DB では、RECNO ファイル形式を使っ
た固定長レコードに問題がありました。 このマニュアル執筆時点
での最新バージョンは 1.85 で、この RECNO の問題は回避されて
いるようです。
コードにバグがあることは、間違いありません。 お気付きの点、
拡張のご意見があれば、コメントをお待ちしています。
AVAILABILITY
バークレイ DB は、ftp.cs.berkeley の /ucb/4bsd/db.tar.gz デ
ィレクトリに納められているものが入手できます。 これは、GPL
に従うものでは *ありません*。
SEE ALSO
perl(1) manpage、dbopen(3) manpage、hash(3) manpage、recno(3)
manpage、btree(3) manpage
バークレイ DB は、ftp.cs.berkeley.edu の /ucb/4bsd ディレク
トリから入手できます。
AUTHOR
DB_File インタフェースは、Paul Marquess
<pmarquess@bfsec.bt.co.uk> によって書かれました。 DB システ
ム自身についての疑問は、Keith Bostic <bostic@cs.berkeley.edu>
へ知らせると良いでしょう。
Perl module manpages Last change: Release 5.0 Patchlevel 00 6