RECNO(3)

名前
recno - レコード番号データベースへのアクセスメソッド

書式
#include <sys/types.h>
#include <db.h>

説明
大事な注意: このページは、バージョン 2.1 までの glibc が提供するインターフェースに ついて説明している。バージョン 2.2 以降の glibc では、もはやこれらの インターフェースは提供されていない。おそらく、このページではなく、 libdb ライブラリが提供する API をお探しなのだろう。

ルーチン dbopen(3) はデータベースファイルに対するライブラリインターフェースである。 サポートされているファイルフォーマットの一つに、 レコード番号ファイル (record number file: recno file) がある。 データベースへのアクセスメソッドに関する一般的な記述は dbopen(3), に書かれている。 このマニュアルページでは recno 特有の情報についてのみ記述する。

レコード番号データ構造は、フラットなファイル形式に格納された 可変長/固定長レコードからなり、論理レコード番号でアクセスされる。 レコード番号 5 があれば、レコード番号 1 から 4 も存在する。 レコード番号 1 を削除すると、レコード番号 5 は 4 に付け替えられ、 カーソルも移動する。レコード番号 1 以降のものは一つ繰り上がるわけである。

dbopen(3) で使う recno アクセスメソッドに特有のデータ構造体は、 <db.h> インクルードファイルで次のように定義されている。

    typedef struct {
        unsigned long flags;
        unsigned int  cachesize;
        unsigned int  psize;
        int           lorder;
        size_t        reclen;
        unsigned char bval;
        char         *bfname;
    } RECNOINFO;

この構造体の要素を以下に示す。

flags
    flags の値は以下の値の論理和で指定される。

    R_FIXEDLEN
        レコード長が固定であり、バイト区切りではない。 構造体の要素 reclen はレコードの長さを指定する。また、要素 bval は埋め文字 (pad character) を指定する。 データベースに入れられたレコードの内 reclen バイトに満たないものでは、残りの部分に埋め文字が自動的に入る。

    R_NOKEY
        dbopen(3) で指定されたインターフェイスでは、シーケンシャルなレコード取得は 呼び出しキーとデータ構造体の両方を埋めていく。 R_NOKEY フラグが指定されていると、キー構造体を埋めるのに cursor ルーチンを必要としない。 これを用いれば、アプリケーションがファイルの終りの方を取得する際に、 その途中のレコードを読まなくても済む事になる。

    R_SNAPSHOT
        このフラグを指定すると、 dbopen(3) の呼び出しの際、 オリジナルファイルから変更されていないレコードを読む代わりに、 ファイルの snapshot を用いる。

cachesize
    想定されるメモリーキャッシュの最大サイズ (バイト単位)。 この値は あくまで 参考であり、アクセスメソッドはこの値を越えたメモリーの 割り当てに成功することもある。 cachesize が 0 (あるいは指定されていない) の場合、デフォルトのキャッシュが使われる。

psize
    recno アクセスメソッドは、自身のレコードのコピーをメモリー内部に btree で保存している。 この値は、その btree 中のノードに対して用いられる ページサイズ (バイト単位) である。 psize が 0 (あるいは指定されていない) の場合、 ファイルシステムの I/O ブロックサイズを基にして ページサイズが決められる。 詳細は btree(3) を参照。

lorder
    データベースに格納されているメタデータの整数値のバイトオーダー。 この数字は、順序を整数で表したものである。 例えばビッグエンディアンなら、この数値は 4,321 となる。 lorder が 0 (指定されていない) の場合、現在のホスト で使われているバイトオーダーが使われる。

reclen
    固定レコード長の長さ。

bval
    可変レコード長において、 レコードの終りを示す区切りバイト (区切り文字) である。 固定レコード長では埋め文字として使われる。 値が指定されていないと、 可変レコード長のレコードの終りには改行 ("\n") が使われる。 固定レコード長のレコードは空白 (space) で埋められる。

bfname
    recno アクセスメソッドは、 自身のレコードのコピーをメモリー内部で btree に保存している。 bfname が NULL でない場合、これは btree ファイル名 (btree ファイルを dbopen(3) する時に指定するファイル名) を指定する。

recno アクセスメソッドで使われるキー/データ対のデータ部分は、 他のアクセスメソッドと同じである。 しかしキーは異なっている。 キーの data フィールドは recno_t 型の、メモリー位置へのポインターでなければならない。 recno_t は <db.h> インクルードファイルで定義されている。 この型は通常、その実装で利用可能な最大の符号無し整数である。 キーの size フィールドはその型のサイズとなる。

recno アクセスメソッドのファイルに関連づけられる メタデータは存在できないから、 デフォルト値 (固定レコード長やセパレータ文字など) に対する変更はファイルを開く毎に明示的に指定しなければならない。

dbopen(3) で指定されたインターフェイスでは、 put インターフェイスを使って新しいレコードを作成するときに、 指定したレコード番号がデータベース中に存在している最大レコード番号より 一つ以上大きいと、 空のレコードが同時にできてしまう。

エラー
recno アクセスメソッドルーチンは失敗すると dbopen(3) で指定されているエラーに応じた errno か、 あるいは以下に示す errno をセットする。

EINVAL
    固定長データベースにレコードを追加するとき、データが長すぎた。

バグ
バイトオーダーとしてはビッグエンディアンとリトルエンディアンのみが サポートされている。

関連項目
btree(3), dbopen(3), hash(3), mpool(3)

Document Processing in a Relational Database System, Michael Stonebraker, Heidi Stettner, Joseph Kalash, Antonin Guttman, Nadene Lynn, Memorandum No. UCB/ERL M82/32, May 1982.

この文書について
この man ページは Linux man-pages プロジェクトのリリース 5.10 の一部である。プロジェクトの説明とバグ報告に関する情報は https://www.kernel.org/doc/man-pages/ に書かれている。