ここでは、次の内容について説明します。
Oracle Tuxedo TxRPCは、『DCE: REMOTE PROCEDURE CALL』(Doc Code:P312 ISBN 1-872630-95-2)の第3章「Interface Definition Language」で説明されているIDL文法と関連機能をサポートしています。 この本は以下から入手できます。
X/OPEN Company Ltd (Publications)
P O Box 109
Penn
High Wycombe
Bucks HP10 8NP
United Kingdom
電話: +44 (0) 494 813844
FAX : +44 (0) 494 814989
X/OPENドキュメントは、Oracle Tuxedo製品が準拠し、その言語および規則の原典とするものです。 X/OPEN TxRPC IDL-onlyインタフェースがサポートされていることに注意してください。DCEバインドとランタイムに関するドキュメントの一部は適用されません。 X/OPENドキュメントはOSF DCE AES/RPCドキュメントを基本としています。 チュートリアル、プログラマーズ・ガイドとして入手可能な文献は多数ありますが、ほとんどのものには最新の機能は記載されていません。 OSFから入手できるプログラマーズ・ガイドとして、Prentice-Hallの『OSF DCE Application Development Guide』(Englewood Cliffs, New Jersey, 07632)があります。
『X/OPEN Preliminary Specification for TxRPC Communication Application Programming Interface』(TxRPC通信アプリケーション・プログラミング・インタフェースのためのX/OPEN予備仕様)もまたX/OPENから入手できます(上記を参照)。 TxRPCは、RPC用のトランザクション・サポートをオリジナルのX/OPEN RPCインタフェースに追加しています。
汎用一意識別子(UUID)はインタフェースを一意に識別するために使用します。 uuidgen
コマンドを実行してUUIDを生成します。 出力は次のようになります。
$ uuidgen -i > simp.idl $ cat simp.idl [uuid(816A4780-A76B-110F-9B3F-930269220000)] interface INTERFACE { }
次にこのテンプレートを使用して、型定義、定数、およびオペレーションを追加するアプリケーション用のIDL入力ファイルを作成します。
Oracle TuxedoとDCEの両方のuuidgen(1)
コマンドを利用できる場合は、DCEコマンドでテンプレートを生成する必要があります。DCEバージョンでは通常、以下で説明するとおり、ノード・アドレスを取得するためにマシン固有の手法を採用しています。
Oracle Tuxedoシステムのuuidgen
コマンドは、-s
オプション(初期化されたC構造体としてUUID文字列を生成する)と、-t
オプション(以前の形式のUUID文字列を新規形式に変換する)をサポートしていない点を除いて、DCEコマンドと同じです。インタフェースの詳細は、uuidgen(1)
のリファレンス・ページを参照してください。
uuidgen
コマンドは、ISO/IEC 8802-3 (ANSI/IEEE 802.3)に記載されているように48ビット・ノード・アドレスを要求します。 プラットフォームに依存せずにこの値を求める方法は存在しません。また一部のマシン(ワークステーションなど)ではまったく利用できないこともあります。 Oracle Tuxedoシステムのuuidgen
コマンドでは、次の手法が使用されています。
NADDR
環境変数がnum.num.num.num.num.num
の形式の値で設定されている場合、インターネット・スタイルのアドレスが採用され、48ビットのノード・アドレスに変換されます。ここでnum
は0と255を含む、0から255までの値です。 これにより8802-3ノード・アドレスの使用法に準拠できます。 また、このアドレスにアクセスできないユーザーも、インターネット・アドレス(8802-3アドレスと同じではない)等の別の値を利用できるようになります。 インターネット・アドレスを使用している場合、インターネット・アドレスは32ビット・アドレスなので、最後のnum.num
は0.0とします。
NADDR
環境変数が設定されておらず、WSNADDR
環境変数が0xnnnnnnnnnnnnnnnn
形式の値に設定されている場合、ワークステーションで使用されるような、16進数のネットワーク・アドレスが採用されることになります。 これは8802-3アドレスではなく、また最後の16ビットはゼロとして処理されることに注意してください。
NADDR
環境変数とWSNADDR
環境変数のいずれも設定されていない場合には、(またWindowsでない場合)、そのマシンのuname
を用いて/etc/hosts
内のマシン・エントリと照合し、インターネット・スタイルのアドレスを取得します。
上記のいずれにも当てはまらない場合、警告が表示され、アドレス00.00.00.00.00.00が採用されます。 これは、ユニークなUUIDを生成できる可能性が低くなるので望ましい方法ではありません。
IDLコンパイラはIDL文法を認識して、入力に基づいてスタブ関数を生成します。 文法とそのセマンティクスは、本章前半に記載したX/OPENリファレンスとOSF/DCEリファレンスの両方に詳しく説明されています。 次の項目で説明するいくつかの変更を加えることで文法はそのまま認識されます。
次にX/OPEN TxRPC仕様に定義されている基本X/OPEN RPC仕様に対する変更点を示します。
TxRPC仕様からの最も重要な拡張点は、IDLファイルのインタフェースとオペレーション属性に[transaction_optional]
と[transaction_mandatory]
属性を追加した点です。 [transaction_optional]
は、トランザクション内でRPCを実行する場合、トランザクションの一部としてリモート・サービスが実行されることを示します。 [transaction_mandatory]
属性ではトランザクション内でRPCが実行される必要があります。 これらの属性の指定がなければ、リモート・サービスはクライアントのトランザクションの一部ではありません。
X/OPEN TxRPC IDL-onlyでは型と属性のバインドは必須ではありません。 属性のバインドには、[handle]
、[endpoint]
、[auto_handle]
、[implicit_handle]
、および[explicit_handle]
があります。 これらの属性はtidl(1)
によって認識されますがサポートされていません(無視されます)。 handle_t
型に対しても特別な処理は行われません。ほかの定義済みの型と同様に受け渡され、ハンドルとしては処理されません。
X/OPEN TxRPC IDL-onlyではパイプは必須ではありません。tidl
は[local]
モードでしかパイプをサポートしません。つまり、パイプはヘッダー・ファイル用として指定できますが、スタブ生成用としては指定できません。
X/OPEN TxRPC IDL-onlyでは[idempotent]
、[maybe]
、および[broadcast]
属性は必須ではありません。 tidl(1)
はこれらの属性を無視します。
次にX/OPEN RPC仕様に対する強化を示します。 多くの場合、言語はC言語により密接に従うように拡張されており、ANSI CからIDLプロトタイプに変換することにより、既存インタフェースの移植を簡素化しています。
X/OPEN仕様では、文字定数と文字列は移植可能なセット、つまりスペース (0x20)からティルダ
(0x7e)までに制限されています。 OSF DCE RPCでは、文字セット(0x01から0xffまで)内のその他の文字の使用も認められています。
Cと同様、以下の演算子は区切り文字として扱われます。
││ && ? │ & _ == != = << >> <= >= < > + - % ! ~
つまり、これらのトークンの1つが先行するまたは後続する場合は、識別子または数字の前または後に空白を入れる必要はないということです。 IDL仕様では'a=b+3
'は認められず、'a = b + 3
'のように空白を入れる必要があります。 これはOSF DCE IDLコンパイラの動作によるものと思われます。
公開されているX/OPEN仕様では、フィールド名とパラメータ名に型名を使用できないという制約があります。 この制約により、すべての名前を単一のネームスペースに置くことができます。 この制約はC、C++またはOSF IDLコンパイラの仕様と整合性がないので、強制するものではありません。
X/OPEN仕様は、パラメータまたは関数の結果として匿名の列挙を認めておらず、またポインタのターゲットとして匿名構造体またはユニオンを認めていません。これらについてはOSF DCE IDLコンパイラでは認められています。これらの制約は強制されません。インタフェース名およびバージョンに基づく名前は、マーシャリング中に使用するために生成されます。
Cと同様に、列挙値(定数)は整数定数式で使用できます。 これはDCE IDLコンパイラの動作によるものと思われます。
現時点のX/OPEN RPC仕様の定義では、次のようにオペレーション宣言子の前にポインタを置くことは文法上認められません。
long *op(void);
また、構造体またはユニオンを返すことも認めていません。 すべてを定義済みの型に隠ぺいできるという点で正しいと考えられますが、DCE IDLコンパイラと、もちろんCコンパイラはより豊富なオペレーションを返すことを認めています。 サポートされている文法は以下のようになります。
[operation_attributes] <type_spec> <declarator>
この場合の<declarator>
は、<function_declarator>
を含む必要があります。<function_declarator>
が存在しない場合、変数は宣言されますが、結果としてエラーになります。オペレーションの配列または配列を戻すオペレーションを宣言することはともにこの文法で認められていて、宣言としては認識されますが、エラーのフラグが設定されます。
IDL <type_declaration>
が宣言子のリストを取るように、<ACS_type_declaration>
は<ACS_named_type>
値を取ります。これはDCE IDLコンパイラの動作によるものと思われます。
フィールド操作言語(FML:Field Manipulation Language)を使用して作成、操作されるフィールド化バッファは多くのOracle Tuxedoアプリケーションの不可欠の部分になっています。 フィールド化バッファは、IDLでは新しいベース・タイプとしてサポートされます。 フィールド化バッファは、16ビット・バッファについてはキーワードFBFR
で、32ビット・バッファはキーワードFBFR32
で示され、ポインタとして定義される必要があります(たとえばFBFR *
またはFBFR32 *
)。 フィールド化バッファはtypedef
でベース・タイプとして定義することはできません。 フィールド化バッファは、構造体のフィールドで、さらにパラメータとして使用できます。 フィールド化バッファは配列またはポインタ(完全ポインタまたは参照ポインタのいずれか)のベース・タイプとして使用できますが、 フィールド化バッファの整合配列と可変配列はサポートされません。
OSF IDLコンパイラでは、AES仕様またはX/OPEN RPC仕様にドキュメント化されていない制約がいくつか存在します。 Oracle TuxedoのIDLコンパイラではこれらの制約が強制されます。
[transmit_as()
]で使用する転送型には[represent_as
]属性を設定できません。
ユニオン・アームを[ref]ポインタにしたり、ユニオン・アームに[ref
]ポインタを含めることはできません。
整合配列と可変配列の両方あるいはいずれか一方が構造体に存在する場合は、配列サイズの属性変数はポインタにはできません。つまりポインタではなく、構造体内の整数要素である必要があります。
X/OPEN RPC仕様に対してOracle Tuxedoの4つの拡張機能が追加されており、これらは仕様をよりC言語に近づける一方で、OSF DCE IDLコンパイラではサポートされないためにIDLファイルの移植性に制限を加えることになります。
ANSI Cと同様に、文字列連結がサポートされます。 つまり、
const char *str = "abc" "def";
は、次と同じように扱われます。
const char *str = "abcdef";
エスケープ文字を使用した改行を文字列定数内で用いることができます。 つまり、
const char *str = "abc\ def";
は、次と同じように扱われます。
const char *str = "abcdef";
列挙値はユニオン・ケースでも使用でき、整数として扱われます。Cと同様に自動的に変換されます。
各<union_case_label>
の型を<switch_type_spec>
によって指定する必要があるという制約は設けていません。かわりに、C言語のswitch文のcase文で行われるような型の強制変換が行われます。
以下の7つの機能はtidl
コンパイラではサポートされていません。
移行属性[v1_struct]
、[v1_enum]
、[v1_string]
、[v1_array]
は認識されますが、サポートされていません。これらの属性はOSF IDL仕様にはありますが、X/OPEN仕様にはありません。
OSF/DCEと同様に[local]
モードでのみOSF/DCEドキュメントに定義された関数ポインタがサポートされます。
クライアントとサーバー間ではインタフェースのマイナー・バージョンまで完全に一致する必要があります。X/OPEN RPC仕様では、サーバーのマイナー・バージョンがクライアントのマイナー・バージョンよりも大きいか等しい場合も許可しています。
32ビット長のマシンでは、整数リテラル値は -2**31から2**31の範囲に制限されています。2**31+1から2**32-1の範囲のunsigned long整数値はサポートされません。 これはDCE IDLコンパイラの動作によるものと思われます。
コンテキスト・ハンドルは[local]
モードだけでサポートされます。 状態をまたがるオペレーションを管理するためにコンテキスト・ハンドルを使用して、インタフェースを記述することはできません。
[out-of-line]
ACS属性は無視されます。 この機能は、たとえばOSF IDLコンパイラを使用する異なる実装間での相互運用をサポートするという点では定義されていません。
[heap]
ACS属性は無視されます。
IDLコンパイラ用のインタフェースは、X/OPEN仕様では指定されていません。
DCEアプリケーションの移植性を考慮し、Oracle TuxedoシステムのIDLコンパイラのインタフェースはDCE IDLコンパイラと同様ですが、次のような例外があります。
コマンド名はidl
のかわりにtidl
を用います。同じ環境に両方のコンパイラが存在する場合でも、コンパイラの識別がアプリケーションから容易に行えます。
-bug
オプションは、旧バージョンのソフトウェアとの相互運用のために、誤動作を起こさせます。このオプションは無効です。 -no_bug
オプションも無効です。
-space_opt
オプションは無視されます。このオプションは、コード領域の最適化を行います。 領域は常に最適化されます。
新しいオプション-use_const
がサポートされています。-use_const
は、定数定義用の#define
ステートメントのかわりにANSI C const
ステートメントを生成します。このオプションにより、IDLファイル内で定義された定数がCプリプロセッサ定義を使用するファイル内の別の定数名と競合するというやっかいな問題を回避できます。このオプションにより、Cの定数として定義されるときに、これらの定数は別のネームスペースに正しく配置されます。本機能を使うと、IDLファイルの移植性が制限されます。
デフォルトでは、/lib/cpp
、/usr/ccs/lib/cpp
、または/usr/lib/cpp
のいずれかのコマンドを使用して、入力IDLファイルと入力ACFファイルのプリプロセッサ処理を行ないます。3つのプリプロセッサのうち最初に見つかったものを使用します。
デフォルトでは、IDLコンパイラは入力IDLファイルを受け取り、クライアントとサーバー・スタブのオブジェクト・ファイルを生成します。 -keep c_source
オプションはCソース・ファイルだけを生成し、-keep all
オプションはCソース・ファイルとオブジェクト・ファイルの両方を保持します。 「アプリケーション例」で示したサンプルRPCアプリケーションでは、-keep object
オプションを使用してオブジェクト・ファイルを生成しています。
デフォルトでは、tidl
は最大50個までのエラーを表示します。 エラー数が50個を超えている場合に、すべてのエラーを表示するときは、-error all
オプションを指定します。 エラー出力はstderr
に送られます。
その他使用可能なオプションの詳細は、『Oracle Tuxedoコマンド・リファレンス』のtidl(1)
を参照してください。