BerkeleyDB-0.20 > BerkeleyDB

名前

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_createDBENV->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_HASHdb_openを呼び出すことや、 Berkeley DB 3.x以上でタイプDB_HASHDB->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_BTREEdb_openを呼び出すことや、 Berkeley DB 3.x以上でタイプDB_BTREEDB->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データベースで順序を変更したいのであれば、いくつか注意すべき ポイントがあります:

  1. 新しい比較関数はデータベースを作成するときに指定されなければなりません。

  2. 一度データベースを作成してしまったら順序を変更することはできまんせん。 このためデータベースにアクセスするときには、いつも同じ比較関数を 使わなければなりません。

db_statの使用

TODO

BerkeleyDB::Recno

Berkeley DB 2.xでタイプDB_RECNOdb_openを呼び出すことや、 Berkeley DB 3.x以上でタイプDB_RECNODB->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_QUEUEDB->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_UNKNOWNdb_openを呼び出すことや、 Berkeley DB 3.x以上でタイプDB_UNKNOWNDB->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_HASHBerkeleyDB::Btreeデータベースのための DB_BTREEBerkeleyDB::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_NEXTDB_FIRSTと同じように 機能します。

カーソルが既に最後のキー/値の組に位置づけられていれば、c_getDB_NOTFOUNDを返します。

DB_NEXT_DUP

このフラグは重複するキーが可能になっているときにのみ有効です。 カーソルが既にあるキー/値の組に位置づけられ、次のキー/値の 組のキーが同じであれば、カーソルはそこに位置を1つ進め、 その内容を返します。

DB_PREV

カーソルが既にあるキー/値の組に位置づけられているならば、 前のキー/値の組に位置を1つ戻し、その内容を返します。

カーソルが初期化されていなければ、DB_PREVDB_LASTと同じように 機能します。

カーソルが既に先頭のキー/値の組に位置づけられていれば、c_getDB_NOTFOUNDを返します。

DB_CURRENT

カーソルが既にあるキー/値の組に位置づけられているならば、 その内容を返します。 もしカーソルによって参照されているキー/値の区あわせが削除されていれば、 c_getDB_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_delDB_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.