From 499b8fdc0427947cd1cb933abfdb0a5be09197f1 Mon Sep 17 00:00:00 2001 From: Juan Gomez Date: Mon, 14 Jun 1999 18:16:05 +0000 Subject: [PATCH] Added index_delete_values() in preparation for changes that will keep index files clean. --- servers/slapd/back-ldbm/index.c | 25 +++++++++++++++++++++-- servers/slapd/back-ldbm/modify.c | 17 +++++++++++++++ servers/slapd/back-ldbm/proto-back-ldbm.h | 1 + 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/servers/slapd/back-ldbm/index.c b/servers/slapd/back-ldbm/index.c index 6a13c124bd..7dc4f57f96 100644 --- a/servers/slapd/back-ldbm/index.c +++ b/servers/slapd/back-ldbm/index.c @@ -69,13 +69,19 @@ index_add_mods( LDAPMod *mod = &ml->ml_mod; switch ( mod->mod_op & ~LDAP_MOD_BVALUES ) { - case LDAP_MOD_ADD: case LDAP_MOD_REPLACE: + /* XXX: Delete old index data==>problem when this + * gets called we lost values already! + */ + case LDAP_MOD_ADD: rc = index_add_values( be, mod->mod_type, mod->mod_bvalues, id ); break; - case LDAP_MOD_SOFTADD: /* SOFTADD means index was there */ case LDAP_MOD_DELETE: + rc = index_delete_values( be, mod->mod_type, + mod->mod_bvalues, id ); + break; + case LDAP_MOD_SOFTADD: /* SOFTADD means index was there */ rc = 0; break; } @@ -220,6 +226,21 @@ add_value( return( rc ); } +/* Remove entries from index files */ + +int +index_delete_values( + Backend *be, + char *type, + struct berval **vals, + ID id +) +{ + + return 0; + +} + int index_add_values( Backend *be, diff --git a/servers/slapd/back-ldbm/modify.c b/servers/slapd/back-ldbm/modify.c index 756ceaeada..99048ce61c 100644 --- a/servers/slapd/back-ldbm/modify.c +++ b/servers/slapd/back-ldbm/modify.c @@ -109,6 +109,7 @@ int ldbm_modify_internal( int err; LDAPMod *mod; LDAPModList *ml; + Attribute *a; if ( ((be->be_lastmod == ON) || ((be->be_lastmod == UNDEFINED)&&(global_lastmod == ON))) @@ -142,6 +143,17 @@ int ldbm_modify_internal( break; case LDAP_MOD_REPLACE: + /* Need to remove all values from indexes before they + * are lost. + */ + if( e->e_attrs + && ((a = attr_find( e->e_attrs, mod->mod_type )) + != NULL) ) { + + (void) index_delete_values( be, mod->mod_type, + a->a_vals, e->e_id ); + } + err = replace_values( e, mod, op->o_ndn ); break; @@ -339,6 +351,11 @@ replace_values( char *dn ) { + + /* XXX: BEFORE YOU GET RID OF PREVIOUS VALUES REMOVE FROM INDEX + * FILES + */ + (void) attr_delete( &e->e_attrs, mod->mod_type ); if ( attr_merge( e, mod->mod_type, mod->mod_bvalues ) != 0 ) { diff --git a/servers/slapd/back-ldbm/proto-back-ldbm.h b/servers/slapd/back-ldbm/proto-back-ldbm.h index 548ace4fce..8c01f58275 100644 --- a/servers/slapd/back-ldbm/proto-back-ldbm.h +++ b/servers/slapd/back-ldbm/proto-back-ldbm.h @@ -130,6 +130,7 @@ int index_add_entry LDAP_P(( Backend *be, Entry *e )); int index_add_mods LDAP_P(( Backend *be, LDAPModList *ml, ID id )); ID_BLOCK * index_read LDAP_P(( Backend *be, char *type, int indextype, char *val )); int index_add_values LDAP_P(( Backend *be, char *type, struct berval **vals, ID id )); +int index_delete_values LDAP_P(( Backend *be, char *type, struct berval **vals, ID id )); /* * kerberos.c -- 2.39.5