1999-09-09 03:06:24 +08:00
|
|
|
/* $OpenLDAP$ */
|
1999-08-18 03:00:59 +08:00
|
|
|
/*
|
2000-05-13 10:47:56 +08:00
|
|
|
* Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
|
1999-08-18 03:00:59 +08:00
|
|
|
* COPYING RESTRICTIONS APPLY, see COPYRIGHT file
|
|
|
|
*/
|
|
|
|
#include "portable.h"
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include <ac/stdlib.h>
|
|
|
|
|
|
|
|
#include <ac/ctype.h>
|
|
|
|
#include <ac/string.h>
|
|
|
|
#include <ac/socket.h>
|
|
|
|
#include <ac/unistd.h>
|
|
|
|
|
|
|
|
#include "slapcommon.h"
|
|
|
|
|
|
|
|
int
|
|
|
|
main( int argc, char **argv )
|
|
|
|
{
|
|
|
|
char *type;
|
2000-02-29 05:16:05 +08:00
|
|
|
#ifdef SLAPD_SCHEMA_NOT_COMPAT
|
|
|
|
AttributeDescription *desc;
|
|
|
|
char *text;
|
|
|
|
#else
|
|
|
|
char *desc;
|
|
|
|
#endif
|
1999-08-18 03:00:59 +08:00
|
|
|
ID id;
|
|
|
|
int rc = EXIT_SUCCESS;
|
|
|
|
|
|
|
|
slap_tool_init( "slapindex", SLAPINDEX, argc, argv );
|
|
|
|
|
|
|
|
if( !be->be_entry_open &&
|
|
|
|
!be->be_entry_close &&
|
|
|
|
!be->be_entry_first &&
|
|
|
|
!be->be_entry_next &&
|
|
|
|
!be->be_entry_get &&
|
|
|
|
!be->be_index_attr &&
|
|
|
|
!be->be_index_change )
|
|
|
|
{
|
|
|
|
fprintf( stderr, "%s: database doesn't support necessary operations.\n",
|
|
|
|
progname );
|
|
|
|
exit( EXIT_FAILURE );
|
|
|
|
}
|
|
|
|
|
2000-02-07 05:09:44 +08:00
|
|
|
#ifdef SLAPD_SCHEMA_NOT_COMPAT
|
|
|
|
type = argv[argc - 1];
|
2000-02-29 05:16:05 +08:00
|
|
|
|
|
|
|
if( strcasecmp( type, "dn" ) == 0 ) {
|
|
|
|
desc = NULL;
|
|
|
|
|
|
|
|
} else {
|
|
|
|
rc = slap_str2ad( type, &desc, &text );
|
|
|
|
|
|
|
|
if( rc != LDAP_SUCCESS ) {
|
|
|
|
fprintf( stderr, "%s: unrecognized attribute type: %s\n",
|
|
|
|
progname, text );
|
|
|
|
exit( EXIT_FAILURE );
|
|
|
|
}
|
|
|
|
}
|
2000-02-07 05:09:44 +08:00
|
|
|
#else
|
2000-02-29 05:16:05 +08:00
|
|
|
desc = type = attr_normalize( argv[argc - 1] );
|
2000-02-07 05:09:44 +08:00
|
|
|
#endif
|
1999-08-18 03:00:59 +08:00
|
|
|
|
2000-02-29 05:16:05 +08:00
|
|
|
if ( !be->be_index_attr( be, desc ) ) {
|
1999-08-18 03:00:59 +08:00
|
|
|
fprintf( stderr, "attribute type \"%s\": no indices to generate\n",
|
|
|
|
type );
|
|
|
|
exit( EXIT_FAILURE );
|
|
|
|
}
|
|
|
|
|
|
|
|
if( be->be_entry_open( be, 0 ) != 0 ) {
|
|
|
|
fprintf( stderr, "%s: could not open database.\n",
|
|
|
|
progname );
|
|
|
|
exit( EXIT_FAILURE );
|
|
|
|
}
|
|
|
|
|
|
|
|
for ( id = be->be_entry_first( be );
|
|
|
|
id != NOID;
|
|
|
|
id = be->be_entry_next( be ) )
|
|
|
|
{
|
|
|
|
struct berval **values;
|
|
|
|
Entry* e = be->be_entry_get( be, id );
|
|
|
|
struct berval bv;
|
|
|
|
struct berval *bvals[2];
|
|
|
|
|
|
|
|
if ( e == NULL ) {
|
|
|
|
fprintf( stderr,
|
|
|
|
"entry id=%08lx: no data\n", (long) id );
|
|
|
|
rc = EXIT_FAILURE;
|
1999-08-18 09:45:59 +08:00
|
|
|
if( continuemode ) continue;
|
|
|
|
break;
|
1999-08-18 03:00:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
if( verbose ) {
|
|
|
|
printf("indexing id=%08lx dn=\"%s\"\n",
|
|
|
|
id, e->e_dn );
|
|
|
|
}
|
|
|
|
|
2000-02-29 05:16:05 +08:00
|
|
|
#ifdef SLAPD_SCHEMA_NOT_COMPAT
|
|
|
|
if( desc == NULL )
|
|
|
|
#else
|
|
|
|
if( strcasecmp( type, "dn" ) == 0 )
|
|
|
|
#endif
|
|
|
|
{
|
1999-09-01 15:29:07 +08:00
|
|
|
bv.bv_val = e->e_ndn;
|
|
|
|
bv.bv_len = strlen( bv.bv_val );
|
|
|
|
bvals[0] = &bv;
|
|
|
|
bvals[1] = NULL;
|
|
|
|
|
|
|
|
values = bvals;
|
|
|
|
|
2000-02-29 05:16:05 +08:00
|
|
|
if ( be->be_index_change( be,
|
|
|
|
desc, values, id, SLAP_INDEX_ADD_OP ) )
|
|
|
|
{
|
|
|
|
rc = EXIT_FAILURE;
|
1999-08-18 03:00:59 +08:00
|
|
|
|
2000-02-29 05:16:05 +08:00
|
|
|
if( !continuemode ) {
|
|
|
|
entry_free( e );
|
|
|
|
break;
|
|
|
|
}
|
1999-08-18 09:45:59 +08:00
|
|
|
}
|
1999-08-18 03:00:59 +08:00
|
|
|
|
2000-02-29 05:16:05 +08:00
|
|
|
} else {
|
|
|
|
Attribute *attr;
|
|
|
|
|
|
|
|
#ifdef SLAPD_SCHEMA_NOT_COMPAT
|
|
|
|
for( attr = attrs_find( e->e_attrs, desc );
|
|
|
|
attr != NULL;
|
|
|
|
attr = attrs_find( attr, desc ) )
|
|
|
|
#else
|
|
|
|
if (( attr = attr_find( e->e_attrs, type )) != NULL )
|
|
|
|
#endif
|
|
|
|
{
|
|
|
|
|
|
|
|
if ( be->be_index_change( be,
|
|
|
|
desc, attr->a_vals, id, SLAP_INDEX_ADD_OP ) )
|
|
|
|
{
|
|
|
|
rc = EXIT_FAILURE;
|
|
|
|
|
|
|
|
if( !continuemode ) {
|
|
|
|
entry_free( e );
|
|
|
|
goto done;
|
|
|
|
}
|
|
|
|
}
|
1999-08-18 09:45:59 +08:00
|
|
|
}
|
1999-08-18 03:00:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
entry_free( e );
|
|
|
|
}
|
|
|
|
|
2000-02-29 05:16:05 +08:00
|
|
|
done:
|
1999-08-18 03:00:59 +08:00
|
|
|
(void) be->be_entry_close( be );
|
|
|
|
|
1999-08-20 01:20:15 +08:00
|
|
|
slap_tool_destroy();
|
1999-08-18 03:00:59 +08:00
|
|
|
|
|
|
|
return( rc );
|
|
|
|
}
|