dc_dam_write
形式
ANSI C ,C++の形式
#include <dcdam.h> int dc_dam_write(int damfd,struct DC_DAMKEY *keyptr,int keyno, char *bufadr,int bufsize,DCLONG flags)
K&R版 C の形式
#include <dcdam.h> int dc_dam_write(damfd,keyptr,keyno,bufadr,bufsize,flags) int damfd; struct DC_DAMKEY *keyptr; int keyno; char *bufadr; int bufsize; DCLONG flags;
機能
指定したブロックを出力します。ブロックを出力するタイミングを次に示します。
-
回復対象のDAMファイルの場合
更新したデータはDAMサービス専用共用メモリ上に蓄えておき,トランザクションがコミットしたときに,実際にファイルを更新します。ただし,ディファード出力を指定したDAMファイルの場合は,トランザクションのコミットとは非同期に出力されます。
-
回復対象外のDAMファイルの場合
dc_dam_write関数がリターンした時点で,DAMファイルが出力されます。
複数のブロックを一括して出力要求したときに,指定したブロックのうちで一つでもエラーになると,処理を中断してエラーリターンします。このときはブロックを出力しません。
論理ファイルのブロックを出力するときは,dc_dam_open関数で返されたリターン値のファイル記述子を設定します。
UAPで値を設定する引数
●damfd
ブロックを出力するファイルの,ファイル記述子を設定します。
●keyptr
出力するブロックの範囲を示す構造体(DAMキー)のアドレスを設定します。構造体にはブロックの範囲を,先頭の相対ブロック番号と最後の相対ブロック番号で設定します。構造体の形式は次のとおりです。
struct DC_DAMKEY { int fstblkno; int endblkno; };
-
fstblkno
出力するブロックの先頭の相対ブロック番号を設定します。
-
endblkno
出力するブロックの,最後の相対ブロック番号を設定します。0を設定した場合は,fstblknoで設定した相対ブロック番号のブロックだけを出力します。
●keyno
keyptrで設定する構造体の数(構造体の配列数)を設定します。
●bufadr
更新データのアドレスを設定します。
●bufsize
出力データ長を(出力ブロック長×出力ブロック数)以上の値で設定します。設定できる範囲は504〜2147483647です。
●flags
排他エラーが起こったとき,排他解除待ちをするかどうかを設定します。
DCDAM_WAIT… 排他解除待ちをします。
DCDAM_NOWAIT… 待たないで,エラーリターンします。
DCNOFLAGS… dc_dam_open関数のflagsに設定した値に従います。
DCNOFLAGSを設定した場合は次のようになります。
-
dc_dam_open関数でDCDAM_WAITを設定していれば,排他解除待ち
-
dc_dam_open関数でDCDAM_NOWAITを設定,または省略している場合はエラーリターン
damfdに設定したファイル記述子のdc_dam_open関数が,排他種別にファイル排他を設定していた場合は,ここに設定する値は意味を持ちません。
リターン値
リターン値 |
リターン値(数値) |
意味 |
---|---|---|
DC_OK |
0 |
すべてのブロック出力は正常に終了しました。 |
DCDAMER_PROTO |
-1600 |
dc_rpc_open関数を呼び出していません。 |
トランザクションの範囲外で,dc_dam_write関数を呼び出しています(回復対象のDAMファイルにアクセスした場合だけリターンされます)。 |
||
ユーザサービス定義のatomic_updateオペランドの指定が'N'になっています(回復対象のDAMファイルにアクセスした場合だけリターンされます)。 |
||
dc_dam_start関数を呼び出していません(回復対象外のDAMファイルにアクセスした場合だけリターンされます)。 |
||
次に示すように,UAPを正しくリンケージしていません。
|
||
DCDAMER_EXCER |
-1602 |
排他エラーが起こりました。 |
DCDAMER_BADF |
-1603 |
damfdに設定したファイル記述子は正常にオープンして得られたファイル記述子ではありません。 |
DAMファイルをオープンしていません。 |
||
DCDAMER_BUFER |
-1604 |
出力データ長(出力ブロック長×出力ブロック数)が短過ぎます。 |
出力データ長に設定した値は,設定できる範囲を超えています。 |
||
DCDAMER_SEQER |
-1605 |
関数を呼び出す順序が間違っています。 |
DCDAMER_BNOER |
-1606 |
相対ブロック番号が間違っています。 |
DCDAMER_NOMEM |
-1607 |
メモリが不足しました。 |
DCDAMER_PARAM_KEYNO |
-1609 |
keynoに1より小さい値を設定しています。 |
DCDAMER_PARAM_FLAGS |
-1611 |
flagsに設定した値が間違っています。 |
DCDAMER_JNLOV |
-1613 |
ブロック更新した回数※が,DAMサービス定義の1トランザクションで更新できる最大ブロック数に指定した値を超えました(回復対象のDAMファイルにアクセスした場合だけリターンされます)。 |
DCDAMER_IOER |
-1620 |
出力エラーが起こりました(回復対象外のDAMファイルにアクセスした場合だけリターンされます)。 |
DCDAMER_LHOLD |
-1621 |
damfdに設定したファイルが,論理閉塞されています。 |
DCDAMER_OHOLD |
-1622 |
damfdに設定したファイルが,障害閉塞されています。 |
DCDAMER_ACCESS |
-1628 |
アクセスしようとしたDAMファイルは,セキュリティ機能で保護されています。dc_dam_write関数を呼び出したUAPには,アクセス権限がありません。 |
DCDAMER_TMERR |
-1629 |
トランザクションサービスでエラーが起こりました(回復対象のDAMファイルにアクセスした場合だけリターンされます)。 |
DCDAMER_BUFOV |
-1641 |
出力データ長(出力ブロック長×出力ブロック数)が長過ぎます。 |
DCDAMER_DLOCK |
-1642 |
デッドロックが起こりました。 |
DCDAMER_TIMOUT |
-1643 |
ロックサービス定義で指定した待ち時間のタイムアウトのため,資源を確保できませんでした。 |
DCDAMER_LCKOV |
-1645 |
最大同時排他要求数を超えて,排他を要求しています。 |
DCDAMER_ACSOV |
-1648 |
アクセスできる最大ブロック数※を超えました(回復対象外のDAMファイルにアクセスした場合だけリターンされます)。 |
注意事項
リターン値DCDAMER_JNLOV,DCDAMER_ACSOVがリターンした場合,次のどれかの方法で処置してください。
-
DAMサービス定義のdam_update_blockオペランドの指定値を大きくする。
-
DAMサービス定義のdam_update_block_overオペランドにerrorを指定してDCDAMER_JNLOVとなった場合,dam_update_block_overオペランドの指定をflushに変更する。
-
出力するブロック数は,DAMサービス定義のdam_update_blockオペランドの指定値以下にする。
-
dc_dam_rewrite関数で更新されていないブロックがある場合は,dc_dam_write関数を呼び出す前に更新する。
定義を変更する場合は,マニュアル「OpenTP1 システム定義」のDAMサービス定義のdam_update_blockオペランド,およびdam_update_block_overオペランドを参照し,注意事項を確認してください。