- 名前
- 概要
- 説明
- ENVクラス
- Globalクラス
- DATABASEクラス
- BerkeleyDB::Hash
- BerkeleyDB::Btree
- BerkeleyDB::Recno
- BerkeleyDB::Queue
- BerkeleyDB::Unknown
- 共通オプション
- 共通データベース・メソッド
- $status = $db->db_get($key, $value [, $flags])
- $status = $db->db_put($key, $value [, $flags])
- $status = $db->db_del($key [, $flags])
- $status = $db->db_sync()
- $cursor = $db->db_cursor([$flags])
- ($flag, $old_offset, $old_length) = $db->partial_set($offset, $length) ;
- ($flag, $old_offset, $old_length) = $db->partial_clear() ;
- $db->byteswapped()
- $db->type()
- $status = $db->status()
- $status = $db->truncate($count)
- カーソル
- JOIN
- トランザクション
- DBMフィルター
- MLDBMでのBerkeleyDBの使い方
- 使用例
- ヒントと小技
- よくある質問
- 変更履歴
- 利用するには
- 著作権(COPYRIGHT)
- 作者
- 参考資料
名前¶
BerkeleyDB - Berkeley DB バージョン2、3、4のためのPerl拡張
概要¶
use BerkeleyDB;
$env = new BerkeleyDB::Env [OPTIONS] ;
$db = tie %hash, 'BerkeleyDB::Hash', [OPTIONS] ;
$db = new BerkeleyDB::Hash [OPTIONS] ;
$db = tie %hash, 'BerkeleyDB::Btree', [OPTIONS] ;
$db = new BerkeleyDB::Btree [OPTIONS] ;
$db = tie %hash, 'BerkeleyDB::Recno', [OPTIONS] ;
$db = new BerkeleyDB::Recno [OPTIONS] ;
$db = tie %hash, 'BerkeleyDB::Queue', [OPTIONS] ;
$db = new BerkeleyDB::Queue [OPTIONS] ;
$db = new BerkeleyDB::Unknown [OPTIONS] ;
$status = BerkeleyDB::db_remove [OPTIONS]
$status = BerkeleyDB::db_rename [OPTIONS]
$status = BerkeleyDB::db_verify [OPTIONS]
$hash{$key} = $value ;
$value = $hash{$key} ;
each %hash ;
keys %hash ;
values %hash ;
$status = $db->db_get()
$status = $db->db_put() ;
$status = $db->db_del() ;
$status = $db->db_sync() ;
$status = $db->db_close() ;
$status = $db->db_close() ;
$status = $db->db_pget()
$hash_ref = $db->db_stat() ;
$status = $db->db_key_range();
$type = $db->type() ;
$status = $db->status() ;
$boolean = $db->byteswapped() ;
$status = $db->truncate($count) ;
($flag, $old_offset, $old_length) = $db->partial_set($offset, $length) ;
($flag, $old_offset, $old_length) = $db->partial_clear() ;
$cursor = $db->db_cursor([$flags]) ;
$newcursor = $cursor->c_dup([$flags]);
$status = $cursor->c_get() ;
$status = $cursor->c_put() ;
$status = $cursor->c_del() ;
$status = $cursor->c_count() ;
$status = $cursor->c_pget() ;
$status = $cursor->status() ;
$status = $cursor->c_close() ;
$cursor = $db->db_join() ;
$status = $cursor->c_get() ;
$status = $cursor->c_close() ;
$status = $env->txn_checkpoint()
$hash_ref = $env->txn_stat()
$status = $env->setmutexlocks()
$status = $env->set_flags()
$txn = $env->txn_begin() ;
$db->Txn($txn);
$txn->Txn($db1, $db2,...);
$status = $txn->txn_prepare()
$status = $txn->txn_commit()
$status = $txn->txn_abort()
$status = $txn->txn_id()
$status = $txn->txn_discard()
$status = $env->set_lg_dir();
$status = $env->set_lg_bsize();
$status = $env->set_lg_max();
$status = $env->set_data_dir() ;
$status = $env->set_tmp_dir() ;
$status = $env->set_verbose() ;
$BerkeleyDB::Error
$BerkeleyDB::db_version
# DBMフィルター
$old_filter = $db->filter_store_key ( sub { ... } ) ;
$old_filter = $db->filter_store_value( sub { ... } ) ;
$old_filter = $db->filter_fetch_key ( sub { ... } ) ;
$old_filter = $db->filter_fetch_value( sub { ... } ) ;
# 使うべきではありませんが、サポートされています
$txn_mgr = $env->TxnMgr();
$status = $txn_mgr->txn_checkpoint()
$hash_ref = $txn_mgr->txn_stat()
$txn = $txn_mgr->txn_begin() ;
説明¶
注意: このドキュメントはまだ作成中です。所々、不完全である と思ってください。
このPerlモジュールはBerkeley DB バージョン 2, 3 そして 4で利用できる ほとんどの機能へのインターフェースを提供します。一般的に ここで提供されるインターフェースはBerkeley DBインターフェースと 同じであると想定して大丈夫です。主な変更はBerkeley DB API を Perlで機能するようにしていることです。Berkeley DB 2.xを使っているのであれば、 Berkeley DB 3.x や DB 4.x で利用できる新しい機能が、このモジュールを 介して利用できないということに注意してください。
読者はBerkeley DBドキュメントに精通していることが期待されます。 提供されているインターフェースがBerkeley DBライブラリと同じで...TODO
db_appinit, db_cursor, db_open そして db_txn man ページは 特に関係があります。
Berkeley DBへのインターフェースはいくつかのPerlクラスで実装されて います。
ENVクラス¶
BerkeleyDB::EnvクラスはBerkeley DB 2.xでのBerkeley DB 関数db_appinitやBerkeley DB 3.x/4.xでのdb_env_createと DBENV->openへのインターフェースを提供します。 その目的は、あなたが環境を利用する全てのデータベースで 一貫性を持って使うことが出来るいくつかのサブシステムを初期化する ことです。
トランザクション、ロック、ログを利用するつもりがなければ、 BerkeleyDB::Envを利用する必要はありません。
概要¶
$env = new BerkeleyDB::Env
[ -Home => $path, ]
[ -Server => $name, ]
[ -CacheSize => $number, ]
[ -Config => { name => value, name => value }, ]
[ -ErrFile => filename, ]
[ -ErrPrefix => "string", ]
[ -Flags => number, ]
[ -SetFlags => bitmask, ]
[ -LockDetect => number, ]
[ -Verbose => boolean, ]
BerkeleyDB::Envコンストラクタへの全てのパラメータはオプションです。
- -Home
-
もしあれば、このパラメータは存在するディレクトリを示さなければなりません。 BerkeleyDB::Envクラスによって初期化されるサブシステムの中で 絶対パスで指定されなかったファイルは全て、Homeディレクトリにあるものと 想定されます。
例えば、以下のコードでは、相対パスで指定されているのでデータベース"fred.db"は "/home/databases"でオープンされます。しかし"joe.db"は絶対パスを持っているので "/other"でオープンされます。
$env = new BerkeleyDB::Env -Home => "/home/databases" ... $db1 = new BerkeleyDB::Hash -Filename = "fred.db", -Env => $env ... $db2 = new BerkeleyDB::Hash -Filename = "/other/joe.db", -Env => $env ...
- -Server
-
もしあれば、このパラメータはBerkeley DB RPCサーバーが走っているサーバーのホスト名 でなければなりません。全てのデータベースはRPCサーバーを介してアクセスされます。
- -Cachesize
-
もしあれば、このパラメータは環境共有メモリ・バッファ・プールの大きさを 設定します。
- -Config
-
これは
-Home
パラメータの変形です。しかしこれは特定のタイプのファイルが 保存される場所へのより細かい制御を可能にします。パラメータはハッシュへのリファレンスを期待します。適切なキーは: DB_DATA_DIR, DB_LOG_DIR そして DB_TMP_DIRです。
以下のコードは、どのようにそれを使うことができるかの例を示します。
$env = new BerkeleyDB::Env -Config => { DB_DATA_DIR => "/home/databases", DB_LOG_DIR => "/home/logs", DB_TMP_DIR => "/home/tmp" } ...
- -ErrFile
-
ファイル名を期待します。Berkeley DBによって内部的に発生したエラーは、 このファイルに書き込まれます。
- -ErrPrefix
-
-ErrFileに送られる前に、エラーメッセージの頭に文字列をつけることを 可能にします。
- -Flags
-
Flagsパラメータはどのサブシステムが初期化されるかと環境全体のオプションの 数の両方を指定します。 このオプションのさらなる詳細についてはBerkeley DB ドキュメントをご覧ください。
以下の全てをORすることによって指定することが出来ます:
DB_CREATE
存在していないファイルが指定されたら、それを作成します。
DB_INIT_CDB
Concurrent Accessメソッドを初期化します。
DB_INIT_LOCK
ロック・サブシステムを初期化します。
DB_INIT_LOG
ログ・サブシステムを初期化します。
DB_INIT_MPOOL
...を初期化します。
DB_INIT_TXN
...を初期化します。
DB_MPOOL_PRIVATE
...を初期化します。
DB_INIT_MPOOL も指定されます。
...を初期化します。
DB_NOMMAP
...を初期化します。
DB_RECOVER
DB_RECOVER_FATAL
DB_THREAD
DB_TXN_NOSYNC
DB_USE_ENVIRON
DB_USE_ENVIRON_ROOT
- -SetFlags
-
ENV->set_flagsを与えられたビットマスクで呼び出します。DB_ENV->openが 呼ばれる前にDB_ENV->set_flagsを使う必要があるとき、使用してください。
Berkeley DB 3.x 以上が使われるときにのみ適切です。
- -LockDetect
-
ロックの衝突が発生したときに何をするかを指定します。値は以下のいずれかでなければ なりません
DB_LOCK_DEFAULT
DB_LOCK_OLDEST
DB_LOCK_RANDOM
DB_LOCK_YOUNGEST
- -Verbose
-
特別なデバッグ情報を-ErrFileに送られるメッセージに追加します。
メソッド¶
環境(environment)クラスは以下のメソッドを持っています:
- $env->errPrefix("string") ;
-
このメソッドは-ErrPrefixフラグと同じです。頭につける文字列を 動的に変更することができます。
- $env->set_flags(bitmask, 1|0);
- $txn = $env->TxnMgr()
-
TxnMgrオブジェクトを作成するためのコンストラクタ。 トランザクションを利用する詳細については"トランザクション"をご覧ください。
このメソッドは使わないようにしてください。下記のtxn_メソッドを使って 環境オブジェクトから直接、トランザクション・メソッドにアクセスしてください。
- $env->txn_begin()
-
TODO
- $env->txn_stat()
-
TODO
- $env->txn_checkpoint()
-
TODO
- $env->status()
-
最後のBerkeleyDB::Envメソッドのステータスを返します。
- $env->setmutexlocks()
-
Berkeley Db 3.0以上でのみ利用できます。 Berkeley DB 3.1.xを利用しているとき、db_env_set_mutexlocksを呼びます。 Berkeley DB 3.0 や 3.2以上を利用しているときには、DBENV->set_mutexlocksを 呼びます。
使用例¶
TODO.
Globalクラス¶
$status = BerkeleyDB::db_remove [OPTIONS]
$status = BerkeleyDB::db_rename [OPTIONS]
$status = BerkeleyDB::db_verify [OPTIONS]
DATABASEクラス¶
BerkeleyDBは以下のデータベース・フォーマットをサポートします:
- BerkeleyDB::Hash
-
このデータベース・タイプは、任意のキー/値の組をデータファイルに 格納することを可能にします。これは機能の面でDBM, NDBM, ODBM, GDBM, そしてSDBMといった他のハッシュをおこなうパッケージが提供する同じです。 しかしBErkeleyDB::HASHを使って作られたファイルが、今上げた他のパッケージと 互換性がないということを忘れないでください。
デフォルトのハッシュ・アルゴリズムがBerkeley DBに組み込まれており、 ほとんどのアプリケーションに適合します。もし独自のハッシュ・アルゴリズムを 使う必要があれば、Perlで独自に書込み、BerkeleyDBが代わりにそれを使うように することも出来ます。
- BerkeleyDB::Btree
-
btreeフォーマットは任意のキー/値の組を、バランスがとれた バイナリー・ツリーに格納することが出来ます。
BerkeleyDB::Hashフォーマットの場合と同じように、 キーの比較を実行するユーザ定義の Perlのルーチンを提供することが出来ます。しかしデフォルトでは、 キーは文字(lexical)の順に格納されます。
- BerkeleyDB::Recno
-
TODO.
- BerkeleyDB::Queue
-
TODO.
- BerkeleyDB::Unknown
-
これはデータベース・フォーマットではありません。既存のBerkeley DBデータベースを その種類が何かを知ることなく、オープンしたいときに使います。
上記で記述されたそれぞれのデータベース・フォーマットは、 対応するBerkeleyDBクラスを介してアクセスされます。これらは 次のセクションで説明されます。
BerkeleyDB::Hash¶
Berkeley DB 2.xでタイプDB_HASHでdb_openを呼び出すことや、 Berkeley DB 3.x以上でタイプDB_HASHでDB->openした後にdb_createを 呼び出したことと同じです。
コンストラクタの2つの形式がサポートされています:
$db = new BerkeleyDB::Hash
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
# BerkeleyDB::Hash specific
[ -Ffactor => number,]
[ -Nelem => number,]
[ -Hash => code reference,]
[ -DupCompare => code reference,]
そしてこれです
[$db =] tie %hash, 'BerkeleyDB::Hash',
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
# BerkeleyDB::Hash specific
[ -Ffactor => number,]
[ -Nelem => number,]
[ -Hash => code reference,]
[ -DupCompare => code reference,]
"tie"インターフェースが使われると、データベースからの読み込みと書込みは tieされたハッシュを介して実現されます。この場合、データベースはPerl連想配列が たまたまディスクに格納されているように処理します。
高レベルのtieハッシュ・インターフェースに加えて、Berkeley DBによって 提供される元になっているメソッドを使用することができます。
オプション¶
オプションの標準セット(共通オプションをご覧ください)に加えて、 BerkeleyDB::Hashは下記のオプションもサポートします:
- -Property
-
データベースをオープンするとき、特別なフラグを指定するために使われます。 以下の値の1つまたは複数を一緒に論理的にORすることにより以下のフラグを 指定することが出来ます:
DB_DUP
新しいデータベースを作るとき、このフラグはデータベースに重複するキーを 格納することを可能にします。もしDB_DUPSORTが指定されなければ、 重複はそのデータベースが作成された順番で格納されます。
DB_DUPSORT
データベースでの重複したキーのソートを可能にします。もしDB_DUPも 指定されなければ、無視されます。
- -Ffactor
- -Nelem
-
これらのオプションについての詳細はBerkeley DBドキュメントをご覧ください。
- -Hash
-
ユーザ定義のハッシュ関数を提供することを可能にします。もし指定されなければ、 デフォルトのハッシュ関数が使われます。いかにユーザ定義ハッシュ関数のテンプレートを 示します
sub hash { my ($data) = shift ; ... # $dataのためのハッシュ値を返します return $hash ; } tie %h, "BerkeleyDB::Hash", -Filename => $filename, -Hash => \&hash, ...
例については""をご覧ください。
- -DupCompare
-
DB_DUPOSRTフラグと一緒に使われます。
sub compare { my ($key, $key2) = @_ ; ... # 戻り値 $key1 eq $key2 ならば 0 # $key1 lt $key2 ならば -1 # $key1 gt $key2 ならば 1 return (-1 , 0 or 1) ; } tie %h, "BerkeleyDB::Hash", -Filename => $filename, -Property => DB_DUP|DB_DUPSORT, -DupCompare => \&compare, ...
メソッド¶
BerkeleyDB::Hashは標準のデータベース・メソッドだけをサポートします。 共通データベース・メソッドをご覧ください。
単純なTieされたハッシュの例¶
use strict ;
use BerkeleyDB ;
use vars qw( %h $k $v ) ;
my $filename = "fruit" ;
unlink $filename ;
tie %h, "BerkeleyDB::Hash",
-Filename => $filename,
-Flags => DB_CREATE
or die "Cannot open file $filename: $! $BerkeleyDB::Error\n" ;
# ファイルにキー/値の組をいくつか追加します
$h{"apple"} = "red" ;
$h{"orange"} = "orange" ;
$h{"banana"} = "yellow" ;
$h{"tomato"} = "red" ;
# キーが存在するかをチェックします
print "Banana Exists\n\n" if $h{"banana"} ;
# キー/値の組を削除します
delete $h{"apple"} ;
# ファイルの内容を出力します
while (($k, $v) = each %h)
{ print "$k -> $v\n" }
untie %h ;
以下のように出力されます:
Banana Exists
orange -> orange
tomato -> red
banana -> yellow
通常の連想配列(ハッシュ)と同様、取り出されるキーの順番は見た目上、 でたらめになることに注意してください。
単純なハッシュのもう1つの例¶
tieを使わずに前の例と同じことをします。
use strict ;
use BerkeleyDB ;
my $filename = "fruit" ;
unlink $filename ;
my $db = new BerkeleyDB::Hash
-Filename => $filename,
-Flags => DB_CREATE
or die "Cannot open file $filename: $! $BerkeleyDB::Error\n" ;
# ファイルにキー/値の組をいくつか追加します
$db->db_put("apple", "red") ;
$db->db_put("orange", "orange") ;
$db->db_put("banana", "yellow") ;
$db->db_put("tomato", "red") ;
# キーが存在するかをチェックします
print "Banana Exists\n\n" if $db->db_get("banana", $v) == 0;
# キー/値の組を削除します
$db->db_del("apple") ;
# ファイルの内容を出力します
my ($k, $v) = ("", "") ;
my $cursor = $db->db_cursor() ;
while ($cursor->c_get($k, $v, DB_NEXT) == 0)
{ print "$k -> $v\n" }
undef $cursor ;
undef $db ;
キーの重複¶
以下のコードは上記の例の変形です。今度はハッシュが逆転しています。 今度のキーは色であり、値に果物の名前になります。重複を許すため、 DB_DUPフラグが指定されています。
use strict ;
use BerkeleyDB ;
my $filename = "fruit" ;
unlink $filename ;
my $db = new BerkeleyDB::Hash
-Filename => $filename,
-Flags => DB_CREATE,
-Property => DB_DUP
or die "Cannot open file $filename: $! $BerkeleyDB::Error\n" ;
# ファイルにキー/値の組をいくつか追加します
$db->db_put("red", "apple") ;
$db->db_put("orange", "orange") ;
$db->db_put("green", "banana") ;
$db->db_put("yellow", "banana") ;
$db->db_put("red", "tomato") ;
$db->db_put("green", "apple") ;
# ファイルの内容を出力します
my ($k, $v) = ("", "") ;
my $cursor = $db->db_cursor() ;
while ($cursor->c_get($k, $v, DB_NEXT) == 0)
{ print "$k -> $v\n" }
undef $cursor ;
undef $db ;
以下のように出力されます:
orange -> orange
yellow -> banana
red -> apple
red -> tomato
green -> banana
green -> apple
重複するキーのソート¶
前の例では、重複するキーがある場合、値はそれが格納された順序にソート されます。以下のコードは前の例と同じですが、DB_DUPSORTフラグが指定 されています。
use strict ;
use BerkeleyDB ;
my $filename = "fruit" ;
unlink $filename ;
my $db = new BerkeleyDB::Hash
-Filename => $filename,
-Flags => DB_CREATE,
-Property => DB_DUP | DB_DUPSORT
or die "Cannot open file $filename: $! $BerkeleyDB::Error\n" ;
# ファイルにキー/値の組をいくつか追加します
$db->db_put("red", "apple") ;
$db->db_put("orange", "orange") ;
$db->db_put("green", "banana") ;
$db->db_put("yellow", "banana") ;
$db->db_put("red", "tomato") ;
$db->db_put("green", "apple") ;
# ファイルの内容を出力します
my ($k, $v) = ("", "") ;
my $cursor = $db->db_cursor() ;
while ($cursor->c_get($k, $v, DB_NEXT) == 0)
{ print "$k -> $v\n" }
undef $cursor ;
undef $db ;
下記の出力で、重複した値がソートされていることに注意してください。
orange -> orange
yellow -> banana
red -> apple
red -> tomato
green -> apple
green -> banana
重複するキーの独自のソート¶
もう一つの変形
TODO
ハッシュの変更¶
TODO
db_statの使用¶
TODO
BerkeleyDB::Btree¶
Berkeley DB 2.xでタイプDB_BTREEでdb_openを呼び出すことや、 Berkeley DB 3.x以上でタイプDB_BTREEでDB->openした後にdb_createを 呼び出したことと同じです。
コンストラクタの2つの形式がサポートされています:
$db = new BerkeleyDB::Btree
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
# BerkeleyDB::Btree specific
[ -Minkey => number,]
[ -Compare => code reference,]
[ -DupCompare => code reference,]
[ -Prefix => code reference,]
そしてこれです
[$db =] tie %hash, 'BerkeleyDB::Btree',
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
# BerkeleyDB::Btree specific
[ -Minkey => number,]
[ -Compare => code reference,]
[ -DupCompare => code reference,]
[ -Prefix => code reference,]
オプション¶
オプションの標準セット(共通オプションをご覧ください)に加えて、 BerkeleyDB::Btreeは以下のオプションをサポートしています:
- -Property
-
データベースをオープンするとき、特別なフラグを指定するために使われます。 以下の値の1つまたは複数を一緒に論理的にORすることにより以下のフラグを 指定することが出来ます:
DB_DUP
新しいデータベースを作るとき、このフラグはデータベースに重複するキーを 格納することを可能にします。もしDB_DUPSORTが指定されなければ、 重複はそのデータベースが作成された順番で格納されます。
DB_DUPSORT
データベースでの重複したキーのソートを可能にします。もしDB_DUPも 指定されなければ、無視されます。
- Minkey
-
TODO
- Compare
-
データベースでのデフォルトのソート順を上書きすることを可能にします。 例については"ソート順の変更" をご覧ください。
sub compare { my ($key, $key2) = @_ ; ... # return 0 if $key1 eq $key2 # -1 if $key1 lt $key2 # 1 if $key1 gt $key2 return (-1 , 0 or 1) ; } tie %h, "BerkeleyDB::Hash", -Filename => $filename, -Compare => \&compare, ...
- Prefix
-
sub prefix { my ($key, $key2) = @_ ; ... # $key1よりも大きいかを判定するために必要な # $key2のバイト数を返します。 return $bytes ; } tie %h, "BerkeleyDB::Hash", -Filename => $filename, -Prefix => \&prefix, ... =item DupCompare sub compare { my ($key, $key2) = @_ ; ... # 戻り値 $key1 eq $key2 ならば 0 # $key1 lt $key2 ならば -1 # $key1 gt $key2 ならば 1 return (-1 , 0 or 1) ; } tie %h, "BerkeleyDB::Hash", -Filename => $filename, -DupCompare => \&compare, ...
メソッド¶
BerkeleyDB::Btreeは以下のデータベース・メソッドをサポートしています。 共通データベース・メソッドも、ご覧ください。
以下の全てのメソッドは正常を示すために0を返します。
- $status = $db->db_key_range($key, $less, $equal, $greater [, $flags])
-
キー、
$key
が与えられ、このメソッドは$less
での$key
よりも小さいキーの割合、$equal
での$key
と同じ割合、$greater
での$key
よりも大きな割合を返します。その割合は0.0から1.0の範囲のdoubleで返されます。
簡単なBtreeの例¶
以下のコードはbtreeデータベースを使った簡単な例です。
use strict ;
use BerkeleyDB ;
my $filename = "tree" ;
unlink $filename ;
my %h ;
tie %h, 'BerkeleyDB::Btree',
-Filename => $filename,
-Flags => DB_CREATE
or die "Cannot open $filename: $!\n" ;
# ファイルにキー/値の組を追加
$h{'Wall'} = 'Larry' ;
$h{'Smith'} = 'John' ;
$h{'mouse'} = 'mickey' ;
$h{'duck'} = 'donald' ;
# 削除
delete $h{"duck"} ;
# 順番にキーと通して繰り返し、出力します。
# btreeが自動的に順番を保っているので
# キーをソートする必要がないことに注意してください
foreach (keys %h)
{ print "$_\n" }
untie %h ;
上記のコードは以下のように出力します。キーはBerkeley DBのデフォルトの ソート・アルゴリズムを使ってソートされています。
Smith
Wall
mouse
ソート順の変更¶
Berkeley DBが使っているものが合わなければ、独自のソート・アルゴリズムを 提供することも可能です。以下のコードは前の例と同じですが、大文字/小文字の 違いを無視する比較関数を使っています。
use strict ;
use BerkeleyDB ;
my $filename = "tree" ;
unlink $filename ;
my %h ;
tie %h, 'BerkeleyDB::Btree',
-Filename => $filename,
-Flags => DB_CREATE,
-Compare => sub { lc $_[0] cmp lc $_[1] }
or die "Cannot open $filename: $!\n" ;
# ファイルにキー/値の組を追加
$h{'Wall'} = 'Larry' ;
$h{'Smith'} = 'John' ;
$h{'mouse'} = 'mickey' ;
$h{'duck'} = 'donald' ;
# 削除
delete $h{"duck"} ;
# 順番にキーと通して繰り返し、出力します。
# btreeが自動的に順番を保っているので
# キーをソートする必要がないことに注意してください
foreach (keys %h)
{ print "$_\n" }
untie %h ;
上記のコードは以下のように出力します。
mouse
Smith
Wall
BTREEデータベースで順序を変更したいのであれば、いくつか注意すべき ポイントがあります:
新しい比較関数はデータベースを作成するときに指定されなければなりません。
一度データベースを作成してしまったら順序を変更することはできまんせん。 このためデータベースにアクセスするときには、いつも同じ比較関数を 使わなければなりません。
db_statの使用¶
TODO
BerkeleyDB::Recno¶
Berkeley DB 2.xでタイプDB_RECNOでdb_openを呼び出すことや、 Berkeley DB 3.x以上でタイプDB_RECNOでDB->openした後にdb_createを 呼び出したことと同じです。
コンストラクタの2つの形式がサポートされています:
$db = new BerkeleyDB::Recno
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
# BerkeleyDB::Recno specific
[ -Delim => byte,]
[ -Len => number,]
[ -Pad => byte,]
[ -Source => filename,]
そしてこれです
[$db =] tie @arry, 'BerkeleyDB::Recno',
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
# BerkeleyDB::Recno specific
[ -Delim => byte,]
[ -Len => number,]
[ -Pad => byte,]
[ -Source => filename,]
Recnoの例¶
以下にRECNOを使う簡単な例を示します(5.004_57よりも前のバージョンの Perlを使っていると、この例は動きません -- 回避方法については 特別なRECNOメソッドをご覧ください)。
use strict ;
use BerkeleyDB ;
my $filename = "text" ;
unlink $filename ;
my @h ;
tie @h, 'BerkeleyDB::Recno',
-Filename => $filename,
-Flags => DB_CREATE,
-Property => DB_RENUMBER
or die "Cannot open $filename: $!\n" ;
# いくつかのキー/値の組をファイルに追加する
$h[0] = "orange" ;
$h[1] = "blue" ;
$h[2] = "yellow" ;
push @h, "green", "black" ;
my $elements = scalar @h ;
print "The array contains $elements entries\n" ;
my $last = pop @h ;
print "popped $last\n" ;
unshift @h, "white" ;
my $first = shift @h ;
print "shifted $first\n" ;
# キーが存在することをチェックする
print "Element 1 Exists with value $h[1]\n" if $h[1] ;
untie @h ;
このスクリプトにより以下のように出力されます:
The array contains 5 entries
popped black
shifted white
Element 1 Exists with value blue
The last element is green
The 2nd last element is yellow
BerkeleyDB::Queue¶
Berkeley DB 3.x以上でタイプDB_QUEUEでDB->openした後にdb_createを 呼び出したことと同じです。このデータベース・フォーマットはBerkeley DB 2.xを 使っているならば利用することはできません。
コンストラクタの2つの形式がサポートされています:
$db = new BerkeleyDB::Queue
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
# BerkeleyDB::Queue specific
[ -Len => number,]
[ -Pad => byte,]
[ -ExtentSize => number, ]
と、これです
[$db =] tie @arry, 'BerkeleyDB::Queue',
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
# BerkeleyDB::Queue specific
[ -Len => number,]
[ -Pad => byte,]
BerkeleyDB::Unknown¶
このクラスは既存のデータベースをオープンするときに利用されます。
Berkeley DB 2.xでタイプDB_UNKNOWNでdb_openを呼び出すことや、 Berkeley DB 3.x以上でタイプDB_UNKNOWNでDB->openした後にdb_createを 呼び出したことと同じです。
コンストラクタの2つの形式がサポートされています:
$db = new BerkeleyDB::Unknown
[ -Filename => "filename", ]
[ -Subname => "sub-database name", ]
[ -Flags => flags,]
[ -Property => flags,]
[ -Mode => number,]
[ -Cachesize => number,]
[ -Lorder => number,]
[ -Pagesize => number,]
[ -Env => $env,]
[ -Txn => $txn,]
使用例¶
共通オプション¶
全てのデータベース・アクセス・クラス・コンストラクタは以下にあげる オプション共通集合をサポートしています。全て必須ではありません。
- -Filename
-
データベース・ファイル名。何もファイル名が指定されなければ、テンポラリ・ファイルが 作成され、プログラムが終了すると削除されます。
- -Subname
-
オープンするサブデータベースの名前を指定します。 このオプションはBerkeley DB 3.x以上を使っているときにのみ有効です。
- -Flags
-
データベースがどのようにオープン/作成されるかを指定します。 有効なフラグは以下のものです:
DB_CREATE
必要であれば元になるファイルを作成します。ファイルが存在せず、DB_CREATEが 指定されていなければ、その呼び出しは失敗します。
DB_NOMMAP
BerkeleyDBによってサポートされていません。
DB_RDONLY
読み込みのみモードでデータベースをオープンします。
DB_THREAD
BerkeleyDBによってサポートされていません。
DB_TRUNCATE
データベース・ファイルが既に存在していれば、それをオープンする前にその 全てのデータを削除します。
- -Mode
-
データベースが作成されたとき、ファイル保護を決定します。デフォルトは 0666です。
- -Cachesize
- -Lorder
- -Pagesize
- -Env
-
Berkeley DB環境で動くとき、このパラメータ
デフォルトでは環境はありません。
- -Txn
-
TODO.
共通データベース・メソッド¶
全てのデータベース・インターフェースは以下の定義されているメソッドの 共通集合をサポートします。
以下の全てのメソッドは正常を表すために0を返します。
$status = $db->db_get($key, $value [, $flags])¶
キー($key
)が与えられ、このメソッドはデータベースから、それに 関連付けられた値を読み込みます。もしあれば、データベースから読み込まれた 値が$value
パラメータに返されます。
$flagsパラメータはオプションです。もしあればそれは以下の値の1つに 設定されなければなりません:
- DB_GET_BOTH
-
DB_GET_BOTHフラグが指定されると、db_getはデータベースに
$key
と$value
の両方が存在するかをチェックします。 - DB_SET_RECNO
-
TODO.
さらに、以下の値を論理的にORすることにより$flagsパラメータに設定できる かもしれません。
- DB_RMW
-
TODO
$status = $db->db_put($key, $value [, $flags])¶
データベースにキー/値の組を格納します。
$flagsパラメータはオプションです。もしあればそれは以下の値の1つに 設定されなければなりません:
- DB_APPEND
-
このフラグはBerkeleyDB::Recnoデータベースにアクセスするときにだけ、 適切です。
TODO.
- DB_NOOVERWRITE
-
このフラグが指定され、
$key
がデータベースに既にあれば、 db_putの呼び出しは、DB_KEYEXISTを返します。
$status = $db->db_del($key [, $flags])¶
データベースで$key
に関連付けられたキー/値の組を削除します。 データベースでキーの重複が可能であれば、db_delはキー$key
を持つ キー/値の組を全て削除します。
$flagsパラメータはオプションで、現在は使われません。
$status = $db->db_sync()¶
データベースの一部がメモリにあれば、それをデータベースに書き込みます。
$cursor = $db->db_cursor([$flags])¶
カーソル(cursor)オブジェクトを作成します。これはデータベースの内容を 順番にアクセスするために使われます。カーソルで作業するときに 利用できるメソッドの詳細についてはカーソルをご覧ください。
$flagsパラメータはオプションです。もしあればそれは以下の値の1つに 設定されなければなりません:
- DB_RMW
-
TODO.
($flag, $old_offset, $old_length) = $db->partial_set($offset, $length) ;¶
TODO
($flag, $old_offset, $old_length) = $db->partial_clear() ;¶
TODO
$db->byteswapped()¶
TODO
$db->type()¶
データベースの種類を返します。ありうるリターンコードはBerkeleyDB::Hash データベースのためのDB_HASH、BerkeleyDB::Btreeデータベースのための DB_BTREE、BerkeleyDB::RecnoのためのDB_RECNOがあります。このメソッドは 典型的にはBerkeleyDB::Unknownでデータベースがオープンされたときに使われます。
- $ref = $db->db_stat()
-
データベースに関する情報が入った連想配列へのリファレンスを返します。 連想配列のキーは直接、Berkeley DBドキュメントで定義されているフィールドの 名前に対応します。例えばDBドキュメントでは、フィールドbt_versionは Btreeデータベースのバージョンを格納します。Btreeデータベースにdb_statを 呼び出したとすると、同じフィールドが以下のようにしてアクセスされます:
$version = $ref->{'bt_version'} ;
Berkeley DB 3.x以上を使っているのであれば、このメソッドは全てのデータベース・ フォーマットで機能します。DB 2.xを使っているときには、BerkeleyDB::Btree でのみ機能します。
$status = $db->status()¶
最後の$db
メソッド呼び出しのステータスを返します。
$status = $db->truncate($count)¶
データベースを切り捨て、$count
に削除されたレコード数を返します。
カーソル¶
カーソルは順番にデータベースの内容にアクセスしたいとき、 いつでも使われます。 カーソル・オブジェクトはdb_cursor
で作成されます。
カーソル・オブジェクトでは以下のメソッドが利用できます:
$newcursor = $cursor->c_dup($flags)¶
$cursor
の複製を作成します。このメソッドはBerkeley DB 3.0.x以上を必要とします。
$flags
パラメータはオプションで、以下の値をとることが出来ます:
- DB_POSITION
-
このフラグがあると、新しいカーソルを既にあるカーソルと同じ場所に位置づけます。
$status = $cursor->c_get($key, $value, $flags)¶
データを$key
と$value
に返しながら、データベースからキー/値の 組を読み込みます。キー/値の組の読み込みは、$flags
パラメータにより制御されます。そのフラグは以下の値の1つを取ることが できます:
- DB_FIRST
-
カーソルをデータベースでの先頭のキー/値の組に 位置づけます。キー/値の組を
$key
と$value
に返します。 - DB_LAST
-
カーソルをデータベースでの最後のキー/値の組に 位置づけます。キー/値の組を
$key
と$value
に返します。 - DB_NEXT
-
カーソルが既にあるキー/値の組に位置づけられているならば、 次のキー/値の組に位置を1つ進め、その内容を返します。
カーソルが初期化されていなければ、DB_NEXTはDB_FIRSTと同じように 機能します。
カーソルが既に最後のキー/値の組に位置づけられていれば、c_getは DB_NOTFOUNDを返します。
- DB_NEXT_DUP
-
このフラグは重複するキーが可能になっているときにのみ有効です。 カーソルが既にあるキー/値の組に位置づけられ、次のキー/値の 組のキーが同じであれば、カーソルはそこに位置を1つ進め、 その内容を返します。
- DB_PREV
-
カーソルが既にあるキー/値の組に位置づけられているならば、 前のキー/値の組に位置を1つ戻し、その内容を返します。
カーソルが初期化されていなければ、DB_PREVはDB_LASTと同じように 機能します。
カーソルが既に先頭のキー/値の組に位置づけられていれば、c_getは DB_NOTFOUNDを返します。
- DB_CURRENT
-
カーソルが既にあるキー/値の組に位置づけられているならば、 その内容を返します。 もしカーソルによって参照されているキー/値の区あわせが削除されていれば、 c_getはDB_KEYEMPTYを返します。
- DB_SET
-
カーソルを$keyによって参照されるキー/値の組に位置づけ、 その値を$valueに返します。
- DB_SET_RANGE
-
このフラグはDB_SETフラグでの変種です。$keyを介してキーを返します。
BerkeleyDB::Btreeデータベースで使われると、c_getによりマッチする キーは、与えられたキー以上である(長さとして)最も短いキーになります。 これにより部分キーの検索が可能になります。このフラグの使い方の例に ついては???をご覧ください。
- DB_GET_BOTH
-
DB_SETのもう1つの変種です。これはキーと値の両方を返します。
- DB_SET_RECNO
-
TODO.
- DB_GET_RECNO
-
TODO.
さらに、以下の値を$flagsパラメータに論理的にORすることにより設定する ことができます:
- DB_RMW
-
TODO.
$status = $cursor->c_put($key, $value, $flags)¶
データベースにキー/値の組を格納します。データベースでのデータが 格納される位置は、$flags
パラメータにより制御されます。それは 以下の値の1つを取らなければなりません:
- DB_AFTER
-
BtreeまたはHashデータベースで使われると、現在のカーソルによって参照される キーの重複が作成され、$valueの内容は、それに結び付けられます - $keyは 無視されます。 新しいキー/値の組は現在のカーソルの位置のすぐ後ろに格納されます。 明らかに、データベースはDB_DUPでオープンされなければなりません。
Recnoで使われるときには ... TODO
- DB_BEFORE
-
BtreeまたはHashデータベースで使われると、現在のカーソルによって参照される キーの重複が作成され、$valueの内容は、それに結び付けられます - $keyは 無視されます。 新しいキー/値の組は現在のカーソルの位置のすぐ前に格納されます。 明らかに、データベースはDB_DUPでオープンされなければなりません。
Recnoで使われるときには ... TODO
- DB_CURRENT
-
もしカーソルが初期化されていれば、データベースの中のキー/値の組の 値を$valueの内容で置き換えます。
- DB_KEYFIRST
-
BtreeまたはHashデータベースでのみ有効です。このフラグはデータベースで 重複が許され、ソートされた重複がしていされていないときにのみ本当に 使われます。 この場合、キー/値の組は、特定のキーの重複での先頭のエントリとして 挿入されます。
- DB_KEYLAST
-
BtreeまたはHashデータベースでのみ有効です。このフラグはデータベースで 重複が許され、ソートされた重複がしていされていないときにのみ本当に 使われます。 この場合、キー/値の組は、特定のキーの重複での最後のエントリとして 挿入されます。
$status = $cursor->c_del([$flags])¶
このメソッドは現在のカーソル位置に関連付けられているキー/値の組を 削除します。カーソル位置はこの操作によって変更されません。そのため この後のカーソル操作は、適切なキー/値の組に位置づけるため、 まずカーソルを初期化しなければなりません。
もしカーソルに関連付けられているキー/値の組が既に削除されて いれば、c_delはDB_KEYEMPTYを返します。
$flagsパラメータは今のところ使われていません。
$status = $cursor->c_del($cnt [, $flags])¶
現在のカーソル位置での重複の数を$cntに格納します。
$flagsは現在は使われていません。このメソッドはBerkeley DB 3.1以上を 必要とします。
$status = $cursor->status()¶
最後のカーソル・メソッドのステータスをdualタイプで返します。
カーソルの例¶
TODO
最初から最後まで繰り返す。そして逆
それぞれのフラグの例
JOIN¶
BerkeleyDBのためのJoinのサポートは現在進行中。この場所を注目してください。
TODO
トランザクション¶
TODO.
DBMフィルター¶
DBMフィルターはコードの集まりでであり、DBMデータベースの中の 全てのキーと/または値に同じ変換を行いたいと常に思っている ときに使われます。全てデータベース・クラス(BerkeleyDB::Hash, BerkeleyDB::Btree そして BerkeleyDB::Recno)は、DBMフィルターを サポートします。
DBMフィルターに関連しては4つのメソッドがあります。全て同様に 機能します。それぞれは1つのDBMフィルターをインストール (またはアンインストール)するために使われます。各メソッドは 1つのパラメータ、つまりsubへのリファレンスを期待します。 それぞれの唯一の違いはフィルターがインストールされる場所です。
まとめると以下のようになります:
- filter_store_key
-
このメソッドでフィルターがインストールされると、 DBMデータベースにキーを書きこむたびに、それが呼ばれます。
- filter_store_value
-
このメソッドでフィルターがインストールされると、DBMデータベースに 値を書きこむたびに、それが呼ばれます。
- filter_fetch_key
-
このメソッドでフィルターがインストールされると、DBMデータベースから キーを読みこむたびに、それが呼ばれます。
- filter_fetch_value
-
このメソッドでフィルターがインストールされると、DBMデータベースから 値を読みこむたびに、それが呼ばれます。
全く無しから4つ全てまで、これらを自由に組み合わせて使うことができます。
全てのフィルター・メソッドは、もしあれば既存のフィルターを、 無ければundef
を返します。
フィルターを削除するにはundef
を渡してください。
フィルター¶
各フィルターがPerlから呼び出されるとき、$_
のローカル・コピーには フィルターされるキーまたは値が入ります。フィルタリングは$_
の内容を 変更することにより実現されます。フィルターからの戻り値は無視されます。
例 -- NULL終わりの問題¶
以下のシナリオについて考えてみてください。サードパーティの Cアプリケーションと共有する必要があるDBMデータベースを 持っているとします。そのCアプリケーションは全ての
キーと 値はNULLで終わるものと仮定しています。不幸にもPerlがDBM データベースに書きこむとき、NULL終わりを使いません。 そのため、あなたのPerlアプリケーションは自分自身でNULL終わりを 管理しなければなりません。データベースに書きこむとき、以下のような 方法をとる必要があります:
$hash{"$key\0"} = "$value\0" ;
同様に存在するキー/値の長さを考えるとき、NULLを考慮に入れる 必要があります。
メインのアプリケーション・プログラムでのNULL終わり問題を無視する ことができ、データベースに書きこむときにはいつでも自動的に全ての キーと値に終わりのNULLを付与し、データベースから読みこむときには、 それらを削除するような機構を持つならば、素晴らしいことです。 既におわかりかと思いますが、この問題はDBMフィルターによって とても簡単に修正することができます。
use strict ;
use BerkeleyDB ;
my %hash ;
my $filename = "filt.db" ;
unlink $filename ;
my $db = tie %hash, 'BerkeleyDB::Hash',
-Filename => $filename,
-Flags => DB_CREATE
or die "Cannot open $filename: $!\n" ;
# DBMフィルターのインストール
$db->filter_fetch_key ( sub { s/\0$// } ) ;
$db->filter_store_key ( sub { $_ .= "\0" } ) ;
$db->filter_fetch_value( sub { s/\0$// } ) ;
$db->filter_store_value( sub { $_ .= "\0" } ) ;
$hash{"abc"} = "def" ;
my $a = $hash{"ABC"} ;
# ...
undef $db ;
untie %hash ;
できるならば各フィルターの内容は自己説明的であるべきです。 両方の"fetch"フィルターがNULL終わりを取り除き、 両方の"store"フィルターがNULL終わりを付与します。
もう1つの例 -- キーがC int¶
実際の場面での例をもう一つ。デフォルトではPerlはDBMデータベースに 書きこむときはいつでも、キーと値を文字列として書きこみます。 そのため以下のようにすると:
$hash{12345} = "something" ;
キー12345 は5バイトの文字列"12345"としてDBMデータベースに 格納されます。もし本当にDBMデータベースにCのintでキーを 格納したいのであれば、書きこむときにpack
し、読みこむときに unpack
する必要があります。
以下はそれをおこなうDBMフィルターです:
use strict ;
use BerkeleyDB ;
my %hash ;
my $filename = "filt.db" ;
unlink $filename ;
my $db = tie %hash, 'BerkeleyDB::Btree',
-Filename => $filename,
-Flags => DB_CREATE
or die "Cannot open $filename: $!\n" ;
$db->filter_fetch_key ( sub { $_ = unpack("i", $_) } ) ;
$db->filter_store_key ( sub { $_ = pack ("i", $_) } ) ;
$hash{123} = "def" ;
# ...
undef $db ;
untie %hash ;
今回は2つのフィルターを使いました -- キーの内容を扱うことだけが必要 だったので、値のフィルターをインストールする必要がありません。
MLDBMでのBerkeleyDBの使い方¶
BerkeleyDB::Hash と BerkeleyDB::Btreeは両方とも、MLDBMと一緒に使うことが 出来ます。以下のコードはBerkeleyDB::Btreeに関連付けられたMLDBMをオープン する方法を示しています。BerkeleyDB::Hashを使うためには、BerkeleyDB::Hashを 単純にBerkeleyDB::Btreeに置き換えてください。
use strict ;
use BerkeleyDB ;
use MLDBM qw(BerkeleyDB::Btree) ;
use Data::Dumper;
my $filename = 'testmldbm' ;
my %o ;
unlink $filename ;
tie %o, 'MLDBM', -Filename => $filename,
-Flags => DB_CREATE
or die "Cannot open database '$filename: $!\n";
モジュールの使い方とその制約についての詳細の情報についてはMLDBMの ドキュメントを、ご覧ください。
使用例¶
TODO.
ヒントと小技¶
Cアプリケーションとのデータベースの共有¶
Berkeley DBデータベースをPerlとCアプリケーションとで共有できないという 技術的な理由は何もありません。
ここで報告されている非常に大きな問題はPerl文字列はそうでないのに、C文字列が NULL終わりであるということです。この問題を回避する一般的な方法については DBMフィルター セクションでの"例 -- NULL終わりの問題"をご覧下さい。
untieがしでかすこと¶
TODO
よくある質問¶
このセクションでは私が聞かれたよくある質問のうちのいくつかに答えてみます。
DB_Fileとの関係¶
Berkeley DB 2.xが書かれるまで、Berkeley DBへのインターフェースとなるPerl モジュールは1つしかありませんでした。そのモジュールはDB_Fileです。 DB_FileはBerkeley DB 1.x, 2.x, 3.x あるいは 4.xでビルドすることができますが、 Berkeley DB 1.xで利用できる機能へのインターフェースしか提供しません。 つまりそれはトランザクション、ロック、その他のDB 2.x以上で利用できる新しい機能を サポートしていません。
Perlデータ構造体をBerkeleyDBで格納する方法は?¶
MLDBMでのBerkeleyDBの使い方をご覧ください。
変更履歴¶
Changesファイルをご覧ください。
利用するには¶
BerkeleyDBの最新バージョンは CPAN(詳細については"CPAN" in perlmodをご覧下さい) のディレクトリ"by-module/BerkeleyDB" in modulesで取得することができます。
Berkeley DB の公式ウェブサイトは http://www.sleepycat.com です。
著作権(COPYRIGHT)¶
Copyright (c) 1997-2002 Paul Marquess. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
BerkeleyDBはPerlライセンスによってカバーされますが、これが使用する ライブラリ、つまりBerkeley DBはそうではありません。Berkeley DBは それ自身の著作権と独自のライセンスを持っています。それを読んでください。
Berkeley DB FAQ (http://www.sleepycat.com)からライセンスについての 一部を示します:
Perlスクリプトで使うためにDBをライセンスする必要がありますか?
いいえ。Berkeley DBライセンスはBerkeley DBを利用するソフトウェアは、
自由に再配布可能であることを必要とします。Perlの場合、つまり
ソフトウェアはPerlであり、あなたのスクリプトではありません。
あなたが書いた全てのPerlスクリプトはBerkeley DBを使ったものも
含めて、あなたの資産です。PerlライセンスもBerkeley DBライセンスも
あなたがそれらを使ってできることを何ら制限しません。
もしライセンスの状況に疑問があれば、Berkeley DBの作者あるいはBerkeleyDBの 作者にコンタクトしてください。下記の作者をご覧ください。
作者¶
Paul Marquess <Paul.Marquess@btinternet.com>.
DBシステムそのものについての疑問は <db@sleepycat.com<gt> にお願いします。
参考資料¶
perl(1), DB_File, Berkeley DB.