MC コマンド(複数コマンド発行)

このドキュメントでは、次のトピックについて説明します。


機能および使用

MC コマンドは、Adabas データベースとアプリケーションプログラムの間の処理間コミュニケーションを削減するために使用します。MC コマンドには、Adabas コールインターフェイスにおける追加機能はありません。MC コマンドは、読み込みコマンドのマルチフェッチの動作を一般化するものです。この一般化は、BT、CL、OP、MC を除く、任意の Adabas コマンドのシーケンスに適用されます。

注意:
MC コマンドは、ACB インターフェイスによってのみサポートされ、ACBX インターフェイスではサポートされません

このような順の各 Adabas コマンドは、MC コマンドの対応するバッファに渡される各コマンドのコマンドバッファおよびコントロールブロックで表します。コントロールブロックはレコードバッファの先頭に渡されます。異なる Adabas コマンドの数は cq_isn_quantity に指定しなければなりません。

MC コマンドの Adabas コマンドの順は ET コマンドで終了できます。ET コマンドは、1 つの MC コマンドにつき 1 つだけ許可され、常に最後のコマンドでなければなりません。ET コマンドが最後のコマンドでない場合は、レスポンスコード 22 で拒否されます。

サブコマンド処理時に 0 より大きいレスポンスコードが発生すると、そのサブコマンドの実行は直ちに中断します。ただし、オープントランザクションはバックアウトされません。MC コマンドはレスポンスコード 16 を返し、アディション 2 に中断されたサブコマンドのコントロールブロックのポインタを与えます。

コントロールブロック

Field フォーマット  
コールタイプ B F/U
予約(内部使用)   -/-
コマンドコード A F/U
File Number B F/U (1)
Response Code B F/A (1)
ISN 数 B F/U
フォーマットバッファ長(ACB のみ) B F/U
レコードバッファ長(ACB のみ) B F/U
サーチバッファ長(ACB のみ) B F/U
バリューバッファ長(ACB のみ) B F/U
ISN バッファ長(ACB のみ) B F/U
コマンドオプション 2 A F/U
アディション 2 A、B -/A
コマンドタイム B -/A
ユーザーエリア   F/U

バッファエリア

バッファ  
フォーマットバッファ F/U
レコードバッファ F/A
サーチバッファ F/U
バリューバッファ F/U
ISN バッファ F/A
A Adabas によって設定
F ユーザーによって設定
U Adabas コール後も変更なし
- 使用しません

(1)このフィールドの意味は、Call タイプに指定された値によって異なります。詳細については、「Adabas の呼び出し」の「コントロールブロック」を参照してください。

コントロールブロック

コマンドコード

MC

Response Code

Adabasは このフィールドに、コマンドのレスポンスコードを返します。サブコールが 0 以外のレスポンスコードで終了した場合は、Adabas がこのフィールドにレスポンスコード 16 を返し、これ以降のサブコマンドの処理を停止します。

ISN 数

MC コマンドから渡されたサブコマンドの数。値 0 は、何もすることがないことを意味します。

フォーマットバッファ長(ACB のみ)

フォーマットバッファを参照しているサブコマンドがない場合は、この長さを 0 にセットできます。

レコードバッファ長(ACB のみ)

このフィールドには、レコードバッファ長を指定します。ISN 数が 0 でない場合は、この長さを設定する必要があります。指定する長さは、必要なレコードバッファのエントリとコントロールブロックのすべてを収容するだけの大きさでなければいけません。

サーチバッファ長(ACB のみ)

サーチバッファを参照しているサブコマンドがない場合は、この長さを 0 にセットできます。

バリューバッファ長(ACB のみ)

バリューバッファを参照しているサブコマンドがない場合は、この長さを 0 にセットできます。

ISN バッファ長(ACB のみ)

ISN バッファを参照しているサブコマンドがない場合は、この長さを 0 にセットできます。

コマンドオプション 2

このフィールドに S(SHORT)を指定すると、サブコマンド処理時にエラーが起こらない場合に、MC コマンドのコントロールブロックだけが返ることを示します。

アディション 2

レスポンスコード 16 が返ると、次の情報がこのフィールドに返ります。

  • 先頭 2 バイトには、0 以外のレスポンスコードを受け取るために、最初のサブコールのシーケンス番号が入ります。

  • 第 3 バイトと第 4 バイトにはレスポンスコードが起きたレコードバッファにあるコントロールブロックのオフセットのバイト数が入ります。

