ユーザー出口とハイパー出口

このドキュメントでは Adabas でサポートされるユーザー出口とハイパー出口について説明します。

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


ユーザー出口の概要

ユーザー出口とは、ユーザーが作成するルーチンであり、ユーザーは、これにより Adabas ニュークリアスまたは Adabas ユーティリティが実行する処理に独自の処理を追加することができます。ユーザー出口は、ニュークリアスまたはユーティリティ入力パラメータで設定します。ユーザー作成ルーチンは、ニュークリアスまたはユーティリティの起動時に動的にロードされ、ニュークリアスまたはユーティリティの処理においてあらかじめ定義された過程で呼び出されます。

ルーチンは、C プログラミング言語で記述する必要があります。

ユーザー出口の実装形態は、共有ライブラリ(UNIX)、またはダイナミックリンクライブラリ(Windows)です。このため、ユーザー出口やハイパー出口のコンパイルとリンクには、対応するオプションを指定する必要があります共有ライブラリは、位置に依存しないコードにする必要があるため、コンパイラは PIC オプションを使用してコールする必要があります。ダイナミックリンクライブラリ(DLL)は、マルチスレッド用にコンパイルする必要があります。

Adabas はユーザー出口の場所を示す環境変数/論理名を使用します。詳細については、「ユーザー出口およびハイパー出口の作成と定義」を参照してください。

Adabas では、次のユーザー出口が使用できます。

ユーザー出口 説明
ニュークリアスユーザー出口 1 Adabas ダイレクトコール時のユーザー処理。ニュークリアス処理の前に実行されます(場所の指定には環境変数/論理名 ADAUEX_1 を使用)。
ニュークリアスユーザー出口 2 プロテクションログまたはコマンドログファイルのクローズ時のユーザー処理(場所の指定には環境変数/論理名 ADAUEX_2 を使用)。
ニュークリアスユーザー出口 4 CLOG 出力レコードに対するユーザー処理。CLOG ファイルに書き込まれる前に実行されます(場所の指定には環境変数/論理名 ADAUEX_4 を使用)。
ADACMP ユーザー出口 6 ADACMP 入力レコードに対するユーザー処理。ADACMP が圧縮を行う前に実行されます(場所の指定には環境変数/論理名 ADAUEX_6 を使用)。
ADAULD ユーザー出口 7 Adabas 圧縮レコードに対するユーザー処理。ADAULD 処理の前に実行されます(場所の指定には環境変数/論理名 ADAUEX_7 を使用)。
ニュークリアスユーザー出口 11 Adabas ダイレクトコール時のユーザー処理。ニュークリアス処理の前に実行されます(場所の指定には環境変数/論理名 ADAUEX_11 を使用)。
ニュークリアスユーザー出口 14 CLOG V6 出力レコードに対するユーザー処理。CLOG ファイルに書き込まれる前に実行されます(場所の指定には環境変数/論理名 ADAUEX_14 を使用)。
ニュークリアスユーザー出口 21 認証資格情報の設定。Adabas サーバー API 機能を使用します。
ADALNK ユーザー出口 0 ユーザー処理。Adabas コール実行の前に実行されます(場所の指定には環境変数/論理名 LNKUEX_0 を使用)。
ADALNK ユーザー出口 1 ユーザー処理。Adabas コール実行の後に実行されます(場所の指定には環境変数 LNKUEX_1 を使用)。
ADALNKX ユーザー出口 0 ユーザー処理。Adabas コール実行の前に実行されます(場所の指定には環境変数/論理名 LNKUEX_ACBX_0 を使用)。
ADALNKX ユーザー出口 1 ユーザー処理。Adabas コール実行の後に実行されます(場所の指定には環境変数 LNKUEX_ACBX_1 を使用)。
XA のユーザー出口 詳細については、このマニュアルの「XA サポート」を参照してください(場所の指定には環境変数/論理名 XAUEX_0 を使用)。

ニュークリアス起動時に、ユーザー出口は以下の形式の初期化コールで最初に呼び出されなくてはいけません。



uex_X (0, UEX_INIT*)

X はユーザー出口の番号を指し、1、2、4 のいずれかです。

構造体 UEX_INIT(adauex.h で定義されている)は Adabas とユーザー出口間の入出力値に使用します。入力パラメータはデータベース ID と現在のバージョンです。uex_type に UEX_REENTRANT または UEX_N_REENTRANT を設定することにより、ユーザー出口のコードをリエントラントにするかどうかを Adabas に通知する必要があります。ストレージクラスを自動にする変数だけを使用する場合は、そのコードをリエントラントにします。コードがリエントラントでない場合、そのユーザー出口がコールされると、順番に処理されますが、リエントラントの場合には並行して処理されます。

ユーザー出口の説明

ニュークリアスユーザー出口 1

説明

Adabas ニュークリアスユーザー出口 1 は、Adabas ダイレクト コール上のユーザー処理を実行するユーザー出口です。ルーチンは、コマンド処理の開始時にコールされます。指定された入力パラメータによって、ユーザー出口による Adabas コールのパラメータの変更やコールの拒否が可能になります。コールが拒否された場合は、そのコールを発行したユーザーに Adabas レスポンスコード 22(無効なコマンド)が返されます。

ユーザー出口では、コマンドコードを変更したり、Adabas コントロールブロックで指定されたバッファ長を変更したりすることはできません。これらの値を変更すると、コマンドを発行したユーザーに Adabas レスポンスコード 22(無効なコマンド)が返されます。

ニュークリアスユーザー出口 1 は、ADANUC で USEREXITS=1 と設定することによりアクティブになります。

入力パラメータ

Format: uex_1 ( pcb, pfb, prb, psb, pvb, pib, pcq )
pcb:
用途: Adabas コントロールブロック
  型: unsigned char *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し

Adabas コントロールブロックの構造については、『Adabas コマンドリファレンスマニュアル』を参照してください。

pfb:
用途: Adabas フォーマットバッファ
  型: unsigned char *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し

pcb が 0 ポインタの場合、pfb は UEX_INIT 構造をポイントします(初回コール時)。

prb:
用途: Adabas レコードバッファ
  型: unsigned char *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し
psb:
用途: Adabas サーチバッファ
  型: unsigned char *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し
pvb:
用途: Adabas バリューバッファ
  型: unsigned char *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し
pib:
用途: Adabas ISN バッファ
  型: unsigned char *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し
pcq:
用途: Adabas コマンドキューエレメント
  型: struct cq_entry *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し

Adabas コマンドキューエレメントの詳細については、ヘッダーファイル adauex.h を参照してください。

戻り値

ユーザー出口戻り値は、基本的に Adabas レスポンスコードです。

ADA_NORMAL: 成功。
ニュークリアスは、コントロールブロック内で無効な変更が行われていないかどうかチェックします。無効な変更が検出されなかった場合、このコールは処理されます。
その他: 失敗。
Adabas コールは拒否され、レスポンスコード 22(無効なコマンド)が返されます。

ニュークリアスユーザー出口 2

説明

Adabas ニュークリアスユーザー出口 2 は、コマンドログファイル(CLOG)またはプロテクションログファイル(PLOG)を閉じるときにユーザー処理を実行するユーザー出口です。このユーザー出口は、次の状況でファイルが閉じられた後にコールされます。

  • ニュークリアスがシャットダウンした(ADAOPR SHUTDOWN または CANCEL 機能)

  • PLOG/CLOG が強制変更された(ADAOPR FEOF 機能)

  • PLOG/CLOG が自動変更された(新しいエクステント)

  • オンラインダンプ後に新しい PLOG が作成された(ADABCK NEW_PLOG 機能)

  • 自動再スタート中

このユーザー出口は、(ADADEV などによる)PLOG のアーカイブにも使用されます。

ニュークリアスユーザー出口 2 は、ADANUC で USEREXITS=2 と設定することによりアクティブになります。

入力パラメータ

Format: uex_2 ( sess_num, dbid, env_var_cnt, logname, status )
sess_num:
用途: PLOG セッション番号
  型: int *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し

sess_num は、ニュークリアスセッションの番号です。値がゼロの場合は、現在の PLOG がクローズされたことを示します。ポインタが 0 の場合、これは INIT-call となります。この場合、次のパラメータは UEX_INIT 構造をポイントします。

dbid:
用途: データベース ID
  型: int *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し

dbid は、データベース ID のポインタです。sess_num が 0 ポインタの場合、UEX_IMT 構造体を指します(初期コール時)。

env_var_cnt:
用途: 環境変数カウンタ
  型: int
  アクセスの種類: 読み込み
  値の渡し方: 値渡し

env_var_cnt は、現在の環境変数カウンタです。複数の環境変数を使用する場合に指定します。PLOG の場合、NUCPLG が 1、NUCPLG2 が 2、NUCPLG3 が 3 のようになります。ユーザー出口では、PLOG のパス名を取得するために環境変数を変換することが可能です。

logname:
用途: セクション内のファイル名
  型: char *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し

logname は、ディスクセクション内の PLOG/CLOG の名前です(PLG.15 または PLG.11(3) など)。logname は、セクションのパス名とともに ADADEV により直接使用され、PLOG/CLOG が閉じた状態でもそれらを保存できます。

status:
用途: コールのステータス
  型: int
  アクセスの種類: 読み込み
  値の渡し方: 値渡し

status は、ユーザー出口がコールされたタイミングを示します。PLOG/CLOG の変更時には UEX2_SWITCH、ニュークリアスセッションの終了時には UEX2_SHUTDOWN、自動再スタート中のクラッシュ後にニュークリアスが起動したときは、UEX2_AUTORESTART となります。

戻り値

ユーザー出口の戻り値は、基本的に Adabas レスポンスコードです。

