ほとんどのシステムでは、Adabas に対する標準コールが許可されていません。アプリケーションプログラムから発行されたコールを Adabas で処理可能な形式に変換するアプリケーションプログラミングインターフェイス(API)を提供します。
バッチアプリケーションはシングルユーザーモードでもマルチユーザーモードでもサポートされます。オンラインオペレーションは TP モニタで制御されます。 Adabas API はサポートされているすべてのメインフレームプラットフォーム間で有効です。API のバージョンは、個々の TP モニタに固有です。
ADALINK は個々の TP モニタに固有の API の一部を示す一般的な名称です。
このドキュメントでは、次のトピックについて説明します。
オンライン処理では、Adabas への要求は次のように処理されます。
TP モニタがアプリケーションプログラムを呼び出します。 アプリケーションプログラムは TP モニタリージョンにロードする必要があります。
アプリケーションプログラムが Adabas API を呼び出します。 Adabas API モジュールはアプリケーションモジュールとして TP モニタにインストールしなければなりません。
Adabas API は、アプリケーションプログラムから渡された Adabas コマンドを取得して、次の処理を実行します。
必要なコントロールブロックおよび構造を作成します。
アプリケーションプログラムコールから渡されたAdabas パラメータリストを Adabas ルーターまたは SVC で処理可能な要求に変換します。
Adabas にユーザーを示す情報(端末ID、TJID など)を組み込みます。
LINK 機能と同等の TP モニタの機能を使用して、ユーザーの Adabas コントロールブロックとバッファを API に渡します。
Adabas API は、通常オペレーティングシステムにインストールされている Adabas ルーターまたは SVC(スーパーバイザコール)を使用して、フォーマットされた要求を Adabas に送ります。
Adabas ルーターまたは SVC はユーザーのコントロールブロックとバッファをTP モニタリージョンから Adabas リージョン(Adabas ニュークリアス)に移動します。
Adabas API は Adabas ニュークリアスからの応答を待ちます。
Adabas の処理が完了すると、WAIT と同等の TP モニタの機能がポストされます。
Adabas は要求された機能を実行し、ユーザーアプリケーションバッファに結果データとレスポンスコードを返す Adabas ルーターまたは SVC を呼び出します。
Adabas ルーターまたは SVC は、TP モニタリージョンに Adabas API をポストします。
Adabas API は、Adabas ニュークリアスからの応答をアプリケーションプログラムに送り、制御をアプリケーションプログラムに返します。
アプリケーションプログラムは制御を TP モニタに返します。
上記の各機能の処理内容は、使用するTP モニタに応じて異なります。 これらの機能に加えて、各リンクルーチンでは、さまざまな処理ポイントで 1 つ以上のユーザー出口をコールできるため、Adabas 要求を行うときに機能の追加や柔軟性を与えることができます。
次の図は、多くのシステムで使用される基本的な構成を示しています。
バッチ処理では、Adabas への要求は次のように処理されます。
オペレーティングシステムがバッチアプリケーションをロードします。
バッチアプリケーションが Adabas 要求(CALL ADABAS)を行います。
Adabas スタブプログラム ADAUSER は ADARUN をロードし、呼び出します。ADARUN は、バッチ Adabas リンクルーチン ADALNK をロードし、呼び出します。
バッチ ADALNK リンクルーチンは、Adabas 要求を Adabas ニュークリアスで使用可能なフォーマットに変換します。
リンクルーチンは、通常、オペレーティングシステムにインストールされている Adabas ルーターまたは SVC へのコールで Adabas を呼び出します。 また、ユーザー固有の ID を特定します。
リンクルーチンは Adabas が要求を処理するのを待機します。
Adabas(通常、異なるアドレススペースまたはパーティションで実行している)は、要求を処理してリンクルーチンをポストし、必要なバッファとレスポンスコードをすべて返します。
リンクルーチンは制御を受け取り、レスポンスコードとデータが格納された Adabas バッファをアプリケーションに返します。
Adabas API はバッチとオンラインアプリケーションの両方から使用できます。 オンラインアプリケーションでは、Adabas API はTP モニタの制御下になります。 Adabas をインストールすると、使用中の TP モニタに固有の Adabas API もインストールされます。
次の表に、IBM オペレーティング環境で使用可能な API バージョンと対応する TP モニタを示します。
パラメータは API に渡す必要があります。 多数のモニタで標準パラメータ受け渡し規則が許可されないため、Adabas コントロールブロックとバッファアドレスを特別なワークエリアに異動する必要があります。
Adabas 7 リンクルーチンでは、アプリケーションプログラムによって、この特別なワークエリアが TP モニタシステムから取得される必要があります。 ワークエリアは、ユーザーに固有であり、Adabas API からアドレス可能でなければなりません。 アプリケーションプログラムは始めにこのエリアを取得し、バイナリの 0 にクリアします。
注意:
アプリケーションプログラムが NATURAL で作成されている場合、必要な API
ワークエリアはプログラムコードを変更しなくても制御できます。
Adabas 8 リンクルーチンでは、アプリケーションがワークエリアを取得する必要はありません。
このセクションでは、次のトピックについて説明します。
既存の Adabas 7 アプリケーションは、修正しないで Adabas 8 ADALNKR モジュールをコールすることができます。
このセクションでは、リエントラント TP モニタリンクルーチンのワークエリア要件について説明します。
ACB インターフェイスコールに ADALNKR8 が使用されている場合、7 番目のパラメータを、初期値としてバイナリ 0 が設定されているポインタのフルワードアドレスにする必要があります。
ADALNKR への最初のコール前に、ワークエリアをバイナリ0 に初期化する必要があります。また、その内容をコール元アプリケーションプログラムで修正してはなりません。 複数のキーフィールドがこのエリアに格納されます。 これらのフィールドが不適切に修正されると、パフォーマンス低下からリンクルーチンの異常終了まで、さまざまな予測できない結果が生じます。
ADALNKR をコールするときに、コールパラメータリストの最後のパラメータアドレスを X'80' でマークすることは非常に重要です。
高水準言語では、CALL ステートメントが使用されると、自動的にこれが実行されます。
アセンブラアプリケーションでは、ADALNKR の起動に CALL マクロを使うことによって、これを実行できます。
Adabas 8 リエントラントバッチ/TSO アプリケーションインターフェイスルーチン ADALNKR は、1 箇所だけ修正した Adabas 7 パラメータリストを受け付けます。 これらのリエントラントモジュールによって要求される、アプリケーションコードによるワークエリア取得の制約を解放するには、7 番目のパラメータが、バイナリ 0 に初期化されている 4 バイトエリアを指している必要があります。ADALNKR ルーチンは、このエリアにリエントランシートークンを挿入します。 このトークンはコールの間そのまま維持される必要があります。 同一のアプリケーションからのコールで Adabas 7 および Adabas 8 のコールが混在している場合、このトークンは ACBX コールのリエントランシートークンにも挿入する必要があります。
ACB ダイレクトコールの 7 番目のパラメータを指定する場合、2 種類のコールによって実行されるロジック間のユーザーコンテキストを保存するため、7 番目のパラメータとして使用されるアドレスを ACBX コールのリエントランシートークン(APLXRTOK フィールド)でも指定してください。 同様に、ACBX ダイレクトコールでリエントランシートークンを指定する場合、同じアドレスを ACB ダイレクトコールの 7 番目のパラメータとして指定してください。 ACB および ACBX ダイレクトコールでこのようにして、ワークエリアアドレスを使用しなかった場合、2 つのコールタイプのユーザーコンテキストに違いが生じ、アプリケーションで正確な結果を得られなくなる可能性があります。
ACBX ダイレクトコールの構造の詳細については、「ACBX インターフェイスダイレクトコールの指定」を参照してください。
すべての Adabas 8 リンクルーチンによって使用されるワークエリアは、Adabas 7 で使用される同等のワークエリアより実質的に大きくなる点に注意してください。 これは、Adabas 8 で導入されたデータ構造と Adabas 8 で追加されたコンテキスト情報をサポートするために必要です。
注意:
Adabas 8 非リエントラント ADALNK が ACB および ACBX
の両方のインターフェイスダイレクトコールを使用して呼び出された場合、ワークエリアは ADALNK モジュール自身の一部なので、コンテキストは維持されます。
ほとんどの TP モニタでは、その配下で実行しているアプリケーションで、バッチ環境のオペレーティングシステムに操作される機能を透過的に実行するためには、非標準コールを使用する必要があります。 この場合、アプリケーションコードのリエントラントプロパティによって、複数ユーザーが Adabas API コールをオンラインで実行する方法が決定されます。
各 Adabas API バージョンは、関連付けられている TP モニタのリエントランシーの要件に従っています。 Adabas API を使用するアプリケーションプログラムは、使用するTP モニタに対する要件にも従う必要があります。
注意:
TP モニタによって設定されるリエントランシーの要件は最小限です。 例えば、TP
モニタが準リエントラントアプリケーションプログラムを必要とする場合、完全にリエントラントなプログラムも受け入れられます(後述の CICS
の要件の説明を参照してください)。
ただし、リエントラントアプリケーションプログラムが必要な場合、準または非リエントラントなプログラムは受け付けられません。
理想では、多数のユーザーが共有する(一般に使用する TP トランザクション)アプリケーションプログラムのコードはリエントラントにすべきです。 コード自体は変更しません。 すべてのワークエリアは、汎用レジスタまたは汎用レジスタでアドレスされるユーザー固有のワークエリアです。 あるユーザーから別のユーザーへの制御の移動に必要なのは、プログラムカウンタ(PSW)と汎用レジスタの変更だけです。 多くのシステムルーチンはこのようにコーディングされています。
PL/I コンパイラはリエントラントコードを生成します。ただし、ほとんどの TP モニタで許可されていないオペレーティングシステム機能を使用します。 この制限のため、準リエントラントの概念が生まれました。
準リエントラントプログラムは、TP モニタ機能へのコール間にコードを変更できます。 モニタ機能を呼び出す場合、すべてのユーザーデータは TP モニタシステムから取得された特別なワークエリアに保存しなければなりません。 TP モニタは別のユーザータスクをアクティブタスクとしてシステムにスケジュールします。このタスクは同じコードを再使用できます。 元のユーザーのタスクを再度アクティブにするとき、そのワークエリアは再設定され、制御はユーザーが TP モニタ機能を要求したポイントに返されます。
以降のセクションで、いくつかの TP モニタのリエントランシー条件について説明します。
Com-Plete は非標準のコールシーケンスを必要としません。Com-Plete ユーザーは、標準の非リエントラントコードを使用できます。 Adabas リンケージは Com-Plete サービスルーチンによって提供されます。Adabas コールがユーザープログラムに含まれる場合、Com-Plete サービスルーチンは自動的にユーザーのロードモジュールに組み込まれます。 サービスルーチンはユーザーパラメータを Com-Plete に渡し、Adabas コマンドが実行されたときに制御を返します。
Adabas 8 CICS リンクルーチンコンポーネントは完全にリエントラントです。 これは、Adabas タスク関連ユーザー出口(TRUE)がオプションではなくなったためです。 これらのモジュールは完全にリエントラントなので、LPA からロードすることも、タスク関連ユーザー出口(TRUE)ADACICT をスレッドセーフとして CICS に定義することもできます。 完全にリエントラントでスレッドセーフなオペレーションをサポートし、Adabas 8 に必要な大容量ワークエリアをサポートするため、これらのリンクルーチンコンポーネントのストレージワーキングセットが増加しています。 可能な限り、CICS Adabas 8 コンポーネントによって使用されるストレージエリアはすべて 16 MB 境界より上で取得されます。
ACB インターフェイスダイレクトコールでアプリケーションプログラムによって Adabas API に渡される最初のパラメータは、Adabas コントロールブロック(ACB)へのポインタです。 ACB には Adabas 要求を処理するために必要な情報が含まれています。
ACB の先頭バイトは、実行する処理を決定するために Adabas API が使用します。 論理リクエストの値は次のとおりです。
16 進数 | 説明 |
---|---|
X'00' | 1 バイトのファイル番号(ファイル番号は1~255) |
X'30' | 2 バイトのファイル番号(ファイル番号は1~65535) |
X'40' | 空白以上の値。 これらは、Adabas の以前のリリースと互換性を維持するための論理アプリケーションコールとして受け入れられます。 ただし、X'44'、X'48'、および X'4C' の 3 つのコールは、特別な Software AG 機能または製品での使用に予約されているため、受け入れられません。 |
ACB の先頭バイトのその他すべての値は Software AG による使用に予約されています。
このセクションでは、次のトピックについて説明します。
1~255(1 バイト)のファイル番号に対応するアプリケーションプログラムから Adabas コマンドを発行する場合は、コントロールブロックを次のように作成します。
位置 | 処理内容 |
---|---|
1 | ACB の先頭バイトに X'00' を設定します。 |
9 | ACB の ACBFNR フィールドの 2 バイト目(右側)にファイル番号を設定します。 ACBFNR フィールドの 1 バイト目(左側)は、論理(データベース)ID または番号を格納するために使用します。 |
ACBFNR の 1 バイト目が 0 の場合、API は、DDCARD 入力データ(ADARUN カード)に指定されたデータベース ID、またはリンクルーチンにアセンブルされたオフセット X'80' のデフォルトのデータベース ID を使用します。 Natural 言語で作成されたアプリケーションの場合、Natural が適切な値を指定するため、ADACB の 1 バイト目を組み込む必要はありません。
Adabas は、論理リクエストで 255 より大きなファイル番号を使用できます。 256~5000(2 バイト)のファイル番号に対応するアプリケーションプログラムから Adabas コマンドを発行する場合は、コントロールブロックを次のように作成します。
位置 | 処理内容 |
---|---|
1 | ACB の先頭バイトに X'30' を設定します。 |
9 | ファイル番号に ACBFNR の 2 バイトを使用し、データベース(論理)ID に ACBRESP の 2 バイトを使用します。 |
ACBRESP フィールドが 0 の場合、API は、DDCARD 入力データに指定された ADARUN カードのデータベース ID、またはリンクルーチンにアセンブルされたオフセット X'80' のデフォルトのデータベース ID を使用します。
アプリケーションは、各コールで ACB の1 バイト目の値をリセットできるので、単一のアプリケーションで 1 バイトファイル番号と 2 バイトファイル番号の両方を使用することができます。
この方法を使用する場合、それぞれのコールタイプに対して ACB 内の ACBFNR および ADBRESP フィールドの構成が適切であることを確認する必要があります。
2 バイトファイル番号を使用するアプリケーションを作成する場合は、ADACB の 1 バイト目には X'30'、ACBRESP フィールドには論理 ID、ACBFNR フィールドにはファイル番号を常に設定することをお勧めします。 そうすることによって、アプリケーションは、使用中のファイル番号の値に関係なく、2 バイトのバイナリ整数としてデータベース ID とファイル番号の両方を処理することができます。
Adabas API に対応して2 バイトファイル番号のサポートを行う必要があるとき、COBOL のようなプログラミング言語は、1 バイトの値を簡単に操作するようには設計されていません。 次の COBOL の例は、これらの値を設定するための 1 つの方法です。
WORKING-STORAGE SECTION 01 ACB-CONTROL 05 ACB-TYPE PIC 9(4) COMP. 05 ACB-DATA REDEFINES ACB-TYPE. 07 FILLER PIC X. 07 ACB-TYPE-X PIC X. 01 ADABAS-CB. 05 ACBTYPE PIC X. . PROCEDURE DIVISION . * FOR SINGLE-BYTE FILE NUMBERS . . . MOVE 0 TO ACB-TYPE. . * FOR TWO-BYTE FILE NUMBERS . . . MOVE 48 TO ACB-TYPE. . MOVE ACB-TYPE-X TO ACBTYPE. . CALL 'ADABAS' USING ADABAS-CB, . . . . .
このコードセグメントで重要なのは、PIC 9(4) COMP フィールドをその 2 バイトの構成に再定義する REDEFINES 節の使用です。 そのため、Adabas コントロールバイトの 16 進値を含む 2 バイト目を、文字データとして Adabas コントロールブロックに移すことができます。
ACBX インターフェイスダイレクトコールでアプリケーションプログラムによって Adabas API に渡される最初のパラメータは、拡張 Adabas コントロールブロック(ACBX)へのポインタです。 ACBX には Adabas 要求を処理するために必要な情報が含まれています。
ACBX の先頭バイトは、実行する処理を決定するために Adabas API が使用します。 Adabas コマンドを発行するときに、このフィールドをバイナリの 0 に設定します。 これは、論理ユーザーコールが実行されることを示します(ACBXTUSR EQU 文)
ACBXTYPE の値の X'04'、X'08'、X'0c'、X'10'、X'14'、X'18'、X'1c'、X'20'、X'24'、X'28'、X'2c'、X'34'、X'38'、X'3c'、X'44'、X'48'、および X'4c' は、Software AG で使用するために予約されています。そのため、アプリケーションプログラムで使用することはできません。
Software AG の Natural 言語で作成されたアプリケーションは、Natural が適切な値を指定するので、Adabas ACBX の 1 バイト目にこの値を指定する必要はありません。
このセクションでは、次のトピックについて説明します。
ACBX インターフェイスを使用して Adabas コマンドを発行するアプリケーションプログラムの場合、ACBX の 21~24 バイト(ACBXFNR フィールド)にファイル番号を指定します。
1 バイトファイル番号の場合は、ファイル番号を右端のバイト(24)に入力します。左端のバイト(21~23)には、バイナリの 0(B'0000 0000')を設定します。
2 バイトファイル番号の場合、フィールドの右端のバイト(23~24)を使用し、左端のバイト(21~22)にはバイナリの 0 をセットします。
ファイルのデータベース ID を指定するには、ACBX の 17~20 番目のバイト(ACBXDBID フィールド)を使用します。 ACBX のレイアウトに関する詳細情報については、「拡張 Adabas コントロールブロック(ACBX)」を参照してください。
ACBX インターフェイスを使用して Adabas コマンドを発行するアプリケーションプログラムの場合、ACBX の 20~23 バイト(ACBXDBID フィールド)にデータベース ID を指定します。
このフィールドの右端の 2 バイトにコールのデータベース ID を指定し、左側のバイトにバイナリ 0 をセットします。 現在のところ、Entire Net-Work がサポートするデータベース ID は 2 バイトだけです。
このフィールドがバイナリの 0 に設定されている場合、Adabas API は、DDCARD 入力データの ADARUN カードのデータベース ID を使用するか、または、リンクルーチンにリンクされている LNKGBLS モジュールかリンクルーチンによりロードされた LNKGBLS モジュールのデフォルトのデータベース ID 値を使用します。
ファイル番号も必要な場合は、ACBX の 21~24 バイト目(ACBXFNR フィールド)に指定します。 ACBX のレイアウトに関する詳細情報については、「拡張 Adabas コントロールブロック(ACBX)」を参照してください。
次の TP モニタの制御下で実行するプログラムからダイレクトモードで Adabas コールを発行する手順について説明します。
Com-Plete の制御下で実行するアプリケーションプログラムはバッチプログラムとまったく同じ方法でコーディングできます。 各アプリケーションプログラムは、Com-Plete によって処理スレッドに割り当てられるので、プログラムは、リエントラントや準リエントラントなコードで作成する必要はありません。
次の例は Com-Plete 環境で実行する COBOL プログラムからの Adabas ACB インターフェイスダイレクトコールを示しています。
WORKING-STORAGE SECTION . . 01 CONTROL-BLOCK COPY ADACBCOB. 01 FORMAT-BUFFER COPY FORDEF. 01 RECORD-BUFFER COPY RECDEF. 01 SEARCH-BUFFER COPY SEADEF. 01 VALUE-BUFFER COPY VALDEF. 01 ISN-BUFFER COPY ISNBUF. PROCEDURE DIVISION . . . CALL 'ADABAS' USING CONTROL-BLOCK, FORMAT-BUFFER, RECORD-BUFFER, SEARCH-BUFFER, VALUE-BUFFER, ISN-BUFFER. .
CICS 環境で実行しているアプリケーションは、コマンドレベル API ADACICS および CICS トランザクションワークエリア(TWA)または CICS COMMAREA をパラメータの伝達に使用します。
Adabas 8 CICS リンクルーチンコンポーネントは、TWA または CICS COMMAREA を使用したアプリケーションコールを受け入れます。 COMMAREA の方をお勧めします。 ACBX インターフェイスダイレクトコールを使用する CICS アプリケーションを新規に作成する場合は、TWA ではなく COMMAREA を使用することを強くお勧めします。 新しい ACBX ダイレクトコールインターフェイスでは、Adabas バッファ記述(ABD)の数は変更できます。つまり、Adabas パラメータリストの長さは一定ではありません。 したがって、ACBX ダイレクトコールを使用する場合、各トランザクションの TWA のサイズを調整するのが困難になります。一方で、使用される COMMAREA のサイズはアプリケーションによってダイナミックに制御されるため、COMMAREA の方が ACBX コールに向いています。 COMMAREA のフォーマットの詳細については、このセクションで後述する「COMMAREA フォーマット」を参照してください。
高水準言語インターフェイスは COBOL、PL/I、アセンブラの準リエントランシーを保証します(リリース 1.4 以上)。
言語 | コントロールブロックおよびバッファの定義 |
---|---|
COBOL | ワーキングストレージに定義します。 トランザクションが初期化されるとき、ワーキングストレージはすべてユーザーワークエリアにコピーされます。 |
PL/I | 自動ストレージ(デフォルトストレージクラス)変数として定義されます。 |
Adabas コントロールブロックおよびバッファのアドレスは、すべてのリリースの CICS と同様に渡されます。 ACB コール内では、これらのアドレスは TWA の最初の 6 ワードに挿入する必要があります。
ACB パラメータアドレスを TWA に設定するため、COBOL またはアセンブラアプリケーションプログラムからコール可能なアセンブラサブルーチンが用意されています。 サブルーチンは、エントリポイント ADASTWA を使用し、その最初のパラメータとして TWA を受け付けます。
EXEC CICS ADDRESS TWA 機能を使用して TWA をアドレス可能にします。 ACB コールの 2~7 番目のパラメータは、通常の Adabas コールパラメータです。 アセンブラサブルーチンはパラメータアドレスをTWA に設定し、CICS/Adabas リンクルーチンは TWA からそれらを取得します。
このセクションでは、次のトピックについて説明します。
CICS アセンブラプログラマは、TWA にアドレスをセットし、Adabas をコールするために、インストールマクロを使用して直接 TWA をアドレスできます。
PL/I は、TWA をアドレスし、データエリアのアドレスを取得するための機能を提供します。 プログラマ自身が TWA にパラメータアドレスを設定できます。 コールするコードを生成するための PL/I プリプロセッサプロシージャを設定できます。
DCL 1 TWA BASED (TWAPTR), 2 CBPTR POINTER, 2 FBPTR POINTER, 2 RBPTR POINTER, . EXEC CICS ADDRESS TWA (TWAPTR) END-EXEC; . . CBPTR=ADDR(ADA-CONTROL-BLOCK); FBPTR=ADDR(FORMAT-BUFFER); RBPTR=ADDR(RECORD-BUFFER);
VS COBOL 配下では、次のステートメントを使用して Adabas をコールします。
EXEC CICS LINK PROGRAM ('ADABAS') END-EXEC.
CBL XOPTS (APOST) IDENTIFICATION DIVISION. . . WORKING-STORAGE SECTION. . . 01 ADABAS-CB COPY ADACBCOB. 01 ADABAS-FB COPY ADAFBCOB. 01 ADABAS-RB COPY ADARBCOB. 01 ADABAS-SB COPY ADASBCOB. 01 ADABAS-VB COPY ADAVBCOB. 01 ADABAS-IB COPY ADAIBCOB. . . LINKAGE SECTION. . . 01 PARMLIST. 05 FILLER PIC S9(08) COMP. 05 TWAPTR PIC S9(08) COMP. 01 TWA. 05 PARM-ADDRESSES OCCURS 7 TIMES PIC S9(08) COMP. . . PROCEDURE DIVISION. . . SERVICE RELOAD PARMLIST. . EXEC CICS ADDRESS TWA (TWAPTR) END-EXEC SERVICE RELOAD TWA. . CALL 'ADASTWA' USING TWA, ADABAS-CB, ADABAS-FB, ADABAS-RB, ADABAS-SB, ADABAS-VB ADABAS-IB. EXEC CICS LINK PROGRAM ('ADABAS') END-EXEC. . . .
COBOL Ⅱまたは COBOL/LE 配下では、次のステートメントを使用して Adabas をコールします。
EXEC CICS LINK PROGRAM ('ADABAS') END-EXEC.
CBL XOPTS (APOST,ANSI85) IDENTIFICATION DIVISION. . . WORKING-STORAGE SECTION. . . 01 ADABAS-CB COPY ADACBCOB. 01 ADABAS-FB COPY ADAFBCOB. 01 ADABAS-RB COPY ADARBCOB. 01 ADABAS-SB COPY ADASBCOB. 01 ADABAS-VB COPY ADAVBCOB. 01 ADABAS-IB COPY ADAIBCOB. . . LINKAGE SECTION. . 01 TWA. 05 PARM-ADDRESSES OCCURS 7 TIMES PIC S9(08) COMP. . . PROCEDURE DIVISION. . . . EXEC CICS ADDRESS TWA (ADDRESS OF TWA) END-EXEC. . CALL 'ADASTWA' USING TWA, ADABAS-CB, ADABAS-FB, ADABAS-RB, ADABAS-SB, ADABAS-VB, ADABAS-IB. EXEC CICS LINK PROGRAM ('ADABAS') END-EXEC. . . .
COMMAREA フォーマットは、Adabas 7 リリース用、Adabas 8 用がそれぞれ別に用意されています。
Adabas 7 CICS COMMAREA のフォーマットは次のとおりです。最低 32 バイト長が必要です。
COMMID DC CL8'ADABAS52' Adabas COMMAREA ID CACBA DC A(ADACB) Address of Adabas 7 CB CAFBA DC A(ADAFB) Address of Adabas 7 FB CARBA DC A(ADARB) Address of Adabas 7 RB CASBA DC A(ADASB) Address of Adabas 7 SB CAVBA DC A(ADAVB) Address of Adabas 7 VB CAIBA DC A(ADAIB) Address of Adabas 7 IB
Adabas 8 CICS COMMAREA のレイアウトは次のとおりです。
V8COMID DC CL8'ADABAS8X' Adabas V8 COMMAREA ID V8APLX DS 0A Beginning of Adabas V8 APLX V8ACBX DC A(ACBX) Adabas ADACBX V8RSV1 DC A(0) ACBX direct call reserved field V8APLXR DC A(0) ACBX direct call reentrancy token V8ABD1 DC A(ABD1) First ABD ... V8ABD#n DC A(ABD#N+X'800000') Last ABD address
Adabas API を使用する IMS メッセージ処理プログラムに特別なリンクは必要ありません。 リエントラントオプションはサポートされていません。
Adabas 8 用の IMS リンクルーチンは ADALNI です。
このセクションでは、次のトピックについて説明します。
IMS/TM 環境の非リエントラントな Adabas API コールは、次のように、バッチ環境の従来の Adabas API コールと同様に行われます。
WORKING-STORAGE-SECTION. . . 01 ADA-CONTROL BLOCK COPY ADACBCOB. 01 FORMAT-BUFFER COPY FORDEF. 01 RECORD-BUFFER COPY RECDEF. 01 SEARCH-BUFFER COPY SEADEF. 01 VALUE-BUFFER COPY VALDEF. 01 ISN-BUFFER COPY ISNDEF. . PROCEDURE DIVISION. . . CALL 'ADABAS' USING ADA-CONTROL-BLOCK, FORMAT-BUFFER, RECORD-BUFFER, SEARCH-BUFFER, VALUE-BUFFER, ISN-BUFFER. . .
最近の COBOL プログラムは、CICS トランザクションワークエリア(TWA)または CICS コミュニケーションエリア(COMMAREA)を使用して、Adabas CICS リンクルーチンにデータを渡します。 Adabas バージョン 8 API を使用してコールする場合は、コールごとにサイズをダイナミックに調整できるため、CICS COMMAREA の方をお勧めします。 Adabas CICS ハイパフォーマンススタブルーチン(LNCSTUB)は、Adabas 8.1.3 で更新され、ADAGSET キーワード PARMTYP が ALL または COMM に設定されている場合、CICS COMMAREA を利用するようになりました。
以前の Adabas リリースで古い COBOL コンパイラを使用する場合、Software AG 提供のサブプログラム ADASTWA をアセンブルして、COBOL プログラムとリンクエディットし、CICS トランザクションワークエリアに Adabas パラメータアドレスが正しく設定されるようにする必要がありました。
そのようなプログラムのスケルトンは次のようなステートメントによって構成されていました。
WORKING-STORAGE SECTION. ... ... 01 ADABAS-CB PIC X(80). 01 ADABAS-FB PIC X ... 01 ADABAS-RB PIC X ... 01 ADABAS-SB PIC X ... 01 ADABAS-VB PIC X ... 01 ADABAS-IB PIC X ... ... ... LINKAGE SECTION. 01 PARMLIST. 05 FILLER PIC S9(08) COMP. 05 TWAPTR PIC S9(08) COMP. 01 TWA. 05 PARM-ADDRESSES OCCURS 7 TIMES PIC S9(08) C PROCEDURE DIVISION ... ... CALL 'ADASTWA' USING TWA, ADABAS-CB, ADABAS-FB, ADABAS-RB, ADABAS-SB, ADABAS-VB, ADABAS-IB. EXEC CICS LINK PROGRAM (LINK-NAME) END-EXEC. ... ...
ADASTWA サブプログラムを最近のコンパイラで使用することに何も問題はありませんが、これらのコンパイラが提供するアドレス操作の手段が限られています。そのため、上記のスケルトンを次のように変更することで、ADASTWA プログラムを CICS COBOL アプリケーションとリンクする必要がなくなります。
WORKING-STORAGE SECTION. ... 01 TWA-LEN PIC S9(04) COMP VALUE +0. 01 ABEND-CODE PIC X(4) VALUE SPACES. ... 01 ADABAS-CB PIC X(80). 01 ADABAS-FB PIC X ... 01 ADABAS-RB PIC X ... 01 ADABAS-SB PIC X ... 01 ADABAS-VB PIC X ... 01 ADABAS-IB PIC X ... ... ... LINKAGE SECTION. ... 01 TWA. 05 CB-PTR USAGE POINTER. 05 FB-PTR USAGE POINTER. 05 RB-PTR USAGE POINTER. 05 SB-PTR USAGE POINTER. 05 VB-PTR USAGE POINTER. 05 IB-PTR USAGE POINTER. ... PROCEDURE DIVISION USING TWA. ... INIT-TWA. EXEC CICS ASSIGN TWALENG (TWA-LEN) END-EXEC. IF TWA-LEN = 0 MOVE 'U649' TO ABEND-CODE GO TO ... IF TWA-LEN < 28 MOVE 'U650' to ABEND-CODE GO TO ... EXEC CICS ADDRESS TWA (ADDRESS OF TWA) END-EXEC. ... SET CB-PTR TO ADDRESS OF ADABAS-CB. SET FB-PTR TO ADDRESS OF ADABAS-FB. SET RB-PTR TO ADDRESS OF ADABAS-RB. SET SB-PTR TO ADDRESS OF ADABAS-SB. SET VB-PTR TO ADDRESS OF ADABAS-VB. SET IB-PTR TO ADDRESS OF ADABAS-IB. ... EXEC CICS LINK PROGRAM (LINK-NAME) END-EXEC. ...
CICS TWA サイズは、特定のアプリケーションプログラムのセットに対する CICS トランザクション定義の一部です。また、その CICS トランザクション下でアプリケーションプログラムが実行されているときはサイズをダイナミックに変更できません。 このため、Adabas バージョン 8 プログラムには、CICS コミュニケーションエリア(COMMAREA)をお勧めします。 COMMAREA サイズは、COMMAREA を使用するプログラム間で渡されるデータの要件に応じて変更できます。 Adabas バージョン 8 パラメータリストおよびデータ構造は、サイズが可変であるため、CICS アプリケーションと Adabas バージョン 8 CICS リンクルーチンの間でデータを受け渡すには、COMMAREA が最適の手段です。
最近の COBOL コンパイラのアドレス操作機能を使用する場合、CICS COMMAREA を使用する必要のあるステートメントのスケルトンは次のようになります。
WORKING-STORAGE SECTION. ... ... 01 ADA-COMM-AREA. 05 COMMID PIC X(8) VALUE 'ADABAS52'. 05 CB-PTR USAGE POINTER. 05 FB-PTR USAGE POINTER. 05 RB-PTR USAGE POINTER. 05 SB-PTR USAGE POINTER. 05 VB-PTR USAGE POINTER. 05 IB-PTR USAGE POINTER. ... 01 ADABAS-CB PIC X(80). 01 ADABAS-FB PIC X ... 01 ADABAS-RB PIC X ... 01 ADABAS-SB PIC X ... 01 ADABAS-VB PIC X ... 01 ADABAS-IB PIC X ... ... 01 ADA-COMM-AREA-LENGTH PIC S9(4) COMP. ... PROCEDURE DIVISION. ... ... INIT-ADA-COMM-AREA. SET CB-PTR TO ADDRESS OF ADABAS-CB. SET FB-PTR TO ADDRESS OF ADABAS-FB. SET RB-PTR TO ADDRESS OF ADABAS-RB. SET SB-PTR TO ADDRESS OF ADABAS-SB. SET VB-PTR TO ADDRESS OF ADABAS-VB. SET IB-PTR TO ADDRESS OF ADABAS-IB. MOVE 32 TO ADA-COMM-AREA-LENGTH. ... EXEC CICS LINK PROGRAM ('ADABAS') COMMAREA(ADA-COMM-AREA) LENGTH(ADA-COMM-AREA-LENGTH) END-EXEC.
バッチモードの Adabas API による標準コールでは、レジスタ 1 のパラメータリストおよびレジスタセーブエリアをポイントするレジスタ 13 を使用します。 この規則は、すべての主なプログラミング言語で CALL メカニズムによって、サポートされています。
ほとんどのメインフレームオペレーティングシステム環境では、バッチ API(ADALNK または ADALNKR)は、バッチアプリケーションモジュールと直接リンクするか、または ADAUSER でロードすることができます。 バッチアプリケーションは、バッチ ADALNK または ADALNKR ではなく、ADAUSER とリンクすることを強くお勧めします。
ADAUSER は Adabas API とリンクすることができます。 ADAUSER は、Adabas リリースとの上位互換性を提供し、API または Adabas SVC の将来のリリースでの変更に影響されないように、ある程度分離します。
実行する各ユーザープログラムは、Adabas バージョンに依存しないモジュール ADAUSER とリンクする必要があります。ADAUSER は Adabas コントロールモジュール ADARUN をダイナミックにロードします。 バッチモードの実行の場合は、環境非依存を最大限に実現するため、次のように、ユーザープログラムを ADAUSER とリンクする必要があります。
ユーザープログラムとリンクするモジュール | 効果 |
---|---|
ADAUSER、ADARUN、ADALINK | モード非依存および Adabas バージョン非依存 |
ADARUN、ADALINK | モード非依存のみ |
ADALINK | なし(バージョン非依存もモード非依存もない) |
バッチアプリケーションモジュールと ADAUSER のリンクに必要な JCL/JCS を次に示します。
/ EXEC $TSOSLNK PROGRAM USERPROG INCLUDE USERPGM, ... User Library INCLUDE ADAUSER, ... Adabas Library END
// EXEC LKED,PARM='NCAL' //LKED.SYSLMOD DD ... User Library //LKED.ADALIB DD ... Adabas Library //LKED.SYSIN DD * INCLUDE SYSLMOD(USERPGM) INCLUDE ADALIB(ADAUSER) ENTRY USEREP (see note) NAME USERPROG(R) /*
注意:
エントリポイントを指定する場合、これはユーザープログラムのエントリポイントでなければなりません。
FILEDEF ADALIB DISK ADAVnnn LOADLIB fm FILEDEF SYSLIN DISK LINKEDIT CARDS A LKED userprog ( NCAL LET XREF MAP LIBE USERLIB LIST
LINKEDIT CARDS A には、次のリンケージエディタ制御ステートメントが含まれています。 ユーザープログラムは TEXT ファイルとして存在しています。
INCLUDE ADALIB(ADABAS) ENTRY userprog NAME userprog(R)
注意:
このシステムは必要なモジュールをすべてダイナミックにロードするので、CMS を使用するときは ADAUSER
とのリンクは適用できません。
* Appropriate assignments must be made for private libraries, where necessary. * // OPTION CATAL PHASE USERPROG,* INCLUDE USERPGM INCLUDE ADAUSER ENTRY USEREP (see note) // EXEC LNKEDT
注意:
エントリポイントを指定する場合、これはユーザープログラムのエントリポイントでなければなりません。
バッチ配下で実行するとき、プログラムはシングルユーザーモードまたはマルチユーザーモードで実行できます。
シングルユーザーモードでは、アプリケーションプログラム、バッチAPI、ADARUN、および Adabas ニュークリアスを同じアドレススペースまたはパーティションで実行します。
マルチユーザーモードでは、アプリケーションプログラムおよび Adabas API を Adabas ニュークリアスとは別のアドレススペースで実行します。
処理モードはマルチユーザーモードを使用することをお勧めします。 ユーザーは、ADARUN やユーザープログラムに必要なジョブ制御ステートメントを指定するだけです。
SDF フォーマットの場合:
/ASS-SYSDTA *SYSCMD (ADARUN PARAMETERS) /SET-FILE-LINK DDLIB,ADAvrs.MOD /SET-FILE-LINK BLSLIB00,user modlib /START-PROGRAM USERPROG,PR-MO=ANY,RUN-MODE=ADV(ALT-LIB=YES) ADARUN MODE=MULTI...
ISP フォーマットの場合:
/FILE ADABAS MODLIB,LINK=DDLIB /SYSFILE TASKLIB=user modlib /SYSFILE SYSDTA=(SYSCMD) (ADARUN PARAMETERS) /EXEC USERPROG ADARUN MODE=MULTI...
注意:
次の例では、ユーザープログラム USERPROG はモジュール ADAUSER とリンクしており、マルチユーザーモードで実行することを想定しています。
// EXEC PGM=USERPROG //STEPLIB DD ... User Library // DD ... Adabas Library //DDCARD DD * ADARUN MODE=MULTI //DDPRINT DD SYSOUT=* //... user DD statements ...
マルチユーザーモードの z/VM 環境で実行されているユーザープログラムは、ADARUN を使用して他のプログラムを制御することができません。
次の例では、ユーザープログラム USERPROG はモジュール ADAUSER とリンクしており、マルチユーザーモードで実行することを想定しています。
//....user program assignments.... // LIBDEF PHASE,SEARCH=(user-library, ADABAS-library) // EXEC USERPROG ADARUN MODE=MULTI /*
ユーザープログラムがステートメント入力を読み込む場合、次のいずれかが適用されます。
最初の Adabas コールの前にすべてのユーザーステートメントが読み込まれる場合、EXEC ステートメントの直後に指定し、後ろに /* を指定します。 ユーザーファイルは最初の Adabas コールの前にオープン、読み込み、クローズしなければなりません。
最初のユーザーステートメントを読み込む前に最初の Adabas コールを行う場合、ユーザーステートメントは ADARUN パラメータステートメントの後に /* ステートメントで開始しなければなりません。
その他の場合、ADARUN パラメータステートメントをテープまたはディスクのファイル CARD から読み込まなければなりません。
注意:
シングルユーザーモードでは、適切な Adabas ニュークリアス JCL をユーザープログラムの JCL に組み込む必要があります。 これには、アソシエータ、データストレージ、WORK データセット、およびプロテクションログやコマンドログのための任意のデータセット用に Adabas データセットを定義するためのジョブ制御ステートメントが含まれます。 Adabas ランタイムジョブ制御要件の詳細については、「Adabas セッションの実行」を参照してください。
注意:
z/VM 機能を使用するユーザープログラムは、シングルユーザーモードの Adabas
ニュークリアスにアクセスすることはできません。
OpenEdition z/OS 環境で実行されているクライアントは Adabas にアクセスできます。 OpenEdition アプリケーションには Adabas へのコールが含まれており、ADALNK(オプション1)またはADAUSER(オプション2)とリンクすることができます。
次の理由から、OpenEdition アプリケーションを ADAUSER とリンクする(オプション2)ことを推奨します。
アプリケーションが、特定のデータベース ID とSVC 番号、または Adabas リリースに結合されません。
DDPRINT 出力によって、エラーの場合の診断情報と同様に、使用されたデータベース ID と SVC 番号についての情報が提供されます(オプション1 を使用すると DDPRINT 出力は失われます)。
プログラムが階層ファイルシステム(HFS)で占有するスペースがと小さくなります。
Adabas コールを含む OpenEdition アプリケーションはモジュール ADALNK とリンクすることができます。 リンクしたモジュールの ADABAS CSECT の特定のオフセットに、データベースID と SVC 番号を ZAP する必要があります。オフセットについては、『Adabas インストールマニュアル』の「Writing User Exits for an Adalink」を参照してください。
以下に示すサンプル ZAP とリンクジョブには、次のステップが含まれています。
COPYLNK:モジュール ADALNK を別のライブラリにコピーします。
ZAPLNK:コピーした ADALNK モジュールに ZAP します。
BINDAPP1:アプリケーションを ZAP した ADALNK とともに OpenEdition にリンク(バインド)します。
//* //* COPY AND RENAME ADALNK //* // COPYLNK EXEC PGM=IEBCOPY //INLIB DD DSN=ADABAS.load.library,DISP=SHR //OTLIB DD DSN=ADABAS.lnk.library,DISP=SHR //SYSPRINT DD SYSOUT=* //SYSIN DD * COPY INDD=INLIB,OUTDD=OTLIB SELECT MEMBER=((ADALNK,ADALNKOE,R)) /* //* //* ZAP DBID AND SVC INTO COPIED ADALNK //* // ZAPLNK EXEC PGM=IMASPZAP //SYSPRINT DD SYSOUT=* //SYSLIB DD DSN=ADABAS.lnk.library,DISP=SHR //SYSIN DD * NAME ADALNKOE ADABAS VER 0080 0001 DEFAULT DBID 1 VER 0084 0AF9 DEFAULT SVC 249 REP 0080 00D3 <====== CHANGE TO USER DBID (HERE DBID 211) REP 0084 0AE8 <====== CHANGE TO USER SVC (HERE SVC 232) /* //* //* BIND APPLICATION //* // BINDAPP1 EXEC PGM=IEWBLINK, // PARM='LIST,LET,XREF,MAP,CASE=MIXED' //SYSPRINT DD SYSOUT=* //SYSLMOD DD PATH='/u/group/user', // PATHOPTS=(OWRONLY,OCREAT,OTRUNC), // PATHMODE=(SIRWXU,SIRWXG,SIRWXO) //APPLIB DD DSN=your.appl.library,DISP=SHR //LNKLOAD DD DSN=ADABAS.lnk.library,DISP=SHR //SYSLIN DD * INCLUDE APPLIB(applname) INCLUDE LNKLOAD(ADALNKOE) ENTRY applent NAME oeappl(R) /*
Adabas コールを含んでいる OpenEdition アプリケーションはモジュール ADAUSER とリンクすることができます。
さらに、OpenEdition 階層ファイルシステム(HFS)にメンバ ddcard を設定し、クライアントに要求される ADARUN パラメータを含むようにする必要があります。例えば次のようなパラメータです。
ADARUN PROG=USER,DBID=211,SVC=232,MODE=MULTI
最初の Adabas コールの前に、アプリケーションは、現在のワーキングディレクトリをファイル ddcard があるディレクトリに設定しなければなりません(例:chdir() 関数を使用)。 アプリケーションが実行されると、Adabas は現在のワーキングディレクトリからメンバ ddcard を検索し、パラメータを抽出します。 さらに、Adabas は DDPRINT 出力を現在のワーキングディレクトリのメンバ ddprint に書き込みます。
注意:
メンバ名 ddcard および
ddprint は大文字/小文字が区別されます。 メンバ名 DDCARD
は有効ではないので、無視されます。
以下に示すサンプルリンクジョブには、次のステップが含まれています。
BINDAPP2 アプリケーションと ADAUSER を OpenEdition にリンク(バインド)します。
//* //* BIND APPLICATION //* // BINDAPP2 EXEC PGM=IEWBLINK, // PARM='LIST,LET,XREF,MAP,CASE=MIXED' //SYSPRINT DD SYSOUT=* //SYSLMOD DD PATH='/u/group/user', // PATHOPTS=(OWRONLY,OCREAT,OTRUNC), // PATHMODE=(SIRWXU,SIRWXG,SIRWXO) //APPLIB DD DSN=your.appl.library,DISP=SHR //ADALOAD DD DSN=ADABAS.load.library,DISP=SHR //SYSLIN DD * INCLUDE APPLIB(applname) INCLUDE ADALOAD(ADAUSER) ENTRY applent NAME oeappl(R) /*
どちらのオプションについても、OpenEdition シェル変数 STEPLIB は Adabas ロードライブラリへのアクセスを確実にするために設定しなければなりません。 以下に示すサンプルジョブでは、バッチモードで実行する OpenEdition から変数を設定します。
//* //OEBATCH EXEC PGM=BPXBATCH, // PARM='PGM /u/group/user/oeappl' //STDIN DD PATH='/u/group/user/oeappl.in',PATHOPTS=(ORDONLY) //STDOUT DD PATH='/u/group/user/oeappl.out', // PATHOPTS=(OWRONLY,OCREAT),PATHMODE=SIRWXU //STERR DD PATH='/u/group/user/oeappl.err', // PATHOPTS=(OWRONLY,OCREAT),PATHMODE=SIRWXU //STDENV DD * STEPLIB=ADABAS.load.library /* //
OpenEdition 環境で次のプログラムの実行に対するサポートはありません。
Adabas ニュークリアスまたはユーティリティ
シングルユーザーモードで実行するクライアント(MODE=SINGLE)
24 ビットアドレス処理モードで実行するクライアント(AMODE 24)