From d1803fce0ac8d8a2a37e6bbb25d6450e2b7b5e4f Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Fri, 17 Mar 2000 18:22:16 +0000 Subject: [PATCH] Fix multivalued indices. Need to add indices of remaining values after delete of any value. --- servers/slapd/back-ldbm/index.c | 51 ------------ servers/slapd/back-ldbm/modify.c | 98 +++++++++++++++++------ servers/slapd/back-ldbm/proto-back-ldbm.h | 1 - 3 files changed, 74 insertions(+), 76 deletions(-) diff --git a/servers/slapd/back-ldbm/index.c b/servers/slapd/back-ldbm/index.c index c7218086e5..360088a7c1 100644 --- a/servers/slapd/back-ldbm/index.c +++ b/servers/slapd/back-ldbm/index.c @@ -77,57 +77,6 @@ index_add_entry( return( 0 ); } -int -index_add_mods( - Backend *be, - Modifications *ml, - ID id -) -{ - int rc; - - for ( ; ml != NULL; ml = ml->sml_next ) { - Modification *mod = &ml->sml_mod; - -#ifdef SLAPD_SCHEMA_NOT_COMPAT - /* not yet implemented */ - rc = -1; -#else - switch ( mod->mod_op ) { - case LDAP_MOD_REPLACE: - /* XXX: Delete old index data==>problem when this - * gets called we lost values already! - */ - case LDAP_MOD_ADD: - rc = index_change_values( be, - mod->mod_type, - mod->mod_bvalues, - id, - SLAP_INDEX_ADD_OP ); - break; - case LDAP_MOD_DELETE: - rc = index_change_values( be, - mod->mod_type, - mod->mod_bvalues, - id, - SLAP_INDEX_DELETE_OP ); - break; - case SLAP_MOD_SOFTADD: /* SOFTADD means index was there */ - rc = 0; - break; - - default: - rc = -1; - } -#endif - - if ( rc != 0 ) { - return( rc ); - } - } - - return( 0 ); -} ID_BLOCK * index_read( diff --git a/servers/slapd/back-ldbm/modify.c b/servers/slapd/back-ldbm/modify.c index 54c71a8d76..28cdb92ee1 100644 --- a/servers/slapd/back-ldbm/modify.c +++ b/servers/slapd/back-ldbm/modify.c @@ -127,39 +127,89 @@ int ldbm_modify_internal( } ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex ); - /* remove old indices */ - if( save_attrs != NULL ) { - for ( ml = modlist; ml != NULL; ml = ml->sml_next ) { - mod = &ml->sml_mod; + /* run through the attributes removing old indices */ + for ( ml = modlist; ml != NULL; ml = ml->sml_next ) { + mod = &ml->sml_mod; + #ifdef SLAPD_SCHEMA_NOT_COMPAT - if ( mod->sm_op == LDAP_MOD_REPLACE ) + switch ( mod->sm_op ) #else - if ( mod->mod_op == LDAP_MOD_REPLACE ) + switch ( mod->mod_op ) #endif - { + { + case LDAP_MOD_REPLACE: { #ifdef SLAPD_SCHEMA_NOT_COMPAT - /* not yet implemented */ + /* not yet implemented */ #else - /* Need to remove all values from indexes */ - Attribute *a = attr_find( save_attrs, mod->mod_type ); - - if( a != NULL ) { - (void) index_change_values( be, - mod->mod_type, - a->a_vals, - e->e_id, - SLAP_INDEX_DELETE_OP); - } -#endif + /* Need to remove all values from indexes */ + Attribute *a = save_attrs + ? attr_find( save_attrs, mod->mod_type ) + : NULL; + + if( a != NULL ) { + (void) index_change_values( be, + mod->mod_type, + a->a_vals, + e->e_id, + SLAP_INDEX_DELETE_OP ); } +#endif + } break; + + case LDAP_MOD_DELETE: +#ifdef SLAPD_SCHEMA_NOT_COMPAT + /* not yet implemented */ +#else + /* remove deleted values */ + (void) index_change_values( be, + mod->mod_type, + mod->mod_bvalues, + e->e_id, + SLAP_INDEX_DELETE_OP ); +#endif + break; } - attrs_free( save_attrs ); } - /* modify indexes */ - if ( index_add_mods( be, modlist, e->e_id ) != 0 ) { - /* our indices are likely hosed */ - return LDAP_OTHER; + attrs_free( save_attrs ); + + /* run through the attributes adding new indices */ + for ( ml = modlist; ml != NULL; ml = ml->sml_next ) { + mod = &ml->sml_mod; + + switch ( mod->mod_op ) { + case LDAP_MOD_REPLACE: + case LDAP_MOD_ADD: +#ifdef SLAPD_SCHEMA_NOT_COMPAT + /* not yet implemented */ +#else + (void) index_change_values( be, + mod->mod_type, + mod->mod_bvalues, + e->e_id, + SLAP_INDEX_ADD_OP ); +#endif + break; + + case LDAP_MOD_DELETE: { +#ifdef SLAPD_SCHEMA_NOT_COMPAT + /* not yet implemented */ +#else + /* Need to add all remaining values */ + Attribute *a = e->e_attrs + ? attr_find( e->e_attrs, mod->mod_type ) + : NULL; +#endif + + if( a != NULL ) { + (void) index_change_values( be, + mod->mod_type, + a->a_vals, + e->e_id, + SLAP_INDEX_ADD_OP ); + } + } break; + } } return LDAP_SUCCESS; diff --git a/servers/slapd/back-ldbm/proto-back-ldbm.h b/servers/slapd/back-ldbm/proto-back-ldbm.h index 290a992275..7e7f73d742 100644 --- a/servers/slapd/back-ldbm/proto-back-ldbm.h +++ b/servers/slapd/back-ldbm/proto-back-ldbm.h @@ -132,7 +132,6 @@ ID idl_nextid LDAP_P(( ID_BLOCK *idl, ID *cursor )); */ int index_add_entry LDAP_P(( Backend *be, Entry *e )); -int index_add_mods LDAP_P(( Backend *be, Modifications *ml, ID id )); ID_BLOCK * index_read LDAP_P(( Backend *be, char *type, int indextype, char *val )); /* Possible operations supported (op) by index_change_values() */ -- 2.39.5