ADA_NORMAL: 正常終了。
その他: 失敗。
Adabas ニュークリアスはユーザー出口リターンコードを含むメッセージを出力します。ユーザー出口は無効になり、以降はコールされなくなります。

ニュークリアスユーザー出口 4

説明

Adabas ニュークリアスユーザー出口 4 は、CLOG 出力レコードに対するユーザー処理を、レコードが CLOG ファイルに書き込まれる前に実行します。このユーザー出口では、レコードの短縮、拡張、および完全な変更が可能です。レコードの長さまたは構造が変更された場合、CLOG を出力するために使用する ADACLP ユーティリティは、作成されたレコードを出力できなくなる場合があります。CLOG レコードが書き込まれたときにユーザー出口がアクティブな場合、警告メッセージが発行されます。

ニュークリアスユーザー出口 4 は、ADANUC で USEREXITS=4 と設定することによりアクティブになります。

入力パラメータ

Format: uex_4 ( pcl, pcq, pdsc)
pcl:
用途: CLOG 出力レコード
  型: struct cl_entry *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し

CLOG レコードの構造については、adauex.h に含まれる CL_ENTRY の構造体定義を参照してください。

CLOG レコードの先頭 2 バイトにはレコード長が含まれます。ADACLP の情報が含まれる 3 バイト目および 4 バイト目は、変更しないでください。この 2 バイトは、ユーザー出口ルーチンへのコール後に、ニュークリアスによって以前の状態に戻されます。

ユーザー出口入力レコードの長さは、拡張しないでください。ユーザー出口から追加のデータを返すには、追加のディスクリプタを使用しなければなりません。返される CLOG レコードの長さに追加バッファの長さを加えた値が、32763 バイト以内である必要があります。これは、CLOG に書き出すことができる最大レコード長です。Adabas ニュークリアスはユーザー出口リターンコード 0 を含むメッセージを出力します。ユーザー出口は無効になり、以降はコールされなくなります。

CLOG レコードが省略される場合、ユーザー出口は、長さを含むレコードの先頭 2 バイトをゼロにセットする必要があります。

pcq:
用途: Adabas コマンドキューエレメント
  型: struct cq_entry *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し

pcl が 0 ポインタの場合、pcl は UEX_INIT 構造をポイントします(初回コール時)。

Adabas コマンドキューエレメントの構造については、ユーザー出口 1 の説明を参照してください。

pdsc:
用途: バッファディスクリプタ
  型: struct cl_dcs *
  アクセスの種類: 書き込み
  値の渡し方: 参照渡し

pdsc は、構造のアドレスを示します。この構造には、CLOG レコードの追加データが含まれるバッファが記述されます。バッファは長さとポインタで指定されます。このバッファに含まれる情報は、pcl パラメータで指定された CLOG 出力レコードに付加されます。

戻り値

ユーザー出口の戻り値は、基本的に Adabas レスポンスコードです。

ADA_NORMAL: 正常終了。
その他: 失敗。
Adabas ニュークリアスはユーザー出口リターンコードを含むメッセージを出力します。ユーザー出口は無効になり、以降はコールされなくなります。

ADACMP ユーティリティユーザー出口 6

説明

ADACMP ユーティリティユーザー出口 6 は、ADACMP 入力レコード上で圧縮前にユーザー処理を実行するユーザー出口です。このユーザー出口では、レコードの変更やスキップ、追加レコードの挿入、圧縮処理の終了が可能です。実行される処理はユーザー出口の戻り値で示され、この値が ADACMP ユーティリティによって解釈されます。

ユーティリティユーザー出口 6 は、ADACMP の USEREXIT オプションを設定することによりアクティブになります。

入力パラメータ

Format: uex_6 ( in_st , out_st )
in_st:
用途: ユーザー出口 6 の入力構造
  型: struct ue6_in *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し
out_sc:
用途: ユーザー出口 6 の出力構造
  型: struct ue6_out *
  アクセスの種類: 書き込み
  値の渡し方: 参照渡し

戻り値

ユーザー出口の戻り値は、出力構造内に返されます。

UE6_O_PROCESS: このレコードを圧縮します。
UE6_O_SKIP: このレコードを圧縮せずにスキップします。
UE6_O_TERM: レコードの圧縮を直ちに終了します。
UE6_O_REPEAT: 同じ入力レコードを使用して再度ユーザー出口をコールします。

上記の定数の定義、構造体 ue6_in、構造体 ue6_out については、インクルードファイル adauex.h を参照してください。

その他の情報

ユーザー出口ルーチンは C で記述する必要があります。ルーチンはダイナミックにロードされます。

ADACMP は、各入力レコードを読み込んだ直後にユーザー出口ルーチンに制御を渡します。ユーザールーチンでは、レコードの修正、拡張、短縮が可能です。また、ADACMP に対して処理されないレコードを示します。ユーザー出口内で作成された追加レコードを ADACMP に渡すこともできます。

入力パラメータブロックへのポインタおよび出力パラメータブロックへのポインタは、各コールで渡されます(詳細については、ヘッダーファイル adauex.h を参照してください)。各コールに対する入力レコードエリアの長さおよびアドレスは、ADACMP によって指定されます。入力ファイル内にエンドオブファイル条件が検出された場合、ADACMP は入力ステータスを UE6_I_EOF に、入力レコード長を 0 に設定します。ユーザー出口では、出力エリアのアドレスおよび出力レコード長を ADACMP に返す前に、これらを出力パラメータブロックに配置する必要があります。デフォルトでは、ADACMP は入力長と入力エリアおよび出力長と出力エリアを同じ値に設定します。レコードが変更されないように、ユーザールーチンは戻り命令のみを実行する必要があります。レコードが ADACMP による処理対象ではない場合は、出力ステータスを UE6_O_SKIP に設定する必要があります。

ユーザー出口では、ADACMP が現在のレコードを処理したら(次のレコードを読み込まずに)、直ちにユーザー出口に制御を渡すように設定することができます。これは、ADACMP に制御が戻る前に、出力ステータスを UE6_O_REPEAT に設定することによって行われます。この方法は、ユーザー出口内で作成されたレコードを ADACMP に渡すために使用できます。

出力ステータスでユーザー出口が UE6_O_TERM を返した場合、これ以上レコードは処理されません。

typedef struct ue6_in
{

  unsigned long             ue6_i_status;
#define UE6_I_NORMAL        1                /* standard call               */
#define UE6_I_EOF           2                /* call after EOF on input     */
#define UE6_I_REPEAT        3                /* repeat call on same record  */
                                             /* because of previous output  */
                                             /* status UE6_O_REPEAT

  unsigned long             ue6_i_len;       /* length of input record      */
  unsigned char*            ue6_I_ptr;       /* pointer to input record     */
} UE6_IN;
typedef struct ue6_out
{
  unsigned long             ue6_o_status;
#define UE6_O_PROCESS       1                /* process (compress) record   */
#define UE6_O_SKIP          2                /* skip this record            */
#define UE6_O_TERM          3                /* terminate compression       */
#define UE6_O_REPEAT        4                /* call again before reading   */
                                             /* next record from input file */

  unsigned long             ue6_o_len;       /* length of output record     */
  unsigned char*            ue6_o_rec;       /* pointer to output record    */
} UE6_OUT;

#include <adabas.h>
#include <adauex.h>

#define  PERS_ID_OFFSET              0
#define  SEX_OFFSET                 69
#define  FULL_ADDRESS_OFFSET        76
#define  ADDRESS_LENGTH             20
#define  CITY_COUNTRY_DISPLACEMENT  30
/*+
**      NAME:
**              uex_6 - adabas user exit 6 example
**
**      SYNOPSIS:
**              int     uex_6 ()
**
**      DESCRIPTION:
**              This USEREXIT requires uncompressed records
**              of the example file EMPLOYEES as input.
**
**              It changes the personnel-id for all employees
**              coming from Denmark (DK) and United States (USA).
**              The personnel-id is changed in the way that for
**              all female employees from Denmark the personnel-id
**              starts with "40", for all male employees with "41".
**              For all female employees in the United States the
**              personnel-id starts with "20", for all male
**              employees with "21".
**              Additionally all employees from Spain are rejected
**              and therefore those records are not compressed.
**
**      RETURN VALUES:
**              always 0
**
**      FUNCTIONS USED:
**              none.
**
-*/

#ifdef __STDC__

int uex_6 (struct ue6_in* ue6_in_ptr, struct ue6_out* ue6_out_ptr)

#else

int uex_6 (ue6_in_ptr, ue6_out_ptr)

UE6_IN  *ue6_in_ptr;
UE6_OUT *ue6_out_ptr;

#endif
{

  register unsigned char *country_ptr;
  register unsigned char *field_ptr;
  register unsigned char  mu_field_count;

  if (ue6_in_ptr->ue6_i_status == UE6_I_NORMAL)
  {

    /*
    ** calculate address of country in input record
    */

    field_ptr      =  ue6_in_ptr->ue6_i_ptr + FULL_ADDRESS_OFFSET;
    mu_field_count = *field_ptr;
    country_ptr    =  field_ptr + 1 + mu_field_count * ADDRESS_LENGTH +
                      CITY_COUNTRY_DISPLACEMENT;
    if (memcmp(country_ptr, "E  ", 3) == 0)
    {
      /*
      ** mark records of spanish employees to be skipped
      */

      ue6_out_ptr->ue6_o_status = UE6_O_SKIP;
    }
    else if ((memcmp(country_ptr, "USA", 3) == 0) ||
             (memcmp(country_ptr, "DK ", 3) == 0))
    {
      /*
      ** modify personnel id for employees from denmark and USA
      */

      field_ptr  = ue6_out_ptr->ue6_o_ptr + PERS_ID_OFFSET;

      if (memcmp(country_ptr, "USA", 3) == 0)
      {
        *field_ptr = '2';
      }
      else
      {
        *field_ptr = '4';
      }

      if (*(ue6_out_ptr->ue6_o_ptr + SEX_OFFSET) == 'F')
      {
        *(field_ptr + 1) = '0';
      }
      else
      {
        *(field_ptr + 1) = '1';
      }
    }
  }
  else
  {

    /*
    ** signal termination of processing caused by EOF of input file
    */

    ue6_out_ptr->ue6_o_status = UE6_O_TERM;
  }
  return(0);
}

