]> git.sur5r.net Git - openldap/commitdiff
ITS#4250 bdb_idl_delete needs to check for Range
authorHoward Chu <hyc@openldap.org>
Wed, 7 Dec 2005 01:54:50 +0000 (01:54 +0000)
committerHoward Chu <hyc@openldap.org>
Wed, 7 Dec 2005 01:54:50 +0000 (01:54 +0000)
servers/slapd/back-bdb/idl.c

index e034fb2ff8b5e1c4a77b68bb9b93f69e092f063a..321e02e2327efbe64c351f8cf23dd49c86c57b1e 100644 (file)
@@ -226,7 +226,7 @@ int bdb_idl_insert( ID *ids, ID id )
 
 static int bdb_idl_delete( ID *ids, ID id )
 {
-       unsigned x = bdb_idl_search( ids, id );
+       unsigned x;
 
 #if IDL_DEBUG > 1
        Debug( LDAP_DEBUG_ANY, "delete: %04lx at %d\n", (long) id, x, 0 );
@@ -235,6 +235,23 @@ static int bdb_idl_delete( ID *ids, ID id )
        idl_check( ids );
 #endif
 
+       if (BDB_IDL_IS_RANGE( ids )) {
+               /* If deleting a range boundary, adjust */
+               if ( ids[1] == id )
+                       ids[1]++;
+               else if ( ids[2] == id )
+                       ids[2]--;
+               /* deleting from inside a range is a no-op */
+
+               /* If the range has collapsed, re-adjust */
+               if ( ids[1] > ids[2] )
+                       ids[0] = 0;
+               else if ( ids[1] == ids[2] )
+                       ids[1] = 1;
+               return 0;
+       }
+
+       x = bdb_idl_search( ids, id );
        assert( x > 0 );
 
        if( x <= 0 ) {