示例代码:
// データベースにエントリーを検索する
result = ldap_search_ext_s(ld, base.c_str(), LDAP_SCOPE_SUBTREE, str_filter.c_str(), attrs, 0,
NULL, NULL, TIME_OUT, sizeLimite, &msg);
// 変数をクリアする
delete[] attrs;
if (result != LDAP_SUCCESS)
{
// 検索が失敗した場合、CISNSException異常をスローする
DEBUG_1(g_debug_flag, ldap_search_ext_s():failed[%s], ldap_err2string(result));
// 検索対象が存在しない場合、エラーとしない
if (result != LDAP_NO_SUCH_OBJECT)
{
// 検索が失敗した場合、エラーコードをリターンする
throw CISNSException(LOG_ALERT, LOG_ALERT_DB_DELETE_FAIL);
}
}
// 検索した結果のカウントを取得する
resultCount = ldap_count_entries(ld, msg);
DEBUG_1(g_debug_flag, The number of entries returned was %d, resultCount);
if (resultCount == 0)
{
// 検索した結果がない場合、リターンする
return;
}
// 検索したエントリーを取得する
for(entry = ldap_first_entry(ld, msg); entry != NULL; entry = ldap_next_entry(ld, entry))
{
// 取得したエントリーのDNを取得する
if ((dn = ldap_get_dn(ld, entry)) != NULL)
{
//DEBUG_1(g_debug_flag, Returned dn: %s, dn);
ldap_memfree(dn);
}
// 取得したエントリーの属性を取得する
for( attr = ldap_first_attribute(ld, entry, &ber);
attr != NULL;
attr = ldap_next_attribute(ld, entry, ber))
{
// 検索した属性値を格納する変数
berval** bvals;
if ((bvals = ldap_get_values_len(ld, entry, attr)) != NULL)
{
// 取得したエントリー属性値を別に取得する
for(i = 0; bvals[i] != NULL; i++)
{
// 検索した属性値を戻り属性に設定する
DEBUG_2(g_debug_flag, %s: %s, attr, bvals[i]->bv_val);
}
// 検索した属性値を格納する変数をクリアする
ldap_value_free_len(bvals);
}
// クラム名をクリアする
ldap_memfree(attr);
}
// BerElementをクリアする
if (ber != NULL)
{
ber_free(ber, 0);
}
}
// LDAPMessageをクリアする
ldap_msgfree(msg);
ldap_msgfree(entry);
最后一句在执行的时候偶尔会出错,查看了OpenLDAP的源代码后发现msg是以一种链表的结构存储的,所以就有:
LDAPMessage *
ldap_first_message( LDAP *ld, LDAPMessage *chain )
{
assert( ld != NULL );
assert( LDAP_VALID( ld ) );
assert( chain != NULL );
return chain;
}
LDAPMessage *
ldap_next_message( LDAP *ld, LDAPMessage *msg )
{
assert( ld != NULL );
assert( LDAP_VALID( ld ) );
assert( msg != NULL );
return msg->lm_chain;
}
和
int
ldap_msgfree( LDAPMessage *lm )
{
LDAPMessage *next;
int type = 0;
Debug( LDAP_DEBUG_TRACE, "ldap_msgfree/n", 0, 0, 0 );
for ( ; lm != NULL; lm = next ) {
next = lm->lm_chain;
type = lm->lm_msgtype;
ber_free( lm->lm_ber, 1 );
LDAP_FREE( (char *) lm );
}
return( type );
}
在作 ldap_msgfree(msg)时,已经将链表中的所有成员释放,所以难怪 ldap_msgfree(entry)会出错。
// データベースにエントリーを検索する
result = ldap_search_ext_s(ld, base.c_str(), LDAP_SCOPE_SUBTREE, str_filter.c_str(), attrs, 0,
NULL, NULL, TIME_OUT, sizeLimite, &msg);
// 変数をクリアする
delete[] attrs;
if (result != LDAP_SUCCESS)
{
// 検索が失敗した場合、CISNSException異常をスローする
DEBUG_1(g_debug_flag, ldap_search_ext_s():failed[%s], ldap_err2string(result));
// 検索対象が存在しない場合、エラーとしない
if (result != LDAP_NO_SUCH_OBJECT)
{
// 検索が失敗した場合、エラーコードをリターンする
throw CISNSException(LOG_ALERT, LOG_ALERT_DB_DELETE_FAIL);
}
}
// 検索した結果のカウントを取得する
resultCount = ldap_count_entries(ld, msg);
DEBUG_1(g_debug_flag, The number of entries returned was %d, resultCount);
if (resultCount == 0)
{
// 検索した結果がない場合、リターンする
return;
}
// 検索したエントリーを取得する
for(entry = ldap_first_entry(ld, msg); entry != NULL; entry = ldap_next_entry(ld, entry))
{
// 取得したエントリーのDNを取得する
if ((dn = ldap_get_dn(ld, entry)) != NULL)
{
//DEBUG_1(g_debug_flag, Returned dn: %s, dn);
ldap_memfree(dn);
}
// 取得したエントリーの属性を取得する
for( attr = ldap_first_attribute(ld, entry, &ber);
attr != NULL;
attr = ldap_next_attribute(ld, entry, ber))
{
// 検索した属性値を格納する変数
berval** bvals;
if ((bvals = ldap_get_values_len(ld, entry, attr)) != NULL)
{
// 取得したエントリー属性値を別に取得する
for(i = 0; bvals[i] != NULL; i++)
{
// 検索した属性値を戻り属性に設定する
DEBUG_2(g_debug_flag, %s: %s, attr, bvals[i]->bv_val);
}
// 検索した属性値を格納する変数をクリアする
ldap_value_free_len(bvals);
}
// クラム名をクリアする
ldap_memfree(attr);
}
// BerElementをクリアする
if (ber != NULL)
{
ber_free(ber, 0);
}
}
// LDAPMessageをクリアする
ldap_msgfree(msg);
ldap_msgfree(entry);
最后一句在执行的时候偶尔会出错,查看了OpenLDAP的源代码后发现msg是以一种链表的结构存储的,所以就有:
LDAPMessage *
ldap_first_message( LDAP *ld, LDAPMessage *chain )
{
assert( ld != NULL );
assert( LDAP_VALID( ld ) );
assert( chain != NULL );
return chain;
}
LDAPMessage *
ldap_next_message( LDAP *ld, LDAPMessage *msg )
{
assert( ld != NULL );
assert( LDAP_VALID( ld ) );
assert( msg != NULL );
return msg->lm_chain;
}
和
int
ldap_msgfree( LDAPMessage *lm )
{
LDAPMessage *next;
int type = 0;
Debug( LDAP_DEBUG_TRACE, "ldap_msgfree/n", 0, 0, 0 );
for ( ; lm != NULL; lm = next ) {
next = lm->lm_chain;
type = lm->lm_msgtype;
ber_free( lm->lm_ber, 1 );
LDAP_FREE( (char *) lm );
}
return( type );
}
在作 ldap_msgfree(msg)时,已经将链表中的所有成员释放,所以难怪 ldap_msgfree(entry)会出错。