D. J. Bernstein
Data structures
cdb

cdb-reading ライブラリ・インターフェース

(翻訳作業中です)

概要

You can read records in a constant database from file descriptor fd as follows:
  1. Use cdb_init to place information about fd into a struct cdb variable c.
  2. Carry out any number of searches, as described below.
  3. Use cdb_free to remove any memory map that might have been reserved by cdb_init.
次のようにして、ファイル記述子 fd からコンスタント・データベースのレコードを読むことができます:
  1. fd に関する情報を struct cdb 変数 c に置くために cdb_init を使用します。
  2. 後述するように、たくさん検索を実行します。
  3. cdb_init によって確保されているメモリマップを取り除くために cdb_free を使用します。
Each search works as follows:
  1. Use cdb_find to search for a record under key k. If cdb_find returns 0, the database does not contain that key; stop. If cdb_find returns -1, there was a read error; abort.
  2. Use cdb_datalen to find the number of bytes of data in this record. Allocate a pointer d to a region of memory large enough to hold the data. If not enough memory is available, abort.
  3. Use cdb_read with cdb_datapos to read the data. If cdb_read returns -1, there was a read error; abort.
  4. Do something with the data, and then free the allocated region of memory.
There may be several records under a single key. You can use cdb_findnext to find the next record under this key. 検索は次のように行います:
  1. キー k でレコードを検索するために cdb_find を使用します。 cdb_find が 0 を返せば、データベースにはそのキーは存在せず、終了します。 cdb_find が -1 を返せば、読み取りエラーで中断します。
  2. このレコードのデータのバイト数を見つけるために cdb_datalen を使用します。 データを保持するために十分なメモリ領域へポインタ d を割り当てます。 十分なメモリが得られなければ、中断します。
  3. データを読むために cdb_datapos と共に cdb_read を使用します。 cdb_read が -1 を返せば、読み取りエラーで中断します。
  4. データを処理したら、割り当てたメモリ領域を解放します。
一つのキーで複数のレコードがあってもかまいません。 このキーで次のレコードを見つけるために cdb_findnext を使用できます。

詳細

     #include <cdb.h>

     cdb_init(&c,fd);
     cdb_free(&c);
     result = cdb_read(&c,d,dlen,dpos);

     cdb_findstart(&c,k,klen);
     result = cdb_findnext(&c,k,klen);
     result = cdb_find(&c,k,klen);

     dpos = cdb_datapos(&c);
     dlen = cdb_datalen(&c);

     static struct cdb c;
     int fd;

     char *d;
     unsigned int dlen;
     uint32 dpos;

     char *k;
     unsigned int klen;
     int result;

A struct cdb variable such as c is either unallocated or allocated. If it is allocated, it holds information about a constant database:

c must be initialized to zero, meaning unallocated.

c のような 構造体 cdbの変数はメモリが割り当てられていないか割り当てられているかのどちらかです。 メモリが割り当てられていれば、次の示すコンスタント・データベースについての情報を保持します。

c は 0 で初期化されなければなりません。これはメモリが割り当てられていないことを意味します。

cdb_free unallocates c if c is allocated. Otherwise it leaves c alone. cdb_free does not close fd.

c にメモリが割り当てられていれば、cdb_freec のメモリを解放します。 そうでなければ、c はそのままです。 cdb_freefd を閉じません。

cdb_init allocates c to hold information about a constant database read by descriptor fd. You may call cdb_init repeatedly; if c is already allocated, cdb_init unallocates it first.

cdb_init は記述子 fd によって読み込まれるコンスタント・データベースについての情報を保持するために c にメモリを割り当てます。 cdb_init を繰り返し、呼び出してもかまいません。 c がすでに割り当てられていれば、cdb_init はまずそのメモリを解放します。

cdb_read reads dlen bytes into d from byte position dpos in the database. You must allocate c before calling cdb_read. Normally cdb_read returns 0. If the database file is shorter than dpos+dlen bytes, or if there is a disk read error, cdb_read returns -1, setting errno appropriately.

cdb_read はデータベースのバイト位置 dpos から dlen バイトを d へ読み込みます。 cdb_read を呼び出す前に c のメモリを割り当てなければなりません。 普通、cdb_read は 0 を返します。 データベースファイルが dpos+dlen バイトより小さい、あるいはディスク読み取りエラーが生じたら、cdb_read は -1 を返し、適切な errno を設定します。

cdb_findstart prepares c to search for the first record under key k. You must allocate c before calling cdb_findstart, and you must call cdb_findstart before calling cdb_findnext.

cdb_findstart はキー k で最初のレコードの検索に c を用意します。 cdb_findstart を呼び出す前に c にメモリを割り当てなければなりません。また、cdb_findnext を呼び出す前に cdb_findstart を呼び出さなければなりません。

cdb_findnext looks for the nth record under key k in the database, where n is the number of calls to cdb_findnext after the most recent call to cdb_findstart. If it finds the record, cdb_findnext returns 1; if there are exactly n-1 such records, cdb_findnext returns 0; if there are fewer than n-1 such records, the behavior of cdb_findnext is undefined; if there is a database format error or disk error, cdb_findnext returns -1, setting errno appropriately. Each call to cdb_findnext must use the same k and klen as the call to cdb_findstart.

cdb_findnext はデータベースにおけるキー k を持つ n番目の レコードを検索します。この ncdb_findstart の最近の呼び出し後の cdb_findnext を呼び出す回数です。 レコードが見つかれば cdb_findnext は 1 を返します。 ちょうど n-1 個のレコードがあれば cdb_findnext は 0 を返します。 n-1 個未満のレコードしかなければ cdb_findnext の動作はは定義されません。 データベースの形式エラーもしくはディスクエラーがあれば cdb_findnext は -1 を返し、適切な errno を設定します。 cdb_findnext を呼び出しは、cdb_findstart の呼び出しと同じ kklen を使わなければなりません。

If cdb_findnext returns 1, it arranges for cdb_datapos to return the starting byte position of the data in the record, and for cdb_datalen to return the number of bytes of data in the record. Otherwise the results of cdb_datapos and cdb_datalen are undefined.

cdb_findnext が 1 を返せば、レコードにおけるデータの開始バイト位置を返す cdb_datapos とレコードにおけるデータのバイト数を返す cdb_datalen を用意します。

cdb_find is the same as cdb_findstart followed by cdb_findnext: it finds the first record under key k.

cdb_findcdb_findnext があとに続く cdb_findstart と同じです。キー k で最初のレコードを探します。

Beware that these functions may rely on non-atomic operations on the fd ofile, such as seeking to a particular position and then reading. Do not attempt two simultaneous database reads using a single ofile.

特定の位置をシークしてから呼び出すような fd ofile でのアトミックでない動作にこれらの関数は依存するかも知れないことに気をつけてください。 一つの ofile を使って 二つ同時にデータベースを読むことを試みてはいけません。


訳:滝澤 隆史
Last modified: Sat Mar 18 09:46:12 2000