ADAULD ユーティリティユーザー出口 7

説明

ADAULD ユーティリティユーザー出口 7 は、Adabas の圧縮レコードに対するユーザー処理を、ADAULD ユーティリティでレコードがアンロードされる前に実行します。ユーザー出口では、レコードの変更やスキップ、アンロード処理の終了が可能です。実行される処理はユーザー出口の戻り値で示され、この値が ADAULD ユーティリティによって解釈されます。

ユーティリティユーザー出口 7 は、ADAULD の USEREXIT オプションを設定することによりアクティブになります。

入力パラメータ

Format: uex_7 ( in_st, out_st )
in_st:
用途: ユーザー出口 7 の入力構造
  型: struct ue7_in *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し
out_st:
用途: ユーザー出口 7 の出力構造
  型: struct ue7_out *
  アクセスの種類: 書き込み
  値の渡し方: 参照渡し

戻り値

ユーザー出口の戻り値は、出力ステータスフィールド内に返されます。

UE7_O_PROCESS: このレコードをアンロードします。
UE7_O_SKIP: このレコードをアンロードせずにスキップします。
UE7_O_TERM: レコードのアンロードを直ちに終了します。

上記の定数の定義、構造体 ue7_in、構造体 ue7_out については、インクルードファイル adauex.h を参照してください。

ユーザー出口 7 のパラメータブロック

typedef struct ue7_in
{
  unsigned long          ue7_i_len;        /* length of input record         */
  unsigned char*         ue7_i_ptr;        /* pointer to input record        */
} UE7_IN;

typedef struct ue7_out
{

  unsigned long          ue7_o_status;
#define UE7_O_PROCESS    1                 /* process (unload) this record)  */
#define UE7_O_SKIP       2                 /* skip this record               */
#define UE7_O_TERM       3                 /* terminate unload               */
} UE7_OUT;

#include <adabas.h>
#include <adauex.h>

#define FEMALE            'F'
#define MALE              'M'

#define REC_LNG            2     /* Record starts with two byte length field */
#define ISN_LNG            4     /* Next four bytes represent ISN            */
#define PERS_ID_LNG        9     /* Next nine bytes represent personnel id   */

#define FULL_NAME_OFFSET   (REC_LNG + ISN_LNG + PERS_ID_LNG)
                                             /* Offset to FULL-NAME group    */
#define EMPTY_FIELD_IND    0xC0              /* Indicator for empty NU-field */
/*+
**      NAME:
**              uex_7 - adabas user exit 7 example
**
**      SYNOPSIS:
**              int     uex_7 ()
**
**      DESCRIPTION:
**              This USEREXIT requires compressed records
**              of the example file EMPLOYEES as input.
**
**              It unloads all records of female employees and skips
**              all other records of male employees. If a value different
**              from 'F' or 'M' is found ADAULD is terminated.
**
**      RETURN VALUES:
**              always 0
**
**      FUNCTIONS USED:
**              none.
**
-*/

#ifdef __STDC__

int uex_7 (struct ue7_in* ue7_in_ptr, struct ue7_out* ue7_out_ptr)

#else

int uex_7 (ue7_in_ptr, ue7_out_ptr)

UE7_IN  *ue7_in_ptr;
UE7_OUT *ue7_out_ptr;

#endif
{
  register unsigned char *field_ptr;

  /*
  ** skip to first field of FULL-NAME group
  */

  field_ptr =  ue7_in_ptr->ue7_i_ptr + FULL_NAME_OFFSET;
  if (*field_ptr & EMPTY_FIELD_IND)
  {
    /*
    ** one empty NU-field (see FDT), skip to NAME-field
    */

    field_ptr += 1;
  }
  else
  {
    /*
    ** it's a length indicator, skip to NAME-field
    */

    field_ptr += *field_ptr;
  }

  field_ptr += *field_ptr;
                 /* Add length byte of NAME-field, skip to MIDDLE-NAME-field */

  if (*field_ptr & EMPTY_FIELD_IND)
  {
    /*
    ** one empty NU-field (see FDT), skip to MARRIAGE-STATE-field
    */

    field_ptr += 1;
  }
  else
  {
    /*
    ** it's a length indicator, skip to MARRIAGE-STATE-field
    */

    field_ptr += *field_ptr;
  }

  field_ptr += 1;                                        /* Skip to SEX-field */

  if (field_ptr < (ue7_in_ptr->ue7_i_ptr + ue7_in_ptr->ue7_i_len))
  {
    if (*field_ptr == FEMALE)
    {
        return(0);                         /* Female employee, unload record */
    }
    else if (*field_ptr == MALE)
    {
      ue7_out_ptr->ue7_o_status = UE7_O_SKIP;
      return(0);                          /* Male employee, skip this record */
    }
  }

  /*
  ** something is wrong, terminate ADAULD
  */

  ue7_out_ptr->ue7_o_status = UE7_O_TERM;
  return(0);
}

ニュークリアスユーザー出口 11

説明

Adabas ニュークリアスユーザー出口 11 は、Adabas ダイレクトコール上のユーザー処理を実行するユーザー出口です。ルーチンは、コマンド処理の開始時にコールされます。指定された入力パラメータによって、ユーザー出口による Adabas コールのパラメータの変更やコールの拒否が可能になります。コールが拒否された場合は、そのコールを発行したユーザーに Adabas レスポンスコード 22(無効なコマンド)が返されます。

このユーザー出口の機能は、ユーザー出口 1 の機能と同じです。ただし、ユーザー出口 11 は新しいバージョン 6 の Adabas 構造を使用しています。

ユーザー出口では、コマンドコードを変更したり、Adabas コントロールブロックで指定されたバッファ長を変更したりすることはできません。これらの値を変更すると、コマンドを発行したユーザーに Adabas レスポンスコード 22(無効なコマンド)が返されます。

ニュークリアスユーザー出口 11 は、ADANUC で USEREXITS=11 と設定することによりアクティブになります。

入力パラメータ

Format: uex_11 ( pacbx, pcb, pcq6, num_abd, patb_abd)
pacbx:
用途: 新しい Adabas コントロールブロック
  型: struct adacbx *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し

Adabas コントロールブロックの構造については、『Adabas コマンドリファレンスマニュアル』を参照してください。

pcb:
用途: 古い Adabas コントロールブロック
  型: struct cb_par *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し

Adabas コントロールブロックの構造については、『Adabas コマンドリファレンスマニュアル』を参照してください。

pcq6:
用途: Adabas コマンドキューエレメント V6
  型: struct v6_cq_entry *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し

Adabas コマンドキューエレメントの詳細については、ヘッダーファイル adauex.h を参照してください。

num_abd:
用途: Adabas バッファディスクリプタ(ABD)の数
  型: int
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 値渡し
patb_abd:
用途: ABD リストへのポインタ
  型: char *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し

ACBX、ABD および ABD リストの構造については、『Adabas コマンドリファレンスマニュアル』を参照してください。

戻り値

ユーザー出口戻り値は、基本的に Adabas レスポンスコードです。

ADA_NORMAL: 成功。
ニュークリアスは、コントロールブロック内で無効な変更が行われていないかどうかチェックします。無効な変更が検出されなかった場合、このコールは処理されます。
その他: 失敗。
Adabas コールは拒否され、レスポンスコード 22(無効なコマンド)が返されます。

ニュークリアスユーザー出口 14

説明

Adabas ニュークリアスユーザー出口 14 は、バージョン 6 レイアウトの CLOG 出力レコードに対するユーザー処理を、レコードが CLOG ファイルに書き込まれる前に実行します。このユーザー出口では、レコードの短縮、拡張、および完全な変更が可能です。レコードの長さまたは構造が変更された場合、新しいタイプの CLOG を出力するために使用する PRILOGC ユーティリティは、作成されたレコードを出力できなくなる場合があります。CLOG レコードが書き込まれたときにユーザー出口がアクティブな場合、警告メッセージが発行されます。

ニュークリアスユーザー出口 14 は、ADANUC で USEREXITS=14 と設定することによりアクティブになります。

入力パラメータ

Format: uex_14 ( pclx, pbuf, pcq6)
pclx:
用途: CLOG レイアウト 6 出力レコード
  型: struct clx_entry *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し

CLOG レイアウト 6 レコードの構造については、adauex.h に含まれる CLX_ENTRY の構造体定義を参照してください。

CLOG レコードの先頭 2 バイトにはレコード長が含まれます。PRILOGC の情報が含まれる 3 バイト目および 4 バイト目は、変更しないでください。この 2 バイトは、ユーザー出口ルーチンへのコール後に、ニュークリアスによって以前の状態に戻されます。

ユーザー出口入力レコードの長さは、拡張しないでください。ユーザー出口から追加のデータを返すには、追加のディスクリプタを使用しなければなりません。返される CLOG レコードの長さに追加バッファの長さを加えた値が、32763 バイト以内である必要があります。これは、CLOG に書き出すことができる最大レコード長です。Adabas ニュークリアスはユーザー出口リターンコード 0 を含むメッセージを出力します。ユーザー出口は無効になり、以降はコールされなくなります。

CLOG レコードが省略される場合、ユーザー出口は、長さを含むレコードの先頭 2 バイトをゼロにセットする必要があります。

