# 8.7 `gdbm` -- GNU による dbm の再実装

利用可能な条件: Unix.

このモジュールは `dbm` モジュールに よく似ていますが、`gdbm` を使っていくつかの追加機能を提供しています。 `gdbm` と `dbm` では生成されるファイル形式に互換性がないので 注意してください。

`gdbm` モジュールでは GNU DBM ライブラリへのインタフェースを 提供します。`gdbm` オブジェクトはキーと値が常に文字列である ことを除き、マップ型 (辞書型) と同じように動作します。 `gdbm` オブジェクトに対して `print` を適用しても キーや値を印字することはなく、`items()` 及び `values()` メソッドはサポートされていません。

このモジュールでは以下の定数および関数を定義しています:

exception `error`
  I/O エラーのような `gdbm` 特有のエラーで送出されます。 誤ったキーの指定のように、一般的なマップ型のエラーに対しては `KeyError` が送出されます。

`open`( | filename, [flag, [mode]])

  `gdbm` データベースを開いて `gdbm` オブジェクトを返します。 filename 引数はデータベースファイルの名前です。

  オプションの flag としては、 `'r'` (既存のデータベースを読み込み専用で開く -- 標準の値です)、 `'w'` (既存のデータベースを読み書き用に開く)、 `'c'` (既存のデータベースが存在しない場合には新たに作成する)、または `'n'` (常に新たにデータベースを作成する)、をとることができます。

  データベースをどのように開くかを制御するために、フラグに以下の文字を 追加することができます:

  - `'f'` -- データベースを高速モードで開きます。このモードではデータベースへの書き込みはファイルシステムと同期されません。
  - `'s'` -- 同期モードで開きます。データベースへの変更はファイルに即座いに書き込まれます。
  - `'u'` -- データベースをロックしません。

  全てのバージョンの `gdbm` で全てのフラグが有効とは限りません。 モジュール定数 `open_flags` はサポートされているフラグ文字 からなる文字列です。無効なフラグが指定された場合、例外 `error` が送出されます。

  オプションの mode 引数は、新たにデータベースを作成しなければならない 場合に使われる Unix のファイルモードです。標準の値は 8 進数の `0666` です。

辞書型形式のメソッドに加えて、`gdbm` オブジェクトには以下のメソッド があります:

`firstkey`( | )

  このメソッドと `next()` メソッドを使って、データベースの全ての キーにわたってループ処理を行うことができます。探索は `gdbm` の 内部ハッシュ値の順番に行われ、キーの値に順に並んでいるとは限りません。 このメソッドは最初のキーを返します。

`nextkey`( | key)

  データベースの順方向探索において、key よりも後に来るキーを 返します。以下のコードはデータベース `db` に ついて、キー全てを含むリストをメモリ上に生成することなく 全てのキーを出力します:

      k = db.firstkey()
      while k != None:
          print k
          k = db.nextkey(k)

`reorganize`( | )

  大量の削除を実行した後、`gdbm` ファイルの占めるスペースを 削減したい場合、このルーチンはデータベースを再組織化します。 この再組織化を使う以外に `gdbm` はデータベースファイルの 大きさを短くすることはありません; そうでない場合、削除された 部分のファイルスペースは保持され、新たな (キー、値の) ペアが追加 される際に再利用されます。

`sync`( | )

  データベースが高速モードで開かれていた場合、このメソッドは ディスクにまだ書き込まれていないデータを全て書き込ませます。

参考資料:

`anydbm`モジュール:
  `dbm` 形式のデータベースへの汎用インタフェース。.

`whichdb`モジュール:
  既存のデータベースがどの形式のデータベースか判定する ユーティリティモジュール。.