| Oracle® Fusion Middleware Oracle Directory Server Enterprise Edition開発者ガイド 11g リリース1 (11.1.1.7.0) B72440-01 |
|
![]() 前 |
![]() 次 |
この章では、属性値がクライアント・アプリケーションによって要求されるときにその値を計算するプラグインについて説明します。
この章の内容は、次のとおりです。
Directory Serverのほとんどの属性とは異なり、算出属性にはDirectory Serverデータベースに格納された値がありません。算出属性は、値が要求されたときに使用可能になります。そのため、値の要求ごとに、要求時に属性値を算出する必要があります。
そのため、一般的に、算出属性はすぐに処理する必要があります。大規模な内部検索に依存するか、またはディレクトリに含まれていないデータにアクセスする算出属性は、生成が高コストになる可能性があります。そのため、そのような属性は、算出属性の理想的な候補ではありません。
かわりに、手近なデータからすばやく値を生成する算出属性が、より一般的です。たとえば、エントリ内の他の属性の値をカウントまたは処理するために、算出属性を使用することがあります。この章では、エントリを読み取るときにAPIを使用して現在の時間を取得する単純で擬似的な例を示します。
この項では、属性値currentTimeを生成するプラグインの作成方法について説明します。
この章では、コードのみを示します。完全なサンプル・コードは、Directory Serverをインストールしたinstall-pathCaret/examples/computed.cにあります。
属性値を計算するプラグインは、slapi_compute_callback_t型の関数を登録し、サーバーでの初期化中にslapi_compute_add_evaluator ()を使用して属性を計算します。
#include "slapi-plugin.h"
int
compute_init(Slapi_PBlock * pb)
{
int rc = 0; /* 0 means success */
rc |= slapi_pblock_set( /* Plug-in API version */
pb,
SLAPI_PLUGIN_VERSION,
SLAPI_PLUGIN_CURRENT_VERSION
);
rc |= slapi_pblock_set( /* Plug-in description */
pb,
SLAPI_PLUGIN_DESCRIPTION,
(void *) &comp_desc; /* See the code for comp_desc. */
);
rc |= slapi_compute_add_evaluator(compute_attrs);
return rc;
}
ここで、compute_attrs()は、属性値を計算する関数となります。
Directory Serverが算出属性値の要求を受け取ると(今回はcurrentTime)、サーバーは属性を計算するために登録される関数をコールします。Directory Serverは、属性を計算するためのコンテキスト、属性タイプおよびエントリを関数に提供します。
そのため、関数は、属性タイプをチェックして、関数が計算を処理するかどうかを確認する必要があります。関数が問題の属性タイプを処理しない場合は、-1を戻します。関数が属性を処理できる場合は、関数が属性値を決定する必要があります。関数は、サーバーが戻す結果に算出コンテンツを追加する必要があります。次のコードは、属性値の現在の時間の文字列を生成するcompute_attrs ()関数を示しています。
#include "slapi-plugin.h"
/* Compute an attribute called currentTime */
static int
compute_attrs(
computed_attr_context * context,
char * type,
Slapi_Entry * entry,
slapi_compute_output_t outfn
)
{
/* If the attribute type is not recognized return -1. */
int rc = -1;
if (slapi_attr_type_cmp("currentTime", type, 2) == 0) {
Slapi_Attr * time_attr;
time_t now;
char current_time[30];
Slapi_Value * time_value;
int rc = 0;
/* Construct the computed attribute. */
time_attr = slapi_attr_new();
slapi_attr_init(time_attr, type);
now = time(NULL);
ctime_r(&now;, current_time, 30);
current_time[(int)strlen(current_time) - 1] = '\0';
time_value = slapi_value_new_string(current_time);
slapi_attr_add_value(time_attr, time_value);
slapi_value_free(&time_value;);
/* Add the attribute to the result returned. */
rc = (*outfn)(context, time_attr, entry);
attr_done(time_attr);
return rc;
/* Handle other computed attributes...
} else if (slapi_attr_type_cmp("myCompAttr", type, 2) == 0) {
*/
}
return rc;
}
戻される結果に属性を追加するコードの行に注意してください。この場合の出力関数は、slapi_compute_output_t型です。
算出属性値を構成するときは、compute_attrs()関数がctime_r()関数の文字列から改行文字を削除することにも注意してください。この削除によって、値がldapsearchコマンドで表示されるときに属性値がbase64でエンコードされなくなります。
ldapsearchコマンドを使用してプラグインをテストする前に、プラグインをDirectory Serverに登録する必要があります。
実行済でない場合には、サンプルのプラグイン・ライブラリを作成し、プラグイン情報のロギングとサンプル・プラグインの両方をアクティブ化します。
プラグインを構築します。
ヒント: install-path/examples/Makefileまたはinstall-path/examples/Makefile64を使用します。
プラグイン情報メッセージがログに記録されるようにDirectory Serverを構成し、プラグインをロードします。
$ dsconf create-plugin -F custom-plugin-init-function -G custom-plugin-argument -H lib-path \
-Y custom-plugin-type "Custom Plugin"
$ dsconf enable-plugin "Custom Plugin"
ヒント: 詳細は、プラグインのソース・ファイルに指定されたコマンドを使用して参照してください。
Directory Serverを再起動します。
$ dsadm restart instance-path