標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
#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 が 含まれます。
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() などのほかのすべての命令は、新しい key と content の対に自動的にアクセスします。
正常に実行された場合、dbm_store() は 0 を戻します。DBM_INSERT を指定したときに key が既に存在していると、dbm_store() は 1 を戻します。