フォーマットバッファ

フォーマットバッファには、バッファヘッダー(「処理に関する考慮事項」の「コマンドバッファ」を参照)およびサブコマンドのフォーマットバッファ(複数可)が含まれます。フォーマットバッファを参照するサブコマンドがない場合は、指定する必要はありません。

レコードバッファ

レコードバッファには、最初にすべてのサブコマンドのコントロールブロックが含まれ、次にサブコマンドのレコードバッファがバッファヘッダーに含まれます。

サーチバッファ

サーチバッファには、バッファヘッダー(「処理に関する考慮事項」の「コマンドバッファ」を参照)およびサブコマンドのサーチバッファ(複数可)が含まれます。サーチバッファを参照するサブコマンドがない場合は、指定する必要はありません。

バリューバッファ

バリューバッファには、バッファヘッダー(「処理に関する考慮事項」の「コマンドバッファ」を参照)およびサブコマンドのバリューバッファ(複数可)が含まれます。バリューバッファを参照するサブコマンドがない場合は、指定する必要はありません。

ISN バッファ

ISN バッファには、バッファヘッダー(「処理に関する考慮事項」の「コマンドバッファ」を参照)およびサブコマンドの ISN バッファ(複数可)が含まれます。ISN バッファを参照するサブコマンドがない場合は、指定する必要はありません。

処理に関する考慮事項

コマンドバッファ

数個のサブコマンドのコマンドバッファは、MC コマンドの対応するコマンドバッファ内に渡されます。このため、バッファ内で、複数のエントリが存在することができます。各バッファは 2 エレメント構造(オフセット 0)で開始しなければなりません。この構造体は 2 つの 2 バイトのオフセットを含み、これらをバッファヘッダーと呼びます。バッファヘッダーはバッファに何があるかを表します。バッファには複数のコマンドバッファ、または全サブコマンドが使用するグローバルバッファを 1 つだけ入れることができます。指定したすべてのオフセットは、対応するコマンドバッファの先頭に関連しています。

バッファヘッダーに対する C の定義:

struct CmdBufHd
{
     unsigned short  GloBuf;     /* Offset to global buffer used by all subcommands */
     unsigned short  StartOff;   /* Offset to an array of buffer start
                                    offsets */

}

バッファヘッダーのオフセットを両方とも設定すると、対応する MC コマンドはレスポンス 146 で拒否されます。

例:

MC コマンドのフォーマットバッファに、全サブコマンドに共通のフォーマットバッファが含まれる場合は、バッファヘッダーの GloBuf オフセットが共通のフォーマットバッファを指さなければならず、StartOff オフセットは 0 でなければなりません。

graphics/mc1.png

ただし、バッファには異なる複数のフォーマットバッファが含まれてもかまいません。この場合、バッファヘッダーには、異なるフォーマットバッファへの開始オフセットが含まれる、第 2 構造体への 1 つのオフセットがあります。開始オフセットは、サブコマンドのシーケンス番号をインデックスとして使用する 2 バイトのフィールドです。開始オフセット 0 は、対応するサブコマンドがそのコマンドバッファを参照しないことを示します。

graphics/mc2.png

2 バイトの開始オフセットの配列は位置に依存しませんが、配列全体は連続的に渡されなければなりません。この例外はレコードバッファだけです。異なるサブコマンドのコントロールブロックは、レコードバッファの Buffer Header(オフセット =4)のあとに続けて、常に直接渡されなければなりません。

graphics/mc3.png

graphics/mc4.png

graphics/mc5.png

graphics/mc6.png

サブコマンドがコマンドバッファを使用しない場合、対応するオフセットはチェックされません。グローバルな入力バッファは、コマンドがそのバッファを参照しない場合無視されます。

サブコマンドのコントロールブロックおよび ISN バッファは、常に対応する MC コマンドバッファ内の 4 の倍数のオフセットで開始しなければなりません。サブコマンドのコントロールブロックは Buffer Header の後に続いて直接開始しなければならないため、最初のコントロールブロックは常にオフセット 4 で開始しなればなりません。これにより、すべての後続のコントロールブロックでは、コントロールブロック長が常に 4 の倍数であるため、正しいオフセットで自動的に開始します。ISN バッファにおいて、ユーザーはすべてのオフセットが 4 の倍数であることを確認する必要があります。4 の倍数以外の場合は、MC コマンドがレスポンスコード 146 で終了し、どのサブコマンドも処理されません。

