RECNO(3)

名称
recno - レコード番号データベースへのアクセス手法

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

解説
dbopen() ルーチンは、データベースファイルのライブラリインタフェース ですが、そこでサポートされているファイルフォーマットの 1 つに、 レコード番号ファイルがあります。データベースアクセス手法の一般事項については、 dbopen(3) を参照してください。このマニュアルページでは、 recno の固有事項について 説明します。

レコード番号データ構造は、フラットファイルフォーマットで保存された、 可変長あるいは固定長のレコードで、論理レコード番号でアクセスされます。 レコード番号 5 が存在するということは、レコード 1 からレコード 4 が 存在することになります。レコード番号 1 を削除すると、レコード番号 5 は レコード番号 4 になり、レコード番号 1 の後ろを指していたカーソルは、 1 レコード下にシフトします。

dbopen() で提供される recno へのアクセス手法に固有なデータ構造は、 <db.h> インクルードファイルで以下のように定義されています。

    typedef struct {
    	u_long flags;
    	u_int cachesize;
    	u_int psize;
    	int lorder;
    	size_t reclen;
    	u_char bval;
    	char *bfname;
    } RECNOINFO;

この構造体のエレメントは、以下のように定義されます。

flags
    フラグ値は、以下の値の論理和 ( or ) を取ることで指定されます。

    R_FIXEDLEN
        レコードは固定長で、バイトで区切られていません。 構造体のエレメント reclen がレコードの長さを指定し、構造体のエレメント bval がパッドキャラクタとして使用されます。データベースに挿入された レコードは、 reclen バイトより小さい場合、自動的にパッドされます。

    R_NOKEY
        dbopen() が指定するインタフェースでは、 シーケンシャルレコード検索で、呼び出し側のキーとデータ構造の両方にデータが 入ります。 R_NOKEY フラグを指定すると、 cursor ルーチンがなくてもキー構造に データが入ります。これにより、アプリケーションは、中間に存在するレコード すべてを読み込まずに、ファイルの最後のレコードを取り出せます。

    R_SNAPSHOT
        このフラグは、修正されていないレコードを オリジナルファイルから読み込む代わりに、 dbopen() が呼び出された場合にファイル のスナップショットを取ることを要求します。

cachesize
    メモリキャッシュの最大サイズ (バイト単位) です。この値は 参考程度のもの で、アクセス手法はエラーにならずにこれ以上のメモリを割り 振ります。 cachesize を 0 にすると (サイズを指定しないと)、デフォルトの キャッシュが使用されます。

psize
    recno へのアクセス手法は、レコードのメモリのコピーを btree に 保存します。 この値は、そのツリーのノードで使用されるページのサイズ (バイト単位) です。 psize が 0 である場合は (ページサイズが指定されていない場合は)、 基礎となるファイルシステムの I/O ブロックサイズに従って ページサイズが選択されます。詳細については、 btree(3) を参照してください。

lorder
    保存されているデータベースメタデータの整数のバイトオーダ です。整数のオーダを数値で表現する必要があります。たとえば ビッグエンディアンのばバイトオーダは、4321 の順番になります。 lorder が 0 である場合は、(オーダが指定されていない場合は)、 現行ホストのオーダが使用されます。

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

bval
    可変長レコードの場合は、レコードの終わりをマークする区切り バイトで、固定長レコードの場合は、パッドキャラクタです。値を指定しないと、 可変長レコードの最後は改行 (“\n”) でマークされ、 固定長レコードはスペースでパッドされます。

bfname
    recno アクセス手法は、レコードのメモリのコピーを btree に保存します。 NULL 以外の bfname は、btree ファイルの dbopen() の ファイル名として指定されたかのように、btree ファイルの名前を指定します。

recno へのアクセス手法で使用するキーとデータのペアのデータ部分は、その 他のアクセス手法と同じですが、キーは異なります。キーの data フィールドは、 <db.h> インクルードファイルで定義された、タイプ recno_t のメモリ位置を指す ポインタでなければなりません。通常の場合、このタイプは、システムで 使用できる最大の符号なし整数タイプです。キーの size フィールドは、そのタイプのサイズである必要があります。

基礎となる recno アクセス手法ファイルでは、メタデータを 関連付けられないので、デフォルト値に対する変更内容 (たとえばレコードの 固定長やバイト区切り値) は、ファイルを開くたびに明確に指定する 必要があります。

dbopen() が指定するインタフェースでは、 put インタフェースを使用して 新しいレコードを作成すると、レコード番号が、現在のデータベースの最大 レコードより 1 以上大きい場合、複数の空のレコードが作成されます。

エラー
recno アクセス手法ルーチンがエラーになると、ライブラリルーチン dbopen(3) に指定されたエラーか以下のエラーに 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.

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