pclx が 0 ポインタの場合、pclx は UEX_INIT 構造体をポイントします(初回コール時)。

pbuf:
用途: バッファポインタ
  型: char *
  アクセスの種類: 書き込み
  値の渡し方: 参照渡し

pdsc は、構造のアドレスを示します。この構造には、CLOG レコードの追加データが含まれるバッファが記述されます。バッファは長さとポインタで指定されます。このバッファに含まれる情報は、pcl パラメータで指定された CLOG 出力レコードに付加されます。

pcq6:
用途: Adabas コマンドキューエレメント V6
  型: struct v6_cq_entry *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し

Adabas コマンドキューエレメントの詳細については、ヘッダーファイル adauex.h を参照してください。

戻り値

ユーザー出口戻り値は、基本的に Adabas レスポンスコードです。

ADA_NORMAL: 正常終了。
その他: 失敗。
Adabas ニュークリアスはユーザー出口リターンコードを含むメッセージを出力します。ユーザー出口は無効になり、以降はコールされなくなります。

ニュークリアスユーザー出口 21

説明

Adabas ニュークリアスユーザー出口 21 を使用し、ADABAS サーバー API 機能を介して認証資格情報を設定することができます。ルーチンは、セッション処理の開始時にコールされます。

このルーチンはできる限り短期間で使用する必要があります。これは、すべてのアプリケーションが Adabas セキュリティの認証機能を使用およびサポートするまでの、移行期間中の使用を目的としています。

指定された入力パラメータによって、ユーザー出口は、Adabas コールパラメータを分析してコール元のアプリケーションを識別し、適切な資格情報を設定するかコールを拒否します。コールが拒否された場合は、そのコールを発行したユーザーに Adabas レスポンスコード 200(セキュリティ違反)が返されます。

ニュークリアスユーザー出口 21 は、ADANUC で USEREXITS=21 と設定し、環境変数 ADAUEX_21 を設定すれば、アクティブになります。

入力パラメータ

Format: int uex_21 (uex21, uex_init)
uex21:
用途: オブジェクトの処理
  型: struct SECUEXStruct *
  アクセスの種類: 読み込み
  値の渡し方: 参照渡し

Adabas コントロールブロックの構造については、『Adabas コマンドリファレンスマニュアル』を参照してください。

uex_init:
用途: 初期化インジケータ
  型: struct uex_init *
  アクセスの種類: 読み込み/書き込み
  値の渡し方: 参照渡し

戻り値

ユーザー出口の戻り値で、認証処理の進行方法が決まります。

SECUEX_SUCCESS: 成功。
認証処理は、提供された資格情報で続行されます。
SECUEX_FAILED: 失敗。
Adabas コールは拒否され、レスポンスコード 200(セキュリティ違反)が返されます。

ユーザー出口 21 のパラメータブロック

struct SECUEXStruct {

    SECUEXPrivate * privatedata;	/* For Internal Use Only */

    unsigned int  secdbid;		/* database id */
    FNR           secfnr;		/* file number */
    UQID          secuqid;		/* s-node, s-user, s-tid */

    int (*set_uid_psw)   (SECUEX * su, char * uid, char * psw);
    int (*get_acbx)      (SECUEX * su, ACBX * acbx);
    int (*is_natural)    (SECUEX * su);
    int (*is_sql_gateway)(SECUEX * su);
};

関数/メソッド

ユーザー出口には、Adabas セッションの識別を可能にする次の機能があります。

  • *set_uid_psw セッションの資格情報を設定します。

  • *get_acbx セッションの ACBX コントロールブロックを取得します。

  • *is_natural コールが Natural アプリケーションから発行されたのかどうかを判断します。

  • *is_sql_gateway コールが SQL ゲートウェイアプリケーションによって発行されたかどうかを判断します。

機能
*set_uid_psw セッションの資格情報を設定します。
パラメータ
SECUEX * su オブジェクトの処理
  char * uid ユーザー ID の参照
  char * psw パスワードの参照
戻り値
SECUEX_SUCCESS 機能は正常に終了しました。
  SECUEX_INVALID_PARAM オブジェクトの処理が無効または欠落しています。
  SECUEX_INVALID_INTERNAL 内部エラー – 予期しない値
  SECUEX_INVALID_HEADER 内部エラー - 無効なセキュリティバッファ
  SECUEX_BUFFER_OVERFLOW 内部エラー - セキュリティバッファオーバーフロー
機能
*get_acbx セッションの ACBX コントロールブロックを取得します。
パラメータ
SECUEX * su オブジェクトの処理
  char * acbx struct ACBX の参照
戻り値
SECUEX_SUCCESS 機能は正常に終了しました。
  SECUEX_INVALID_PARAM オブジェクトの処理が無効または欠落しています。
  SECUEX_INVALID_INTERNAL 内部エラー – 予期しない値

Adabas コントロールブロックの構造については、『コマンドリファレンス』ドキュメントを参照してください。

機能
*is_natural コールが Natural アプリケーションから発行されたのかどうかを判断します。
パラメータ
SECUEX * su オブジェクトの処理
戻り値
SECUEX_TRUE コール元のアプリケーションは Natural です。
  SECUEX_FALSE コール元のアプリケーションは Natural ではありません。
  SECUEX_INVALID_PARAM オブジェクトの処理が無効または欠落しています。
  SECUEX_INVALID_INTERNAL 内部エラー – 予期しない値
機能
*is_sql_gateway コールが SQL ゲートウェイアプリケーションによって発行されたかどうかを判断します。
パラメータ
SECUEX * su オブジェクトの処理
戻り値
SECUEX_TRUE コール元のアプリケーションは SQL ゲートウェイです。
  SECUEX_FALSE コール元のアプリケーションは SQL ゲートウェイではありません。
  SECUEX_INVALID_PARAM オブジェクトの処理が無効または欠落しています。
  SECUEX_INVALID_INTERNAL 内部エラー – 予期しない値

#include <adauex.h>

/*
**  NAME:
**      uex_21 - Adabas Security Exit Example
**
**  SYNOPSIS:
**      int uex_21 ()
**      SECUEX   *   Pointer to SECUEX Data and Methods
**      UEX_INIT *   Pointer to UEX Initialization Mode
**
**  DESCRIPTION:
**      This user exit is called before an Adabas call is processed.
**
**      It provides the Security credentials,
**      which are to be used for authentication in this session.
**
**      Because no global variables are used, this exit flags
**      in init call to inform the Adabas nucleus that reentrant
**      code is being used.
**
**      To create a shared library that includes this user exit, 
**      the makefile can be used.
**
**      Call:         	make   -f makefile uex21   (Unix)
**                     	nmake -f makefile uex21   (Windows)
**
**  RETURN VALUES:
**
**      SECUEX_SUCCESS
**      SECUEX_FAILED
*/

#ifdef __STDC__

int uex_21 (SECUEX    * uex21,
            UEX_INIT  * uex_init)

#else

int uex_21 (uex21,
            uex_init)
SECUEX    * uex21;
UEX_INIT  * uex_init;

#endif

{
  int rc;
  if (uex21 == 0)
  {
    /*
    **  User-Exit Initialization during Nucleus Startup
    **
    **  Indicate whether the user-exit is reentrant or not
    **  - UEX_REENTRANT
    **  - UEX_N_REENTRANT
    */
    uex_init->uex_type = UEX_REENTRANT;

    return ( SECUEX_SUCCESS );
  }

  else

  {
    /*
    **  AuthN Processing - during Session Initialization
    **
    **  Provide security credentials or not
    **  This can be based on the values in ACBX and UQID values
    **  which can be retrieved as needed (optional)
    **
    **  Note:
    **  Not providing security credentials
    **  will result a security violation "unable to authenticate".
    **
    */
    ACBX  acbx;
    char uid[32];
    char psw[32];

    /*
    ** Retrieve Session-Specific information
    */

    /* ACBX values */
    rc = uex21->get_acbx (uex21, &acbx);
    if (rc != SECUEX_SUCCESS)
    {
      return( SECUEX_FAILED );
    }

   /*
    ** Reject commands from users with names starting with 'h'
    */
    if ( uex21->secuqid.tid[0] == 'h' )
    {
      return( SECUEX_FAILED );
    }

    /*
    ** Reject acess to dbid=200
    ** where users names start with 'h'
    */
    if ((acbx.acbxdbid == 200 ) && (uex21->secuqid.tid[0] == 'h'))
    {
      return( SECUEX_FAILED );
    }

    /*
    ** Set Application-Specific credentials
    */
    strcpy (uid,"uexuid");
    strcpy (psw,"uexpsw");

    /* NATURAL */
    rc = uex21->is_natural (uex21);
    if (rc == SECUEX_TRUE)
    {
      strcpy (uid,"NATuid");
      strcpy (psw,"NATpsw");
    }

    /* SQL Gateway */
    rc = uex21->is_sql_gateway (uex21);
    if (rc == SECUEX_TRUE)
    {
      strcpy (uid,"SQLuid");
      strcpy (psw,"SQLpsw");
    }

    /*
    ** Set Security Credentials: userid, password
    */
    rc = uex21->set_uid_psw (uex21, uid, psw);
    if (rc != SECUEX_SUCCESS)
    {
      return( SECUEX_FAILED );
    }
  }

  return ( SECUEX_SUCCESS );       /* provided Security Credentials */
}

ADALNK 指定ユーザー出口

概要

ADALNK のユーザー出口は、実行時に制御を要求したり、コントロールブロックなどの Adabas パラメータを変更したりするどのアプリケーションにも使用できます。

このユーザー出口は、ニュークリアスユーザー出口 1 と同様に、パラメータとして Adabas バッファを指定して呼び出します。ユーザー出口は、Adabas コールがニュークリアスに渡される前と Adabas コールが実行された後に有効になります。ADALNK 指定ユーザー出口は、ユーザー処理のコンテキストで実行する点がニュークリアスユーザー出口 1 と異なります。

