Hitachi

OpenTP1 Version 7 分散トランザクション処理機能 OpenTP1 プログラム作成リファレンス C言語編


dc_tam_read

〈このページの構成〉

名称

TAMテーブルからレコードの入力

形式

ANSI C,C++の形式

#include <dctam.h>
int  dc_tam_read(DCLONG tblid,struct DC_TAMKEY *keyadr,
                 int keyno,
                 char *bufadr,int bufsize,DCLONG flags)

K&R版 C の形式

#include <dctam.h>
int dc_tam_read(tblid,keyadr,keyno,bufadr,bufsize,flags)
DCLONG           tblid;
struct DC_TAMKEY *keyadr;
int              keyno;
char             *bufadr;
int              bufsize;
DCLONG           flags;

機能

flagsに設定した検索種別に従って,TAMテーブル上のレコードを参照または更新の目的で入力します。検索種別とインデクス種別の関係を次の表に示します。

表2‒3 検索種別とインデクス種別の関係

検索種別

検索処理の概要

インデクス種別:ハッシュ

インデクス種別:ツリー

'キー値='検索

設定したキー値を持つレコードを検索します。

設定したキー値を持つレコードがない場合はエラーリターンします。

設定したキー値を持つレコードを検索します。

設定したキー値を持つレコードがない場合はエラーリターンします。

'キー値<='検索

エラーリターンします。

設定したキー値以上のキー値を持つレコードを検索します。

'キー値<'検索

エラーリターンします。

設定したキー値より大きいキー値を持つレコードを検索します。

'キー値>='検索

エラーリターンします。

設定したキー値以下のキー値を持つレコードを検索します。

'キー値>'検索

エラーリターンします。

設定したキー値より小さいキー値を持つレコードを検索します。

先頭検索

キー値に対応してハッシングをした先頭レコードを検索します。keyadrに設定したキー値は無視します。

エラーリターンします。

NEXT検索

キー値に対応してハッシングをした,次のレコードを検索します。

エラーリターンします。

注※

インデクス種別がハッシュで,TAMテーブルファイルの初期作成時に,データ部にキー値を付けている(tamcreコマンドに-sオプションを設定していない)場合,先頭検索とNEXT検索を使って,TAMテーブル上の全レコードを検索できます。

参照目的の入力で排他を掛ける場合,参照排他でテーブル排他とレコード排他を確保します。レコード排他でオープンしたTAMテーブルを更新目的で入力する場合は,参照排他でテーブル排他を確保し,更新排他でレコード排他を確保します。

dc_tam_read関数がエラーリターンした場合は,この関数内で設定した資源はすべて解放して,関数を呼び出す前の状態に戻ります。ただし,関数を呼び出す前に参照排他で確保されていたレコードを更新目的で入力した場合は,更新排他となり参照排他には戻りません。また,エラーリターンした場合には,バッファの内容は保証できません。

複数のレコードを設定して入力する場合,それらのレコードのうち一つでもエラーが発生したときは,この関数で設定した全レコードの処理をエラーとします。

UAPで値を設定する引数

●tblid

レコードを入力するTAMテーブルの,テーブル記述子を設定します。テーブル記述子はdc_tam_open関数で返された値です。

●keyadr

レコードを検索するための,キー値のアドレスを持つ構造体のアドレスを設定します。構造体の形式は次のとおりです。

struct DC_TAMKEY {
                  char  *keyname;
                  };
  • keyname

    キー値のアドレスを設定します。キー値は入力するレコードのキー領域の長さで設定します。

●keyno

要求レコード数(keyadrで設定する構造体の数)を設定します。

●bufadr

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

●bufsize

レコードを入力するバッファの長さを設定します。バッファ長は(レコード長×要求レコード数)以上にします。

●flags

レコードの検索種別,アクセス種別,参照目的の排他のときの排他要否種別を設定します。また,排他を掛ける場合に,資源の競合が起こったときの排他解除待ち種別を設定します。

{フラグ1}|{DCTAM_REFERENCE〔|{DCTAM_EXCLUSIVE|DCTAM_NOEXCLUSIVE}〕|DCTAM_MODIFY}〔|{DCTAM_WAIT|DCTAM_NOWAIT}〕
  • フラグ1

    フラグ1には,次のレコードの検索種別のうちどれか一つを指定してください。

    レコードの検索種別の設定は省略できません。また,検索種別は重複して設定できません。

    DCTAM_EQLSRC…'キー値='を検索する(ハッシュ,ツリー)。

    DCTAM_GRTEQLSRC…'キー値<='を検索する(ツリー)。

    DCTAM_GRTSRC…'キー値<'を検索する(ツリー)。

    DCTAM_LSSEQLSRC…'キー値>='を検索する(ツリー)。

    DCTAM_LSSSRC…'キー値>'を検索する(ツリー)。

    DCTAM_FIRSTSRC…先頭から検索する(ハッシュ)。

    DCTAM_NEXTSRC…設定したキー値の,次のレコードから検索する(ハッシュ)。

  • フラグ2

    レコードのアクセス種別の設定も省略できません。また,アクセス種別も重複して設定できません。

    DCTAM_REFERENCE…参照目的の排他

    DCTAM_MODIFY…更新目的の排他

  • フラグ3

    参照目的の排他の場合は,排他するかどうかを設定します。排他要否種別は重複して設定できません。このフラグの設定を省略した場合は,DCTAM_NOEXCLUSIVEが仮定されます。

    DCTAM_EXCLUSIVE…排他します。

    DCTAM_NOEXCLUSIVE…排他をしません。

    排他しないでdc_tam_read 関数を呼び出した場合,dc_tam_read関数の処理中にほかのUAPから該当するTAMレコードが更新されることがあります。この場合,dc_tam_read関数で入力するレコードの内容は,ほかのUAPでの更新処理の状態(コミット処理が完了するタイミング)に依存します。したがって,UAP間でデータの整合性をとるためには,必ずDCTAM_EXCLUSIVEを指定してください。DCTAM_NOEXCLUSIVEは,参照型のTAMテーブルの場合や,同一のTAMレコードに対して業務処理全体として参照と更新が競合する可能性がない場合に使用します。

  • フラグ4

    排他解除待ち種別も重複して設定できません。このフラグの設定を省略した場合は,DCTAM_NOWAITが仮定されます。

    DCTAM_WAIT…排他解除待ちをします。

    DCTAM_NOWAIT…待たないで,エラーリターンします。

