]> git.sur5r.net Git - openldap/commitdiff
Fix multivalued indices. Need to add indices of remaining
authorKurt Zeilenga <kurt@openldap.org>
Fri, 17 Mar 2000 18:22:16 +0000 (18:22 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Fri, 17 Mar 2000 18:22:16 +0000 (18:22 +0000)
values after delete of any value.

servers/slapd/back-ldbm/index.c
servers/slapd/back-ldbm/modify.c
servers/slapd/back-ldbm/proto-back-ldbm.h

index c7218086e5e3996aa96d4ba7408feb4057558f7f..360088a7c19370144a541fcae71685dbe67e38dc 100644 (file)
@@ -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(
index 54c71a8d76d5b8a9d07d69ac0fa25aa0d46556d7..28cdb92ee108dc58e20628f909e1189321883e73 100644 (file)
@@ -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;
index 290a992275cd1577d44e335bfea13c0cddf39e75..7e7f73d74231d2843cc955454dff56ed8f81cb08 100644 (file)
@@ -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() */