以下のLDIFで表される検索結果を例にとって、検索結果の解析方法を説明します。
検索結果は以下のような構造で返却されます。
検索結果の解析は、“エントリの解析”、“属性名の取得”、“属性値の取得”、および“DNの取得と解析”に分類することができます。
検索結果は、以下の関数を使用して検索結果に含まれているエントリを参照します。
ldap_first_entry( LDAP *ld, LDAPMessage *res )
先頭のエントリのアドレスを求めます。
ldap_next_entry( LDAP *ld, LDAPMessage *entry )
次のエントリのアドレスを求めます。
ldap_count_entries( LDAP *ld, LDAPMessage *res )
エントリの数を求めます。
エントリの解析のコード例です。
int finished; int num_entry; LDAPMessage *entry; : /* 非同期型の検索を行う */ msgid = ldap_search( ld, basedn, LDAP_SCOPE_SUBTREE, filter, NULL, 0 ); /* 検索結果を受け取る */ finished = 0; while ( finished == 0 ) { rtn = ldap_result( ld, msgid, LDAP_MSG_ALL, &timeout, &result ); switch( rtn ) { case 0: /* timeout */ break; case -1: /* error occurred */ return 1: default: /* success */ finished = 1; break; } } /* 検索結果のエントリ数を調べる */ num_entry = ldap_count_entries(ld, result); if( num_entry == 0){ fprintf( stderr, "Not matched.\n" ); return 0; } /* 検索結果を読み込む */ entry = ldap_first_entry( ld, result ); for ( ; entry != NULL; entry = ldap_next_entry( ld, entry ) ) { 属性名の取得 }
エントリ内の属性名を取得するには、以下の関数を使用します。
ldap_first_attribute( LDAP *ld, LDAPMessage *entry, BerElement **ptr )
エントリ内での最初の属性の名前を求めます。
ldap_next_attribute( LDAP *ld, LDAPMessage *entry, BerElement **ber )
エントリ内での次の属性の名前を求めます。
属性名の取得のコード例です。
char *attr; BerElememt *ber; : entry = ldap_first_entry( ld, result ); attr = ldap_first_attribute( ld, entry, &ber ); for ( ; attr != NULL; attr = ldap_next_attribute( ld, entry, ber ) ) { 属性値の取得 ldap_memfree(attr); }
エントリの属性値を取得するには、以下の関数を使用します。
ldap_get_values( LDAP *ld, LDAPMessage *entry, const char *attr )
指定された属性値を読み込み、文字列データとして通知します。
ldap_get_values_len( LDAP *ld, LDAPMessage *entry, const char *attr )
指定された属性値を読み込み、バイナリ形式データとして通知します。
ldap_count_values( char **vals )
ldap_get_values()で通知された属性値の数を求めます。
ldap_count_values_len( struct berval **vals )
ldap_get_values_len()で通知された属性値の数を求めます。
ldap_get_values()、およびldap_count_values()関数は、属性値を文字列データとして取り扱う場合に使用します。属性値をバイナリデータとして取り扱う場合には、ldap_get_values_len()、およびldap_count_values_len()関数を使用します。
通知される属性値の形式については、“リファレンスマニュアル(API編)”の“検索結果の解析処理インタフェース”を参照してください。
属性値の取得のコード例です。
LDAPMessage *entry; char *attr; char **vals; int i; struct berval **bervals; int count; vals = ldap_get_values( ld, entry, attr ); if( vals == NULL ){ return -1; } count = ldap_count_values( vals ); for ( i=0; i<count; i++ ) { printf( "%s: %s\n", attr, vals[i] ); }
エントリのDNを取得する場合は、ldap_get_dn()を使用します。
ldap_get_dn( LDAP *ld, LDAPMessage *entry )
指定されたエントリのDNを読み込みます。
DNを各構成要素に分解してRDNを求める場合には、ldap_explode_dn()を使用します。
ldap_explode_dn( const char *dn, int notypes )
指定されたDNを、各構成要素に分解します。
この時、notypesパラメタに1を指定することで、RDNから属性を取り除いた形式で通知させることができます。
また、RDNを構成要素に分解する場合には、ldap_explode_rdn()を使用します。
ldap_explode_rdn( const char *rdn, int notypes )
指定されたRDNを、各構成要素に分解します。
DNの取得と解析に使用する関数については、“リファレンスマニュアル(API編)”の“検索結果の解析処理インタフェース”を参照してください。