flagsに設定する値と,設定内容について次に示します。

フラグ1

フラグ2

フラグ3※1

フラグ4※2

flagsの設定内容

EQLSRC

GRTEQLSRC

GRTSRC

LSSEQLSRC

LSSSRC

FIRSTSRC

NEXTSRC

REFERENCE

EXCLUSIVE

WAIT

参照目的,排他あり,

排他エラー時は解除待ち

NOWAIT

参照目的,排他あり,

排他エラー時はエラーリターン

NOEXCLUSIVE

×

参照目的,排他なし

MODIFY

WAIT

更新目的,

排他エラー時は解除待ち

NOWAIT

更新目的,

排他エラー時はエラーリターン

(凡例)

×:設定できません。

−:常にEXCLUSIVEを設定します。NOEXCLUSIVEは設定できません。

注※1

省略した場合は,NOEXCLUSIVEが仮定されます。

注※2

省略した場合は,NOWAITが仮定されます。

リターン値

リターン値

リターン値(数値)

意味

DC_OK

0

TAMテーブルのレコードを正常に入力しました。

DCTAMER_PARAM_TID

-1700

tblidに設定したテーブル記述子が間違っています。

DCTAMER_PARAM_KEY

-1702

keyadrに設定したキー値が間違っています。

DCTAMER_PARAM_KNO

-1703

keynoに設定した値が間違っています。

DCTAMER_PARAM_BFA

-1704

bufadrに設定した値が間違っています。

DCTAMER_PARAM_BFS

-1705

bufsizeに設定したバッファ長が短過ぎます。

DCTAMER_PARAM_FLG

-1708

flagsに設定した値が間違っています。

DCTAMER_NOTTAM

-1709

tblidに設定したテーブルはTAMテーブルではありません。

DCTAMER_TAMEND

-1720

TAMサービスが終了中です。

DCTAMER_PROTO

-1721

TAMテーブルへアクセスする順序が間違っています。

UAPにリンケージしているトランザクション制御用オブジェクトファイルのリソースマネジャ登録が間違っています。

または,UAPにトランザクション制御用オブジェクトファイルをリンケージしていません。

関数を呼び出したUAPのユーザサービス定義に,トランザクション属性なし(atomic_update=N)を指定しています。

DCTAMER_RMTBL

-1723

TAMテーブルが削除されています。

DCTAMER_NOLOAD

-1724

TAMテーブルがロードされていません。

DCTAMER_NOOPEN

-1726

TAMテーブルがオープン状態ではありません。

DCTAMER_LOGHLD

-1727

TAMテーブルが論理閉塞状態です。

DCTAMER_OBSHLD

-1728

TAMテーブルが障害閉塞状態です。

DCTAMER_IDXTYP

-1729

TAMテーブルファイルの初期作成で設定したTAMテーブルのインデクス種別では実行できません。

DCTAMER_ACSATL

-1730

TAMサービス定義で設定したTAMテーブルのアクセス形態では実行できません。

DCTAMER_NOREC

-1731

flagsに設定した検索条件を満たすレコードがありません。

DCTAMER_LOCK

-1736

排他エラーが起こりました。flagsにDCTAM_WAITを設定した場合,ロックサービス定義で指定した待ち時間のタイムアウトのため,資源を確保できませんでした。

DCTAMER_DLOCK

-1737

デッドロックが起こりました。

DCTAMER_TBLVR

-1760

UAPが,現在稼働しているTAMテーブルでは動作できないバージョンのTAMライブラリと結合されています。

DCTAMER_FLSVR

-1761

UAPが,現在稼働しているOpenTP1ファイルサービスでは動作できないバージョンのTAMライブラリと結合されています。

DCTAMER_RECOBS

-1764

レコードが破壊されています。

DCTAMER_TRNNUM

-1765

TAMサービスで管理できるトランザクション数を超えました。

DCTAMER_OPENNUM

-1766

キャラクタ型スペシャルファイルのオープン数の制限値を超えました。

DCTAMER_ACCESSS

-1767

スペシャルファイルに対するアクセス権がありません。

DCTAMER_ACCESSF

-1768

TAMファイルに対するアクセス権がありません。

DCTAMER_MEMORY

-1769

メモリが不足しました。

DCTAMER_IO

-1770

入出力エラーが起こりました。

DCTAMER_TMERR

-1771

トランザクションサービスでエラーが起こりました。

DCTAMER_ACCESS

-1773

アクセスしようとしたTAMファイルは,セキュリティ機能で保護されています。dc_tam_read関数を呼び出したUAPには,アクセス権限がありません。