dbm_store() - データベース・レコードの保管

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

#define _XOPEN_SOURCE_EXTENDED 1
#include <ndbm.h>

int dbm_store(DBM *db, datum key, datum content, int store_mode);

機能説明

dbm_store() 関数は、データベースにレコードを書き込みます。db 引数には、dbm_open() への直前の呼び出しで戻されたデータベース・ハンドルを指定します。key 引数は、プログラムが削除している レコードを示します。key データは、キーを 指す dptr ポインターと、キー長 の dsize を含んでいなければなりません。content 引数は、保管されるデータ・レコード、つまり プログラムが書き込んでいるレコードを記述するデータです。content データには、データを 指す dptr と、データ長の dsize が 含まれます。

store_mode 引数は、dbm_store() が同じキーを 持つ既存のレコードを置き換えるかどうかを制御します。 store_mode 引数には、<ndbm.h> 組み込みファイルに 定義されている以下の記号セットのどちらかを指定できます。
DBM_INSERT
key が既にデータベースに存在する場合 は、keycontent の対を追加しない。key が存在しない場合は、新しい keycontent の対を 追加する。
DBM_REPLACE
key が既に存在する場合は、データベースの keycontent の対を 新しい対に置き換える。key が存在しない場合は、新しい keycontent の対を 追加する。

dbm_store() を呼び出したあと、dbm_firstkey() と dbm_nextkey() によるキーのパススルーの途中で、dbm_firstkey() を呼び出してアプリケーションの位置をリセットする必要があります。そうしないと、同じキーを何度も検索したり、あるいは キーをまったく検索しないといった 予測できない結果が生じることがあります。

データベースに保管することのできるレコード数 は、.dir および .pag ファイルが使用できるファイル・スペース と、基礎的なキー・ハッシュの制限を受けます。複数のキーが同一の 32 ビットのハッシュ値にハッシュすると、そのハッシュ値用のキーの数は、1024 バイトの 単一論理ブロックに保管することのできるデータの 大きさ (キー・サイズに内容のサイズとオーバーヘッドを 加えたもの) に制限されます。

z/OS®UNIX サービスの特殊な動作: マルチスレッド環境では、dbm_store() 命令によりデータベースに加えられた変更は、データベース・ハンドルを使用するすべてのスレッドに影響します。このため、dbm_nextkey() を使用する前に dbm_firstkey() 関数を使用して、その他のすべてのスレッドの位置もリセットする必要があります。別のスレッドによって、同一 key に対して直前に実行された dbm_fetch() 命令のバッファー・ポインターは、引き続き正しく直前のデータを指しています。dbm_store() 命令は、これには影響しません。dbm_fetch() や dbm_delete() などのほかのすべての命令は、新しい keycontent の対に自動的にアクセスします。

戻り値

正常に実行された場合、dbm_store() は 0 を戻します。DBM_INSERT を指定したときに key が既に存在していると、dbm_store() は 1 を戻します。

正常に実行されなかった場合、dbm_store() は -1 を戻して、errno を次のいずれかの値に設定します。また、データベース・エラー標識を設定する場合もあります。
エラー・コード
説明
EFBIG
新規ブロックを書き込もうとして、シーク / 書き込み 命令が失敗しました。この errno は、この関数用に X/Open によって 記述された errno のセットの一部ではありません。key が別の値にハッシュするときに、ほかの keycontent の対を保管できる 可能性があります。
ENOSPC
keycontent とブロックの オーバーヘッドの合計が 1 つのブロックに収まりません。この errno は、この関数用に X/Open によって 記述された errno のセットの一部ではありません。keycontent の基礎的なデータ長 の合計は、1012 バイト以下の長さにする必要があります。

関連情報