ADALNK 固有のユーザー出口の実装形態は、共有ライブラリ(UNIX)またはダイナミックリンクライブラリ(Windows)です。ADALNK 固有のユーザー出口のコンパイル方法とリンク方法については、「ユーザー出口およびハイパー出口の作成と定義」を参照してください。

シグナルハンドラについての注意(UNIX)

Adabas コールがアプリケーション定義のシグナルハンドラで使用され、ADALNK ユーザー出口が確立された場合に、シグナルハンドラからのコールに対するユーザー出口が開始されない場合があります。この状況は、シグナルハンドラからのコールの発生時にユーザー出口の別のコールがアクティブになっている場合に発生します。

Adabas コールがアクティブな状態でシグナルハンドラがユーザーアプリケーションを終了した場合、次の状況が発生する可能性があります。

  1. ユーザー出口 0 がすでにコールされているが、Adabas コールがニュークリアスに渡されていない。

  2. ニュークリアスは Adabas コールの結果を返すが、ユーザー出口 1 はコールされていない。

例外ハンドラについての注意(Windows)

Adabas コールがアプリケーション定義の例外ハンドラで使用され、ADALNK ユーザー出口が確立された場合に、例外ハンドラからのコールに対するユーザー出口が開始されない場合があります。この状況は、例外ハンドラからのコールの発生時にユーザー出口の別のコールがアクティブになっている場合に発生します。

Adabas コールがアクティブな状態で例外ハンドラがユーザーアプリケーションを終了した場合、次の状況が発生する可能性があります。

  1. ユーザー出口 0 がすでにコールされたが、Adabas コールがニュークリアスに渡されない。

  2. ニュークリアスは Adabas コールの結果を返したが、ユーザー出口 1 がコールされない。

入力パラメータ

Format:  int  lnkuex_{0 | 1} (cb,fb,rb,sb,vb,ib)

入力パラメータについては、ニュークリアスユーザー出口 1 を参照してください。

戻り値

ユーザー出口の戻り値は、基本的に Adabas レスポンスコードです。

ADA_NORMAL: 正常終了。
その他: 失敗。
レスポンスコードは Adabas コントロールブロックに格納されます。lnkuex_0 の場合、コールが直ちにユーザーに返される。RC コールの場合、レスポンスコードが 0 に設定される。

ADALNK 指定ユーザー出口と ADALNK 間のリンクの作成

ADALNK に相当するユーザー出口と ADALNK 自体をリンクするには、次の環境変数が設定されている必要があります。

  • データベースアクセス前の ADALNK 内のユーザー出口

     setenv LNKUEX_0 lnk_uex.sl (UNIX)

    または

     set LNKUEX_0=lnk_uex.dll (Windows)

    注意:
    デフォルトのエントリ関数名は 'lnkuex_0(...)' です。

  • データベースアクセス後の ADALNK 内のユーザー出口

     setenv LNKUEX_1 lnk_uex.sl (UNIX)

    または

     set LNKUEX_1=lnk_uex.dll (Windows)

    注意:
    デフォルトのエントリ関数名は 'lnkuex_1(...)' です。

次のように、各 ADALNK 指定ユーザー出口に個別のエントリ関数を定義することもできます。

 setenv LNKUEX_0 "lnk_uex.sl xx_uex_0" (UNIX)
 setenv LNKUEX_1 "lnk_uex.sl yy_uex_1"

または

 set LNKUEX_0=lnk_uex.dll xx_uex_0 (Windows)
 set LNKUEX_1=lnk_uex.dll yy_uex_1

graphics/ueh01.png

ハイパー出口の概要

サブディスクリプタやスーパーディスクリプタと同様に、ハイパーディスクリプタはファイルの FDT 内の親フィールドに基づいて作成されます。ただし、ハイパーディスクリプタのディスクリプタ値は、ユーザー定義のアルゴリズムを使用して作成されます。検索条件では、生成されたハイパーディスクリプタ値を指定します。ただし、ハイパーディスクリプタが HE オプションで定義されている場合を除きます。この場合は、親フィールドの値を指定します。

ハイパー出口は、ハイパーディスクリプタ値の ISN を変更できます。別のファイルに属する ISN も指定できます。このようにすれば、フォーマットバッファを使用せずに、ハイパーディスクリプタを含むファイルで検索を実行できます。結果のレコードを読み取るには、ファイル番号を、ハイパーディスクリプタに関連付けられた ISN が含まれているファイルのファイル番号に変更する必要があります。この機能を使用する際に、そのようなファイルをロードするときに、ADACMP と ADAMUP に USERISN パラメータを指定することが重要です。指定しないと、ハイパー出口で生成された ISN が適合しなくなります。

このアルゴリズムはハイパー出口と呼ばれるユーザー定義の共有ライブラリまたは DLL に実装されています。C プログラミング言語で記述する必要があります。ハイパー出口機能の基本出力は、1 つ以上のハイパーディスクリプタ値です。

ハイパー出口は、ユーティリティの起動時またはニュークリアスで初めてアクセスされるときに動的にロードされます。ハイパーディスクリプタ値が生成、削除、更新されるたびに呼び出されます。また、HE オプションが指定されたハイパーディスクリプタが、検索コマンドで使用された場合にも呼び出されます。

graphics/ueh02.png

ハイパー出口は、次の処置を行うためにコールされます。

  • ハイパー出口の初期化。下記にリストされた処理の 1 つのためにニュークリアスによって初めて使用される前、またはハイパーディスクリプタがファイルの FDT に存在する場合のユーティリティの実行中に行われます。

  • レコード挿入コマンド:ハイパー出口は "アフターイメージコール" としてコールされ、インバーテッドリストに挿入されるハイパーディスクリプタ値を生成します。FDT に定義されているすべてのハイパーディスクリプタに対して、適切な出口関数がコールされます。

    注意:
    ハイパーディスクリプタのすべての親フィールドが NU/NC オプションで定義されている場合やこれらのフィールドに値が存在しない場合、出口関数はコールされません。

  • レコード削除コマンド:ハイパー出口は "ビフォーイメージコール" としてコールされ、インバーテッドリストから削除されるハイパーディスクリプタ値を生成します。FDT に定義されているすべてのハイパーディスクリプタに対して、適切な出口関数がコールされます。

  • レコード更新コマンド:1 つ以上のハイパーディスクリプタの親フィールドが変更された場合、インバーテッドリスト内のハイパーディスクリプタ値を変更するために、関連するハイパー出口が 2 回コールされます("ビフォーイメージコール" として 1 回、"アフターイメージコール" として 1 回)。

  • 検索コマンド用のハイパーディスクリプタ値の生成(1 つの親フィールドを持ち、HE オプションで定義されたハイパーディスクリプタのみ)。

ハイパーディスクリプタは、次のユーティリティで使用されます。

  • ADAINV で次の処理を実行する場合:

    • 新しいハイパーディスクリプタのインバート

    • ハイパーディスクリプタの再インバート/確認

  • ADACMP:FDT にハイパーディスクリプタの指定が含まれる場合のハイパーディスクリプタ値の生成

  • ADAULD:FDT にハイパーディスクリプタの指定が含まれる場合のハイパーディスクリプタ値の生成

ハイパー出口は、"アフターイメージ" コールと "ビフォーイメージ" コールに同じ値を生成することが重要です。そうしないと、Adabas はハイパーディスクリプタ値を削除できません。つまり、ハイパーディスクリプタ値が変化するような変更をハイパー出口に加えた後は、影響を受けるハイパーディスクリプタを再インバートする必要があります。

ハイパー出口は、リエントラントインターフェイスまたは非リエントラントインターフェイスを使用して操作できます。非リエントラントインターフェイスの場合は、親フィールド値および生成されたハイパーディスクリプタ値のハイパー出口バッファが、ユーザーのハイパー出口モジュール内に配置されます。この場合、ハイパー出口へのコールは連続します。

リエントラントインターフェイスの場合、バッファはニュークリアスまたはユーティリティ内に配置されます。したがって、複数のコマンドが同じハイパー出口にアクセスしようとしたときに、リエントラントハイパー出口を並行して呼び出すことができます。これにより、非リエントラントバージョンと比較してパフォーマンスが向上します。リエントラントハイパー出口の実装では、ストレージクラススタティックの変数は、初期化中にのみ更新できます。

ヒント:
Adabas キットには、ハイパー出口用のサンプル C ファイルが含まれています。これらは、インストールディレクトリのサブディレクトリ「Adabas/examples/server」にあります。

FDT でハイパーディスクリプタを指定する方法の詳細については、「FDT のレコード構造」の「ハイパーディスクリプタ」を参照してください。

ハイパー出口コントロールブロックとバッファ

ハイパー出口機能の概要を次に示します。

#include <adahyx.h>

void hyx_<number> ( HYCB_ENTRY* hy_cb )

hy_cb は、ハイパー出口コントロールブロックへのポインタです。この C 定義は、インストールディレクトリのサブディレクトリ「Adabas/inc」にあるヘッダーファイル adahyx.h 内にあります。

ハイパー出口コントロールブロックには、ハイパー出口およびニュークリアスがハイパーディスクリプタを扱うために必要な情報がすべて含まれています。次の図にその構造を示します。

graphics/ueh03.png

ハイパー出口コントロールブロック

変数 説明
hy_structure 符号なしの char

ハイパーディスクリプタインターフェイスの構造レベルを定義します。将来的に構造が変更される可能性があります。そのため、Adabas は、サポートされているバージョンのハイパーディスクリプタインターフェイスが使用されているかどうかを確認できます。実際の構造レベルは 2 です。現在サポートされている他の構造レベルはありません。

