dc_dam_read

名称

論理ファイルからブロックの入力

形式

ANSI C ,C++の形式

#include <dcdam.h>
int  dc_dam_read(int damfd,struct DC_DAMKEY *keyptr,int keyno,
                char *bufadr,int bufsize,DCLONG flags)

K&R版 C の形式

#include <dcdam.h>
int dc_dam_read(damfd,keyptr,keyno,bufadr,bufsize,flags)
int            damfd;
struct DC_DAMKEY *keyptr;
int            keyno;
char           *bufadr;
int            bufsize;
DCLONG         flags;

機能

指定した論理ファイルから,指定した範囲のブロックを,参照または更新目的で入力します。

論理ファイルのブロックを入力するときは,dc_dam_open関数で返されたリターン値のファイル記述子を設定します。

UAPで値を設定する引数

●damfd

ブロックを入力するファイルの,ファイル記述子を設定します。

●keyptr

参照または更新するブロックの範囲を示す構造体(DAMキー)のアドレスを設定します。構造体にはブロックの範囲を,先頭の相対ブロック番号と最後の相対ブロック番号で設定します。構造体の形式は次のとおりです。

struct DC_DAMKEY {
                 int fstblkno;
                 int endblkno;
                 };

●keyno

keyptrで設定する構造体の数(構造体の配列数)を設定します。

●bufadr

入力バッファのアドレスを設定します。

●bufsize

入力バッファ長を(入力ブロック長 × ブロック数)以上の値で設定します。設定できる範囲は504~2147483647です。

●flags

参照要求か更新要求かの種別を設定します。次の形式で設定します。

{DCDAM_REFERENCE|DCDAM_MODIFY}
〔|{DCDAM_EXCLUSIVE|DCDAM_NOEXCLUSIVE}〕
〔|{DCDAM_WAIT|DCDAM_NOWAIT}〕

どちらも設定しなかった場合は次のようになります。

flagsの値に設定したフラグと,排他の設定内容の対応を次に示します。

フラグ1フラグ21フラグ32flagsの設定内容
REFERENCEEXCLUSIVEWAIT参照目的,排他あり,排他エラー時は解除待ち
NOWAIT参照目的,排他あり,排他エラー時はエラーリターン
NOEXCLUSIVE×参照目的,排他なし3
MODIFY×WAIT更新目的,排他エラー時は解除待ち
NOWAIT更新目的,排他エラー時はエラーリターン
(凡例)
×:設定できません。
注※1
省略した場合は,NOEXCLUSIVEが仮定されます。
注※2
省略した場合は,dc_dam_open関数が設定した排他待ち種別の値に従います。
注※3
回復対象のDAMファイルの場合,トランザクションの範囲でない処理からdc_dam_read関数を呼び出すときは,フラグ1にDCDAM_REFERENCEを設定して,フラグ2にDCDAM_NOEXCLUSIVEを設定または省略したときだけ有効です。これ以外の値を設定してdc_dam_read関数を呼び出した場合は,DCDAMER_PROTOでエラーリターンします。

リターン値

リターン値リターン値(数値)意味
DC_OK0すべてのブロック入力は正常に終了しました。
DCDAMER_PROTO-1600dc_rpc_open関数を呼び出していません。
トランザクションの範囲外で,更新目的の入力,または排他を指定した参照目的の入力をしています(回復対象のDAMファイルにアクセスした場合だけリターンされます)。
ユーザサービス定義のatomic_updateオペランドの指定が'N'になっています(回復対象のDAMファイルにアクセスした場合だけリターンされます)。
dc_dam_start関数を呼び出していません(回復対象外のDAMファイルにアクセスした場合だけリターンされます)。
次に示すように,UAPを正しくリンケージしていません。
  • DAMサービスの関数でTAMファイルにアクセスする場合に使うライブラリ(-ltdam)を,不当にリンケージしています。
  • トランザクション制御用オブジェクトファイルのリソースマネジャ登録が間違っています。
DCDAMER_EXCER-1602排他エラーが起こりました。
DCDAMER_BADF-1603damfdに設定したファイル記述子は正常にオープンして得られたファイル記述子ではありません。
DAMファイルをオープンしていません。
DCDAMER_BUFER-1604すべてのブロックを入力するためには,入力バッファ長に設定した長さは不十分です。
入力バッファ長に設定した値は,設定できる範囲を超えています。
DCDAMER_BNOER-1606相対ブロック番号が間違っています。
DCDAMER_NOMEM-1607メモリが不足しました。
DCDAMER_PARAM_KEYNO-1609keynoに1より小さい値を設定しています。
DCDAMER_PARAM_FLAGS-1611flagsに指定した値が間違っています。
DCDAMER_JNLOV-1613ブロック更新した回数が,DAMサービス定義の1トランザクションで更新できる最大ブロック数に指定した値を超えました(回復対象のDAMファイルにアクセスした場合だけリターンされます)。
DCDAMER_VERSION-1618UAPが,現在稼働しているDAMサービスでは動作できないバージョンのDAMライブラリと結合されています。
DCDAMER_IOER-1620入力エラーが起こりました。
DCDAMER_LHOLD-1621damfdに設定したファイル記述子のファイルが,論理閉塞されています。
DCDAMER_OHOLD-1622damfdに設定したファイル記述子のファイルが,障害閉塞されています。
DCDAMER_ACCESS-1628アクセスしようとしたDAMファイルは,セキュリティ機能で保護されています。dc_dam_read関数を呼び出したUAPには,アクセス権限がありません。
DCDAMER_TMERR-1629トランザクションサービスでエラーが起こりました(回復対象のDAMファイルにアクセスした場合だけリターンされます)。
DCDAMER_DLOCK-1642デッドロックが起こりました。
DCDAMER_TIMOUT-1643ロックサービス定義で指定した待ち時間のタイムアウトのため,資源を確保できませんでした。
DCDAMER_LCKOV-1645最大同時排他要求数を超えて,排他を要求しています。
DCDAMER_ACSOV-1648回復対象外のDAMファイルにアクセスできるブロック数を超えました(回復対象外のDAMファイルにアクセスした場合だけリターンされます)。
注※
詳細については,マニュアル「OpenTP1 システム定義」のDAMサービス定義のdam_update_blockオペランドを参照してください。

注意事項

リターン値DCDAMER_JNLOV,DCDAMER_ACSOVでリターンした場合,次のどれかの方法で処置してください。

定義を変更する場合は,マニュアル「OpenTP1 システム定義」のDAMサービス定義のdam_update_blockオペランド,およびdam_update_block_overオペランドを参照し,注意事項を確認してください。