Interstage Application Server Smart Repository運用ガイド
|
目次
索引
|
5.3.3.5 非同期型のエントリ削除
非同期型でエントリを削除する場合のサンプルプログラムを以下に示します。
[del.c]
/*
* Copyright (c) 2004. Fujitsu Limited. All rights reserved.
*
* エントリの削除を行う。
*
*/
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#if defined(unix)
#include <time.h>
#elif defined(_WIN32)
#include <winsock.h>
#endif
#if defined(unix)
#include <unistd.h>
#endif
#include "examples.h"
#include "def.h"
unsigned long global_counter = 0;
char *host = SAMPLE_HOST;
int port = SAMPLE_PORT;
char *binddn = SAMPLE_BINDDN;
char *passwd = SAMPLE_PASSWORD;
char *del_dn = "uid=100001," SAMPLE_BASEDN;
/*-------------------------------------------------------------*/
/*
* 検索結果を待ち合わせている間、他の作業
* を行うことができます。
* 他の作業を行うプログラムをここに記述し
* ます。
*/
static void do_other_work()
{
extern unsigned long global_counter;
global_counter++;
}
/*-------------------------------------------------------------*/
/*
* メイン・プログラム
*/
int main(
int argc,
char *argv[]
)
{
LDAP *ld;
LDAPMessage *result;
int rtn;
int msgid;
int finished;
struct timeval zerotime;
int optdata;
int errcode;
char *errmsg;
char *mached;
extern char *host;
extern int port;
extern char *binddn;
extern char *passwd;
extern char *del_dn;
/*----------------------------------------------------------*/
printf( "%s is start\n", argv[0] );
/* セションのオープン */
printf( "%s: ldap_init( \"%s\", %d )\n", argv[0], host, port );
ld = ldap_init( host, port );
if ( ld == NULL ) {
perror( "ldap_init" );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
}
/* オプションの設定(別名参照ルール) */
optdata = LDAP_DEREF_ALWAYS;
printf( "%s: ldap_set_option( LDAP_OPT_DEREF, %d )\n", argv[0], optdata );
rtn = ldap_set_option(ld, LDAP_OPT_DEREF, (void *)(&optdata));
if (rtn != 0 ) {
do_error_msg( "ldap_set_option", rtn, NULL, NULL );
do_unbind( ld, argv );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
}
/* オプションの設定(使用するLDAPプロトコル) */
optdata = LDAP_VERSION3;
printf( "%s: ldap_set_option( LDAP_OPT_PROTOCOL_VERSION, %d )\n", argv[0], optdata );
rtn = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, (void *)(&optdata));
if ( rtn != 0 ) {
do_error_msg( "ldap_set_option", rtn, NULL, NULL );
do_unbind( ld, argv );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
}
/* 簡易認証 */
printf( "%s: ldap_simple_bind_s( \"%s\", \"******\" )\n", argv[0], binddn );
rtn = ldap_simple_bind_s( ld, binddn, passwd );
if ( rtn != LDAP_SUCCESS ) {
do_error_msg( "ldap_simple_bind_s", rtn, NULL, NULL );
do_unbind( ld, argv );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
}
/* エントリの削除 */
printf( "%s: ldap_delete( \"%s\" )\n", argv[0], del_dn );
msgid = ldap_delete( ld, del_dn );
if ( msgid < 0 ) {
do_get_ldaperror( ld, &errcode, &errmsg );
do_error_msg( "ldap_delete", errcode, NULL, errmsg );
do_unbind( ld, argv );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
}
/* 結果の待ち合わせ処理 */
finished = 0;
while ( finished == 0 ) {
printf( "%s: ldap_result( )\n", argv[0] );
result = NULL;
zerotime.tv_sec = 30L;
zerotime.tv_usec = 0L;
rtn = ldap_result( ld, msgid, LDAP_MSG_ALL, &zerotime, &result );
switch ( rtn ) {
case -1:
/* エラー発生時 */
if ( result != NULL ) {
errcode = 0;
mached = NULL;
errmsg = NULL;
ldap_parse_result( ld, result, &errcode, &mached, &errmsg, 0, 0, 0 );
do_error_msg( "ldap_result", errcode, mached, errmsg );
}
printf( "%s: Entry delete error.\n", argv[0] );
do_unbind( ld, argv );
printf( "%s is abnormal end\n", argv[0] );
return( 1 );
case 0:
/*
* タイムアウト発生時、または
* 受信可能な結果がなかった時
*/
#if defined(unix)
sleep(1);
#elif defined(_WIN32)
Sleep(1*1000);
#endif
break;
default:
/* 処理完了 */
finished = 1;
errcode = 0;
mached = NULL;
errmsg = NULL;
rtn = ldap_parse_result( ld, result, &errcode, &mached, &errmsg, 0 , 0, 0 );
if ( rtn == LDAP_SUCCESS ) {
/* 正常終了時 */
printf( "%s: Entry deleted successfully. I counted to %ld while waiting.\n", argv[0], global_counter );
} else {
/* エラー発生時 */
printf( "%s: Error while deleting entry.\n", argv[0] );
do_error_msg( "ldap_result", errcode, mached, errmsg );
}
ldap_msgfree( result );
}
do_other_work();
}
/* 終了処理 */
do_unbind( ld, argv );
printf( "%s is normal end\n", argv[0] );
return( 0 );
}
All Rights Reserved, Copyright(C) 富士通株式会社 2005