hy_ctype 符号なしの short

実行されるコールのタイプを定義します。

0 値の生成コール
1 値の生成コール繰り返し
2 初期化コール
3 初期化コールの繰り返し

ユーティリティの初期化中、またはニュークリアスで初めてハイパーディスクリプタが処理されるときに、初期化コールが実行されます。

ハイパー出口で親フィールドとハイパーディスクリプタの定義に関する詳細情報が必要な場合に、ハイパー出口レスポンスコード hy_rsp を 1 に設定できます。Adabas が初期化コールを繰り返し実行します。

Adabas が親値をハイパーディスクリプタ値に変換する必要がある場合は、値生成コールを実行します。複数のハイパーディスクリプタ値を生成する場合、ハイパー出口は複数の呼び出しで値を提供できます。追加の値を生成する場合は、ハイパー出口で hy_rsp を 1 に設定する必要があります。このようにすれば、Adabas は値生成コールを繰り返し実行します。

hy_context 符号なしの short

値生成コールのコンテキストを定義します。

0 ビフォーイメージ値
1 アフターイメージ値
2 サーチバッファ値

ビフォーイメージ値は、ディスクリプタ値をインデックスから削除する必要がある場合に使用されます。

アフターイメージ値は、ディスクリプタ値をインデックスに挿入する必要がある場合に使用されます。

サーチバッファ値は、検索処理の検索条件で HE オプションを使用するハイパーディスクリプタが指定されている場合に使用されます。

hy_dbid 符号なしの short

ハイパー出口をコールしたデータベースを定義します。

hy_fnr 符号なしの short

ハイパーディスクリプタのファイル番号を定義します。

hy_hyname char[2]

ハイパーディスクリプタの名前を定義します。

hy_rsp 符号なしの short

このレスポンスによって、ハイパーディスクリプタのハイパー出口は、正常終了コードやエラーレスポンスコードを返すことができます。エラーは Adabas ニュークリアスのレスポンスコード 86 に変換され、ハイパー出口の値はコントロールブロックのアディション 2 フィールドに返されます。初期化コールの間、ユーティリティやニュークリアスはエラーで終了します。

レスポンスコードとその意味は次のとおりです。

0

正常終了

1

繰り返しコールが必要です

2~255

Adabas 用に予約済み

>=256

ユーザーエラー

hy_mode 符号なしの short

これは、初期化コールにより設定されます。出口ルーチンがリエントラントか非リエントラントかを定義します(詳細については、「リエントラント/非リエントラントインターフェイス」を参照してください)。

0 (HY_NREENTRANT):非リエントラント
1 (HY_REENTRANT):リエントラント

hy_dptr unsigned char *

データバッファポインタ。

hy_dlng 符号なしの int

データバッファ長サポートされる最大長は、65535 です。

hy_isn  

データレコードの ISN です。ハイパーディスクリプタ値の ISN は変更可能です。Adabas は、ISN がファイルに指定された MAXISN の値以下であるかどうかについてはチェックしません。

hy_iptr 符号なしの int *

ISN バッファポインタ。

hy_ilng 符号なしの int

ISN バッファ長。サポートされる最大長は、65535 です。

hy_icnt 符号なしの int

ISN 値の個数。この数の ISN が ISN バッファに収まる必要があります。4 * hy_icnt は hy_ilng 以下にする必要があります。

hy_xptr unsigned char *

インデックスバリューバッファポインタ。

hy_xcnt 符号なしの int

返されたインデックス値の数。

hy_xlng 符号なしの int

インデックスバリューバッファ長。

hy_pcnt 符号なしの int

PE インデックスバッファで返される PE インデックスの数です。ハイパーディスクリプタがオプション PE で定義されている場合、この値は hy_xcnt と等しくなる必要があります。ただし、サーチバッファ値のコールでは、PE インデックスバッファは無視されます。

hy_plng 符号なしの int

PE インデックスバッファ長。

hy_pptr unsigned char *

PE インデックスバッファポインタ。

hy_fprt unsigned char *

フォーマットバッファポインタ。

初期化コールの間、ハイパー出口はフォーマットバッファを指定することができます。このフォーマットバッファは、ハイパー出口がコールされる前に、親フィールドのデータ値を圧縮解除してバッファに格納するために使用されます。ユーザーは、フォーマットバッファを使用してデフォルトのフォーマットバッファをオーバーライドすることができます。

hy_flng 符号なしの int

フォーマットバッファ長。

初期化コールの繰り返し用のデータバッファ

初期化コールの繰り返しでは、Adabas はデータバッファで親フィールドとハイパーディスクリプタに関する情報を提供します。この情報のレイアウトは、コマンドオプション S を使用した LF コマンドのレコードバッファと同じです(詳細については『コマンドリファレンス』の「LF コマンド」を参照してください)。

バイト数 説明
1~2

情報の合計長

3~4

エントリ数

5~n

各親フィールドの 1 つの F エレメント

(n + 1)~m

ハイパーディスクリプタの H エレメント

値生成コール用のデータバッファ

値生成コール/値生成コールの繰り返し用のデータバッファでは、Adabas は、初期化コール/初期化コールの繰り返しのフォーマットバッファ仕様に従って、ハイパーディスクリプタを挿入します。

ISN バッファ

値生成コール/値生成コールの繰り返しでは、ハイパーディスクリプタ値に関連付けられている ISN を定義する方法が 2 つあります。

  1. このコールで生成されたすべてのハイパーディスクリプタ値に、同じ ISN が使用されます。この場合、ISN は hy_isn で指定する必要があり、hy_icnt を 0 にする必要があります。

  2. この呼び出しで生成されたハイパーディスクリプタ値には、異なる ISN が使用されます。この場合、コールによって生成された各ディスクリプタ値について、ISN バッファに ISN が挿入されている必要があります。hy_icnt が hy_xcnt と等しくなっている必要があります。

インデックスバリューバッファ

値生成コール/値生成コールの繰り返しでは、ハイパー出口がハイパーディスクリプタ値を生成する必要があります。hy_xcnt には、生成されたハイパーディスクリプタ値の数を設定する必要があります。ハイパーディスクリプタ値は、ハイパーディスクリプタ定義で指定されたフォーマットで生成される必要があります。

以下の例に、インデックスバッファの生成方法を示します。

例 1:

H1,10,A=HYPER(1,AA)

graphics/ueh08.png

例 2:

H2,20,A,MU=HYPER(1,MU)

graphics/ueh09.png

2 つのハイパーディスクリプタ値を生成するには、インデックスバリューバッファの長さを少なくとも 40 バイトにする必要があります。生成されるハイパーディスクリプタ値の最大数がより大きい場合は、それに応じて大きいインデックスバリューバッファを定義する必要があります。

PE インデックスバッファ

ハイパーディスクリプタがオプション PE で定義されている場合、ハイパーディスクリプタは、値生成コール/値生成コールの繰り返しの PE インデックスバッファにあるハイパーディスクリプタ値に対応する、PE インデックスを生成する必要があります。PE インデックスの数は、生成されるハイパーディスクリプタ値の数と同じになっている必要があります。PE インデックスは 1 バイトのバイナリとして保存されます。255 より大きい PE インデックスはサポートされません。

ただし、サーチバッファ値コールに対しては、ハイパー出口は PE インデックスを提供できません。このような場合は、ユーザーのサーチバッファの PE インデックスが付加されます。

パック値およびアンパック値の整合性チェックが行われます。可変長の値については、この値のフォーマットで指定できる最大の長さ以内であるかどうかがチェックされます。

次の例に、オプション PE で定義されたハイパーディスクリプタに対して、どのようにインデックスバリューバッファと PE インデックスバッファが生成される必要があるかを示します。

例:

H3,40,A,PE=HYPER(1,P1)

graphics/ueh10.png

2 つのハイパーディスクリプタ値を生成するには、インデックスバリューバッファの長さを少なくとも 80 バイトにし、PE インデックスバッファの長さを少なくとも 2 にする必要があります。生成されるハイパーディスクリプタ値の最大数がより大きい場合は、それに応じて大きいインデックスバリューバッファおよび PE インデックスバッファを定義する必要があります。

フォーマットバッファ

初期化コール/初期化コールの繰り返しでは、ハイパー出口の値生成コールの前に親フィールド値の圧縮解除に使用する、フォーマットバッファを提供できます。フォーマットバッファの構文は、「コマンドリファレンス」の「Adabas の呼び出し」、「フォーマットバッファとレコードバッファ」のフォーマットバッファ構文で説明されているものと同じですが、許可されるフィールド定義には次の制限があります。

  • 親フィールドのみ指定できます。

  • 親フィールドがピリオディックグループに属している場合は、そのピリオディックグループのピリオディックグループカウントを指定できます。

フォーマットバッファが指定されていない場合、Adabas は、各親フィールドに次のフォーマットバッファ要素が含まれる、フォーマットバッファを想定します。

  • ピリオディックグループに属していない非 MU 親フィールド:name

  • ピリオディックグループに属していない MU 親フィールド:nameC,name1-N

  • ピリオディックグループ PG に属している非 MU 親フィールド PA:PGC,PA1-N

  • ピリオディックグループに PG に属している MU 親フィールド PA:PGC,PA1C,PA1(1-N),PA2C,PA2(1-N),…

次に、デフォルトのバッファエレメントの使用例を示します。これらの例では、次に示す FDT が使用されています。

01,AA,0,A
01,MU,10,B,MU
01,PG,PE
 02,PP,40,A
 02,PM,20,B,MU
      .
      .
      .

例 1:

H1,10,A=HYPER(1,AA)

親フィールド AA は MU フィールドではなく、ピリオディックグループ内にはありません。そのため、デフォルトのフォーマットバッファは次のようになります。

AA.