コマンドバッファを参照するシーケンスのサブコマンドがない場合は、MC コマンドの対応するバッファが不要で、バッファサイズを 0 にセットできます。

異なるサブコマンドからコマンドバッファへの同じ開始オフセットを指定することもできますが、あるサブコマンドから次のサブコマンドへデータを転送するためには、この機能を使用できません。レコードバッファまたは ISN バッファの整合性のチェックは行われません。呼び出し元が、上書きされないようにサブコマンドの出力バッファを正しく指定する必要があります。

レスポンスの取り扱い

エラーが発生すると、現在のサブコマンドはバックアウトされ、必要であれば、後続のサブコマンドの実行を直ちに終了します。これは 0 より大きいレスポンスコードすべてに当てはまります。

エラーは次のように通知されます。

MC 環境内で発生したエラーは、MC コマンドのコントロールブロックに返されます。cb_add2 は、サブコマンドのコントロールブロックをポイントしません。このようなエラーは、MC コマンドの開始処理時または終了処理時に起こります(最初のサブコマンドの前、または最後のサブコマンドの処理後)。

サブコマンド処理時に発生したエラーは、サブコマンドのコントロールブロックに返ります。MC コマンド自体はサブコマンドが失敗したことを通知するために、レスポンス 16 を返します。アディション 2 は、失敗したサブコマンドのコントロールブロックを指します。

MC コマンドのレスポンスの表

RSP ADD_2
(上位 2 バイト)
ADD_2
(下位 2 バイト)
説明
16 サブコマンドの数 サブコマンドのコントロールブロックのオフセット サブコマンド処理時のエラー。エラーコードおよび追加情報が、失敗したサブコマンドのコントロールブロックに渡されます。
146 コマンドバッファ数 コマンドバッファ名 不正な MC コマンドバッファが検出されました(不正なバッファヘッダー、開始オフセットの範囲指定エラー、ISN バッファオフセットが 4 の倍数でない、など)。
MC コマンドのレスポンス 追加情報(ある場合) MC コマンドがコマンド開始処理時またはコマンド終了処理時に終了しました。

レスポンスコード 146

説明:次のいずれかの状態が発生しました。

  • 不正なバッファヘッダーが検出された(オフセットは 2 つとも設定)

  • ISN バッファのオフセットが 4 の倍数でない

  • 開始オフセットの配列が MC バッファの範囲外である

  • MC コマンドのレコードバッファは、サブコマンドのコントロールブロックすべてが入る大きさより小さい

  • 不正なバッファ長が検出された(サブコマンド)

コントロールブロックの cb_add2 フィールドにはレスポンスコード 146 の追加情報が含まれます。

  先頭 2 バイト 後半 2 バイト
フォーマットバッファ 1 FB
レコードバッファ 2 RB
サーチバッファ 3 SB
バリューバッファ 4 VB
ISN バッファ 5 IB

注意:
PREFETCH/MULTIFETCH オプションを使用した Adabas コマンドが、後続の ISN 処理中にレスポンスを返して終了する場合、このレスポンスは対応するコントロールブロックには返されず、このため MC コマンドはレスポンス 16 で終了できません。このようなサブコマンドは正常終了したものとして扱います。

MC コマンドがレスポンス 146 で終了する場合は、どのサブコマンドも処理されていません。

サブコマンドのレスポンスの表

RSP ADD_2
(上位 2 バイト)
ADD_2
(下位 2 バイト)
説明
146 コマンドバッファ数 コマンドバッファ名 不正なバッファ長が検出されました。例えば、サブコマンドバッファの最後(オフセット+バッファ長)が対応する MC コマンドバッファの範囲外など。
22 - 22

23
不正なコマンドまたは MC コマンドシーケンス内で許されないコマンド。
MC サブコマンドシーケンスの最後のコマンドでない ET コマンド。
コマンドのレスポンス 追加情報(ある場合) サブコマンド処理はレスポンスコード rsp で終了しました。