DBM(3X) — UNIX Programmer’s Manual
名称
dbminit, fetch, store, delete, firstkey, nextkey − データベースのサブルーチン
形式
#include <dbm.h>
typedef struct {
char ∗dptr;
int dsize;
} datum;
dbminit(file)
char ∗file;
datum fetch(key)
datum key;
store(key, content)
datum key, content;
delete(key)
datum key;
datum firstkey()
datum nextkey(key)
datum key;
解説
注: dbm ライブラリは ndbm(3) の下位に位置しており、 ndbm を使用して実現されます。 これらの関数は、 データベース内の (key/content) のペアを 保守します。 この関数は非常に大きなデータベース(10億ブロック)を扱い、 1回ないし 2回のファイルシステムアクセスで、 キー付き要素をアクセスします。 これらの関数は、 ローダオプション −ldbm を用いることにより使用できます。
keys と contents は、 datum の typedef によって記述されています。 datum は、 dptr が指している dsize バイトの文字列を指定します。 一般のASCII文字列に加えて、 任意の 2進数データが指定可能です。 データベースは 2つのファイルに収められます。 1つのファイルはビットマップを含むディレクトリで、 サフィックスとして‘.dir’を 持ちます。 2つ目のファイルは、 すべてのデータを含み、 サフィックスとして‘.pag’を持ちます。
データベースのアクセスが可能になる前に、 dbminit でオープンする必要があります。 この呼び出し時には、 file.dir と file.pag のファイルが存在していなければなりません。 (長さゼロの‘.dir’ファイルと‘.pag’ファイルを 作成することによって、 空のデータベースが作成されます)。
一度オープンすると、 キーに記憶されたデータは、 fetch によってアクセスされ、 store によってデータはキーに置かれます。 キー(およびそれに対応する内容)は、 delete によって削除されます。 データベース内のすべてのキーの線形パスは、 firstkey と nextkey を使用して、(見かけ上はほとんど)ランダム順に作成できます。 firstkey はデータベース内の第1キーを返します。 任意のキーについては、 nextkey はデータベース内の次のキーを返します。 次のコードは、 データベースをすべて"なめる"ことになります。
for (key = firstkey(); key.dptr != NULL; key = nextkey(key))
診断
int を返す関数はすべて、 負の値とともにエラーを示します。 ゼロが返るのは正常です。 datum を返すルーチンは、 dptr がナル(0)の場合エラーを表します。
関連事項
バグ
‘.pag’ファイルには穴(holes)がありますので、 外見のサイズは中身に含まれるサイズの約 4 倍になります。 古いUNIXシステムでは、 操作するときにこうした穴に対する実ファイルブロックを 作成できます。 こうしたファイルは穴を埋めなければ、 通常の方法 (cp, cat, tp, tar, ar) ではコピーできません。
この中のサブルーチンが返す dptr ポインタは、 後続の呼び出しによって変更されるstatic領域を指しています。
キー/内容の1つのペアのサイズの合計が、 内部ブロックサイズを越えてはなりません (現在のところ、1024 バイト)。 さらに、 ハッシュ作業を行うキー/内容のペアはすべて、 単一ブロック上に納まらなければなりません。 ディスクブロックが、分離できないデータで埋まった場合には、 store がエラーを返します。
delete はファイル空間を再使用できるようにはしますが、 物理的に埋めるわけではありません。
firstkey と nextkey が表すキー順序は、 ハッシュ関数に依存します。
NEWS-OSRelease 3.3