graphics/ueh04.png

必要な長さ = 予想される最大値の長さ + 1。

例 2:

H2,20,A,MU=HYPER(1,MU)

MU は、ピリオディックグループ内の MU フィールドではありません。そのため、デフォルトのフォーマットバッファは次のようになります。

MUC,MU1-N.

graphics/ueh05.png

必要な長さは、予想される最大 MU カウントに依存します。この例では、MU カウントが 3 で、必要なバイト数は 31 です。

例 3:

H3,40,A,PE=HYPER(1,PP)

PP は PE 内の非 MU フィールドです。そのため、デフォルトのフォーマットバッファは次のようになります。

PGC,PP1-N.

graphics/ueh06.png

必要な長さは、予想される最大ピリオディックグループカウントに依存します。この例では、ピリオディックグループカウントが 2 で、必要なバイト数は 81 です。

例 4:

H4,40,A,PE,MU=HYPER(1,PM)

親フィールドはピリオディックグループ内の MU フィールドです。そのため、デフォルトのフォーマットバッファはピリオディックグループカウントに依存します。この例では、ピリオディックグループカウントが 2 で、フォーマットバッファは次のようになります。

PGC,PM1C,PM1(1-N),PM2C,PM2(1-N).

graphics/ueh07.png

データバッファの必要な長さは、予想される最大ピリオディックグループカウントと予想される MU カウントによって異なります。PGC=2、PM1C=1、PM2C=2 のサンプルデータでの必要な長さは 63 です。

ハイパー出口インターフェイス

リエントラント/非リエントラントインターフェイス

ハイパー出口は、リエントラントインターフェイスまたは非リエントラントインターフェイスを使用して実装できます。

コンピュータルーチンは、安全に同時に実行できる場合、リエントラントと呼ばれます。つまり、ルーチンがすでに別のスレッドで実行されていても、再入力できます。リエントラントハイパー出口の実装では、ストレージクラススタティックの変数は、初期化中にのみ更新できます。そうしないと、1 つのスレッドが別のスレッドによって作成されたデータを上書きする可能性があります。これは、コール元のニュークリアスまたはユーティリティがハイパー出口バッファを提供する必要があることも意味します。ハイパー出口を呼び出す各スレッドは、専用ハイパー出口バッファを提供する必要があります。例外はフォーマットバッファです。常にハイパー出口によって常に提供されます。これは初期化中にのみ使用されるので、リエントラントインターフェイス用にも使用されます。

非リエントラントインターフェイスの場合、Adabas がハイパー出口コールをシリアル化します。このハイパー出口コールのシリアル化によって、パフォーマンスが低下する可能性があります。この場合、使用するハイパー出口バッファは、ハイパー出口によって提供される必要があります。

ハイパー出口バッファの処理が異なる場合は、リエントラントまたは非リエントラントのハイパー出口のために、異なるコールを異なる方法で実装する必要があります。

初期化コールでは、リエントラントモードまたは非リエントラントモードのどちらで実行しているかを、ハイパー出口が通知します。リエントラントモードでは、フィールド「hy_mode」を HY_REENTRANT(リエントラントバージョン用)に設定する必要があります。非リエントラントモードの場合、hy_mode は HY_N_REENTRANT と等しくなっている必要があります。これがデフォルトです。

ハイパー出口コール

以下で出力パラメータとして記載されていない、ハイパー出口コントロールブロックのフィールドは、ハイパー出口コールの最中に変更しないでください。

初期化コール

入力パラメータ(リエントラントおよび非リエントラント)
hy_ctype

初期化コールの場合、この値は 2 です。

hy_dbid

データベースの番号。

hy_fnr

ハイパーディスクリプタの番号。

hy_hyname

ハイパーディスクリプタの名前。

出力パラメータ(非リエントラント)
hy_structure

実際の構造番号は 2 です。

hy_rsp

成功コードまたはエラーのレスポンスコード。

特に、初期化コール hy_rsp=1 で使用して、「初期化コールの繰り返し」を開始することができます。

初期化コールの間に hy_rsp > 1 の場合、ユーティリティやニュークリアスはエラーで終了します。(レスポンス 79 - ハイパー出口は使用不可)。ニュークリアスログが次のエラーメッセージを取得します:%ADANUC-W-HYERR, HYPER userexit, descriptor HY, file ..., reason=....

hy_mode

HY_N_REENTRANT

hy_dlng

データバッファ長親フィールドに十分な大きさのデータバッファを定義する必要があります。

hy_dptr

親フィールド値のデータバッファポインタ。

hy_flng

フォーマットバッファが指定されていない場合、独自のフォーマットバッファ長または 0。

hy_fptr

フォーマットバッファが指定されていない場合、独自のフォーマットバッファポインタまたは NULL。

フォーマットバッファ

独自のフォーマットバッファ(オプション)。

出力パラメータ(リエントラント)
hy_structure

実際の構造番号は 2 です。

hy_rsp

成功コードまたはエラーのレスポンスコード。

特に、初期化コール hy_rsp=1 で使用して、「初期化コールの繰り返し」を開始することができます。

初期化コールの間に hy_rsp > 1 の場合、ユーティリティやニュークリアスはエラーで終了します。(レスポンス 79 - ハイパー出口は使用不可)。ニュークリアスログが次のエラーメッセージを取得します:%ADANUC-W-HYERR, HYPER userexit, descriptor HY, file ..., reason=....

hy_mode

HY_REENTRANT

hy_dlng

データ転送バッファ長。初期化コールで、データバッファ長を設定する必要があります。

hy_xlng

インデックスバリューバッファ長

hy_ilng

ISN バリューバッファ長(0 = 使用しない)。

hy_plng

ピリオディックグループインデックスバッファ長(0 = 使用しない)。

hy_flng

フォーマットバッファが指定されていない場合、独自のフォーマットバッファ長または 0。

hy_fptr

フォーマットバッファが指定されていない場合、独自のフォーマットバッファポインタまたは NULL。

フォーマットバッファ

独自のフォーマットバッファ(オプション)。

初期化コール(繰り返し)

初期化コールで hy_rsp が 1 に設定されている場合、Adabas は hy_ctype=3 でハイパー出口コールを再度呼び出します。上記で説明したように、Adabas は、データバッファを使用して、ハイパーディスクリプタおよび親フィールドの情報を返します。

値生成コール

入力パラメータ(非リエントラント)
hy_ctype

0 は値生成コールを示します。

hy_dbid

データベース ID です。

hy_fnr

ハイパーディスクリプタが含まれるファイルのファイル番号。

hy_hyname

ハイパーディスクリプタの名前。

hy_dlng

データバッファ長

hy_dptr

データバッファへのポインタ。

hy_isn

レコードの ISN。

データバッファ

親フィールド値。

出力パラメータ(非リエントラント)
hy_rsp

成功コードまたはエラーのレスポンスコード。

特に、値生成コール hy_rsp=1 で使用して、「値生成コールの繰り返し」を開始することができます。

hy_rsp > 1 の場合、ハイパー出口はエラーのレスポンスコードを返します。エラーは Adabas ニュークリアスのレスポンスコード 86 に変換され、ハイパー出口の値はコントロールブロックのアディション 2 フィールドに返されます。

hy_cnt

インデックス値の数。

hy_xlng

インデックスバリューバッファの長さ。

hy_xptr

インデックスバッファへのポインタ。

hy_icnt

ISN 値の数(0 = 使用しない)。

hy_ilng

ISN バッファ長(0 = 使用しない)。

hy_iptr

ISN バッファへのポインタ

hy_pcnt

PE インデックスの数(0 = 使用しない)。

hy_plng

PE インデックスバッファの長さ(0 = 使用しない)。

hy_pptr

PE インデックスバッファへのポインタ(空値 = 使用しない)。

インデックスバリューバッファ

上で説明されているハイパーディスクリプタ値。

ISN バッファ

各ディスクリプタ値に関連付けられている ISN(オプション)。

PE インデックスバッファ

PE インデックス。オプション PE を指定してハイパーディスクリプタが定義されていて、かつサーチバッファ値コールがない場合にのみ使用します。

入力パラメータ(リエントラント)
hy_structure

実際の構造番号は 2 です。

hy_ctype

値生成コールの後は 0 です。

hy_dbid

データベースの番号。

hy_fnr

ハイパーディスクリプタが含まれるファイルのファイル番号。

hy_hyname

ハイパーディスクリプタの名前。

hy_dptr

親フィールド値へのポインタ。

hy_dlng

データ転送バッファ長。

hy_isn

レコードの ISN。

hy_ilng

ISN バッファの長さ。

hy_iptr

ISN バッファへのポインタ

hy_xlng

インデックスバリューバッファの長さ。

hy_xptr

インデックスバリューバッファへのポインタ。

hy_plng

ピリオディックカウントバッファ長。

hy_pptr

ピリオディックカウントバッファへのポインタ。

出力パラメータ(リエントラント)
hy_rsp

成功コードまたはエラーのレスポンスコード。

特に、値生成コール hy_rsp=1 で使用して、「値生成コールの繰り返し」を開始することができます。

hy_rsp > 1 の場合、ハイパー出口はエラーのレスポンスコードを返します。エラーは Adabas ニュークリアスのレスポンスコード 86 に変換され、ハイパー出口の値はコントロールブロックのアディション 2 フィールドに返されます。

hy_icnt

ISN 値の数。

hy_xcnt

インデックス値の数。

hy_pcnt

ピリオディックカウント値の数。

インデックスバリューバッファ

上で説明されているハイパーディスクリプタ値。

ISN バッファ

各ディスクリプタ値に関連付けられている ISN(オプション)。

PE インデックスバッファ

各ディスクリプタ値に関連付けられている ISN(オプション)。

値生成コールの繰り返し

