ページの先頭行へ戻る
Interstage Application Server ディレクトリサービス運用ガイド

9.3.12 非同期操作

  非同期操作を使用すると、アプリケーションからInterstage ディレクトリサービスに非同期要求を送信した後、任意のタイミングで処理結果を受信することができます。

9.3.12.1 非同期操作の実行

  非同期操作の関数の代表的なものには以下の関数があります。

9.3.12.2 非同期操作の結果受取り

  非同期型関数を使ったLDAP操作の結果(result情報)はldap_result()で受け取ります。

  ldap_result()を呼び出すと、Interstage ディレクトリサービスからのresult情報を取得します。result情報が通知されない場合は、指定したタイマー時間まで待ち合わせたあと、呼び出し元に復帰します。ldap_result()では、パラメタとして以下のものを指定します。

  ldap_result()は、関数の復帰値として、受信したresult情報の種類を返します。これを利用して、どの非同期処理に対するresult情報かを判定することができます。ldap_result()については、“リファレンスマニュアル(API編)”の“処理結果の受取り/解析インタフェース”を参照してください。

  以下の処理結果を例にとって、処理結果の解析方法を説明します。

  非同期操作の結果は以下のような構造で返却されます。

  

result情報の読み込みとメッセージタイプの取得

  result情報はメッセージリストで返却されます。メッセージリストを解析するには以下の関数を使用します。

  受信したresult情報のメッセージ種別やメッセージIDを判定する場合、以下の関数を使用します。

  メッセージタイプとして以下の値が通知されます。

メッセージタイプ

説明

LDAP_RES_BIND

ユーザ認証に対するresult情報です。

LDAP_RES_SEARCH_ENTRY

検索条件に合致したエントリを表しています。

LDAP_RES_SEARCH_RESULT

エントリの検索結果の通知を示します。

LDAP_RES_MODIFY

エントリの変更に対するresult情報です。

LDAP_RES_ADD

エントリの追加に対するresult情報です。

LDAP_RES_DELETE

エントリの削除に対するresult情報です。

LDAP_RES_MODDN

エントリ名の変更に対するresult情報です。

LDAP_RES_COMPARE

属性値の比較に対するresult情報です。


result情報の解析

  非同期操作により受信した結果は、ldap_msgtype()で取得したメッセージタイプにより解析方法が異なります。

  エントリの検索結果を取得する例です。

  msgid = ldap_search( ld, basedn, LDAP_SCOPE_SUBTREE, filter, NULL, 0 );
  if ( msgid == -1 ) {
      /* エラー発生時の処理をする */
      return -1;
  }
  
  timeout.tv_sec  = 10L;    /* 10sec */
  timeout.tv_usec = 0L;
  finished = 0;
  while ( finished == 0 ) {
      doOtherWork();
  
      rtn = ldap_result( ld, msgid, LDAP_MSG_ALL, &timeout, &result );
      switch( rtn ) {
      case 0:
          /* Timeout */
          sleep(1);
          break;
      case -1:
          /* エラー発生時の処理をする */
          return -1;
      default:
          /* success */
          finished = 1;
          break;
      } /* switch */
  } /* while */
  
  message = ldap_first_message( ld, result );
  printf( "ldap_count_messages()=%d\n", ldap_count_messages( ld, message ) );
  
  for ( ; message != NULL; message = ldap_next_message( ld, message ) ) {
      msgtype = ldap_msgtype( message );
      if ( msgtype == LDAP_RES_SEARCH_ENTRY ) {
          printf( "dn: %s\n", ldap_get_dn( ld, message ) );
      } else {
          int     errcode  = 0;
          char    *matched = NULL;
          char    *errmsg  = NULL;
  
          ldap_parse_result( ld, message, &errcode, &matched, &errmsg, 0, 0, 0 );
          printf( "ldap_parse_result errcode=%s(%d)\n",
                  ldap_err2string(errcode), errcode );
          ldap_msgfree( result );
          ldap_memfree( matched );
          ldap_memfree( errmsg );
          return -1;
      }
  }

9.3.12.3 非同期操作の取消し

  非同期型の関数を使用してInterstage ディレクトリサービスに要求を送信した場合、以下の関数を使用することにより、要求を取り消すことができます。

  非同期要求を取り消すには、取り消したい非同期要求のメッセージIDを指定します。メッセージIDは、非同期要求を発行する際に通知されます。
  ldap_abandon()を発行した時点で、取り消したい非同期要求のresult情報をすでに受信していた場合は、そのresult情報は破棄されます。

  msgid = ldap_search( ld, basedn, LDAP_SCOPE_SUBTREE, filter, NULL, 0 );
  
  rtn = ldap_abandon( ld, msgid );
  if( rtn == -1 ) {
      /* エラー発生時の処理をする */
      return -1;
  }