値生成コール中に hy_rsp が 1 に設定されている場合、Adabas はインデックス値を処理してから、hy_ctype=1 を使用して、同じデータバッファ内容(リエントラントおよび非リエントラント)でハイパー出口を再び呼び出します。これで、ハイパー出口ではより多くのハイパーディスクリプタ値を生成したり、異なる ISN のハイパーディスクリプタ値を生成したりできるようになります。

ユーザー出口およびハイパー出口の作成と定義

ニュークリアスおよびユーティリティは、USEREXIT パラメータ(ADACMP または ADADCU ユーティリティ)を使用してユーザー出口をアクティブにします。このパラメータが設定されると、ユーザー出口は処理の特定のポイントでコールされます。

ハイパー出口は、ハイパーディスクリプタが定義されているファイルが更新されるとアクティブになります。

ユーザー出口およびハイパー出口は、次の手順を実行して定義できます。

  1. ユーザー出口またはハイパー出口を、C プログラミング言語で記述します。ヘッダーファイル adauex.h(ユーザー出口用)および adahyx.h(ハイパー出口用)を使用する必要があります。

    これらの出口は、デフォルトの関数名を使用して記述することもできます。表記規則として、"uex_" または "hyx_" の後にユーザー出口番号かハイパー出口番号を付加します。次に例を示します。

    uex_1()       /* Default name user exit 1 */
    {}
    
    hyx_4()       /* Default name hyperexit 4 */
    {}

    環境変数/論理名を設定すれば、他の名前も使用できます(手順 4 を参照)。

  2. ユーザー出口またはハイパー出口のソースファイルをコンパイルします。位置非依存コードのオプションを使用する必要があります。

  3. ユーザー出口またはハイパー出口を共有ライブラリとしてリンクします。共有ライブラリの作成に使用するリンクオプションは、マシン依存です。

  4. 共有ライブラリを環境変数/論理名に関連づけて、ユーザー出口またはハイパー出口を Adabas で使用可能にします。共有ライブラリを含んでいるディレクトリが LD_LIBRARY_PATH(UNIX)または PATH(Windows)に含まれている場合、共有ライブラリのメンバ名を指定するか、または共有ライブラリの絶対パスを指定することができます。環境変数は、"ADAUEX_"(ユーザー出口用)または "ADAHYX_"(ハイパー出口用)です。それぞれユーザー出口番号またはハイパー出口番号を付加します。次に例を示します。

    csh の場合:

    setenv ADAUEX_1 userex1.sl  # connect user exit 1 (see note below)
    setenv ADAHYX_4 $ADADATADIR/exits/hypex4.sl   # connect hyperexit 4 (see note below)

    注:UNIX 系を使用している場合は、共有ライブラリの拡張子が "sl" または "so" になります。

    ksh の場合:

    ADAUEX_1=userex1.sl
    export ADAUEX_1

    Windows の場合:

    set ADAUEX_1=userex1.dll  # connect user exit 1
    set ADAHYX_4=%ADADATADIR%\exits\hypex4.dll   # connect hyperexit 4

    便宜上、ユーザー出口およびハイパー出口のデフォルトの関数名は次のように変更できます。

    my_uex_1 ()
    {}
    
    nga_hyx_4 ()
    {}
    
    setenv ADAUEX_1 "userex1.sl my_uex_1" (UNIX platforms)
    setenv ADAHYX_4 "$ADADATADIR/exits/hypex4.sl nga_hyx_4"
    
    set ADAUEX_1=userex1.dll;my_uex_1 (Windows)
    set ADAHYX_4=%ADADATADIR%\exits\hypex4.dll;nga_hyx_4

    ニュークリアスが、環境変数に指定された出口を見つけられない場合、次の手順で示されている検索を続行します。

  5. ハイパー出口の共有ライブラリがデフォルトのデータベースディレクトリに配置され、次の命名規則が使用されている場合は、ADAHYX 環境変数を省略できます。

    UNIX プラットフォーム:

    $ADADATADIR/db<xxx>/adahyx_<i>.<ext>

    xxx はデータベース ID、i はハイパー出口番号、ext は共有ライブラリの拡張子("sl" または "so")です。

    Windows:

    %ADADATADIR%\db<xxx>\adahyx_<i>.dll

    xxx はデータベース ID、i はハイパー出口の番号です。

    例(UNIX プラットフォーム):

    $ADADATADIR/db076/adahyx_1.sl

    例(Windows):

    %ADADATADIR%\db076\adahyx_1.dll

    共有ライブラリをロードするために、Adabas は最初に対応する ADAHYX 環境変数を取得します。環境変数が存在しない場合は、デフォルトのデータベースディレクトリ($ADADATADIR/db<xxx> または %ADADATADIR%\db<xxx>)内を探します。

Adabas キットには、必要とされる C ヘッダーファイル、ユーザー出口とハイパー出口のためのサンプルソース、および対応する makefile が含まれています。ADALNK ユーザー出口は、サーバープラットフォームと異なるプラットフォーム上で使用できるので、ADALNK ユーザー出口、対応する C ヘッダーファイル、および makefile は、Entire Net-Work でも提供されます(詳細については Entire Net-Work ドキュメントを参照)。

UNIX プラットフォーム

必要な C ヘッダーファイルは、ディレクトリ $ADAPROGDIR/inc および $ACLDIR/$ACLVERS/inc に置かれます。ニュークリアスおよびユーティリティのユーザー出口にはインクルードファイル adauex.h、ADALNK ユーザー出口には lnkuex.h、ハイパー出口には adahyx.h がそれぞれ必要です。

ニュークリアスユーザー出口 1、ニュークリアスユーザー出口 2、ニュークリアスユーザー出口 4、ADACMP ユーザー出口 6、ADAULD ユーザー出口 7、ハイパー出口 1 のサンプルソースファイル、およびそれらに対応する makefile は、$ADAPROGDIR/examples に置かれます。

これらのユーザー出口例の 1 つを構築するには、次のように入力します。

cd  $ADAPROGDIR/examples

make target

target には次のいずれかが入ります。

ユーザー出口/ハイパー出口 サンプルソースファイル名 target
ニュークリアスユーザー出口 1 adauex1.c uex1
ニュークリアスユーザー出口 2 adauex2.c uex2
ニュークリアスユーザー出口 4 adauex4.c uex4
ADACMP ユーザー出口 6 adauex6.c uex6
ADAULD ユーザー出口 7 adauex7.c uex7
ハイパー出口 1 adahyx1.c hyx1

ユーザー出口やハイパー出口のための共有ライブラリは $ADAPROGDIR/examples/server に作成されます。

ADALNK ユーザー出口 0 と ADALNK ユーザー出口 1 のサンプルソースファイル(ファイル名は lnkuex.c)および対応する makefile は $ACLDIR/examples に置かれます。

このユーザー出口例を構築するには、次のように入力します。

cd  $ACLDIR/examples/client

make lnkuex 

ユーザー出口用の共有ライブラリは $ACLDIR/examples に作成されます。

Windows プラットフォーム

必要な C ヘッダーファイルは、ディレクトリ %ADAPROGDIR%\inc および %ACLDIR%\inc に置かれます。ニュークリアスおよびユーティリティのユーザー出口にはインクルードファイル adauex.h、ADALNK ユーザー出口には lnkuex.h、ハイパー出口には adahyx.h がそれぞれ必要になります。

ニュークリアスユーザー出口 1、ニュークリアスユーザー出口 2、ニュークリアスユーザー出口 4、ADACMP ユーザー出口 6、ADAULD ユーザー出口 7、ハイパー出口 1 のサンプルソースファイル、およびそれらに対応する makefile は、%ADAPROGDIR%\examples に置かれます。

これらのユーザー出口例の 1 つを構築するには、次のように入力します。

cd  %ADAPROGDIR%\examples

nmake target

target には次のいずれかが入ります。

ユーザー出口/ハイパー出口 target
ニュークリアスユーザー出口 1 uex1
ニュークリアスユーザー出口 2 uex2
ニュークリアスユーザー出口 4 uex4
ADACMP ユーザー出口 6 uex6
ADAULD ユーザー出口 7 uex7
ハイパー出口 1 hyx1

ADALNK ユーザー出口 0 と ADALNK ユーザー出口 1 のサンプルソースファイル(ファイル名は lnkuex.c)および対応する makefile は $ACLDIR\examples に置かれます。

このユーザー出口例を構築するには、次のように入力します。

cd  %ACLDIR%\examples

nmake lnkuex 

ユーザー出口やハイパー出口の DLL は %ACLDIR%\examples に作成されます。

ニュークリアスがアクティブなときの新ハイパー出口

ニュークリアスがすでにアクティブな場合、ハイパー出口は、ユーティリティを介してアクティブにすることができます。これは、次の場合に実行できます。

  • 新しいファイルが定義されたとき(ADAFDU)、

  • ファイルがリストアまたはオーバーレイされたとき(ADABCK)、

  • ファイルがインポートされたとき(ADAORD)または

  • ADAINV を使用して既存のファイル用にハイパーディスクリプタが作成されたとき

初回の値生成コールを行う前に、ニュークリアスはハイパー出口を初期化します。

ADAFDU の場合、FDT にハイパーディスクリプタを含むファイルを定義するとき、有効な ADAHYX 環境変数をニュークリアスに転送することも可能です。

setenv ADAHYX_1 /user/adabas/hyper1.sl
setenv FDUFDT file20.fdt
adafdu < file20.fdu

ADAHYX 環境変数が指定されていない場合、またはファイルが ADABCK を使用してリストアされている場合、ニュークリアスは、ニュークリアス起動時に指定された場所でハイパー出口を検索します(上記を参照)。したがって、対応する共有ライブラリや DLL を該当するディレクトリに移動する必要があります。