/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2000-2008 The OpenLDAP Foundation.
+ * Copyright 2000-2011 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* set point for insertion if ins is non-NULL
*/
int
-bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad, unsigned *ins )
+bdb_attr_slot( struct bdb_info *bdb, AttributeDescription *ad, int *ins )
{
unsigned base = 0, cursor = 0;
unsigned n = bdb->bi_nattrs;
int val = 0;
while ( 0 < n ) {
- int pivot = n >> 1;
+ unsigned pivot = n >> 1;
cursor = base + pivot;
val = SLAP_PTRCMP( ad, bdb->bi_attrs[cursor]->ai_desc );
static int
ainfo_insert( struct bdb_info *bdb, AttrInfo *a )
{
- unsigned x;
+ int x;
int i = bdb_attr_slot( bdb, a->ai_desc, &x );
/* Is it a dup? */
goto done;
}
- if( slap_ad_is_binary( ad ) ) {
+ if( ad == slap_schema.si_ad_entryDN || slap_ad_is_binary( ad ) ) {
if (c_reply) {
snprintf(c_reply->msg, sizeof(c_reply->msg),
"index of attribute \"%s\" disallowed", attrs[i] );
if( rc ) {
if ( bdb->bi_flags & BDB_IS_OPEN ) {
AttrInfo *b = bdb_attr_mask( bdb, ad );
- /* If we were editing this attr, reset it */
- b->ai_indexmask &= ~BDB_INDEX_DELETING;
- /* If this is leftover from a previous add, commit it */
- if ( b->ai_newmask )
- b->ai_indexmask = b->ai_newmask;
- b->ai_newmask = a->ai_newmask;
- ch_free( a );
- rc = 0;
- continue;
+ /* If there is already an index defined for this attribute
+ * it must be replaced. Otherwise we end up with multiple
+ * olcIndex values for the same attribute */
+ if ( b->ai_indexmask & BDB_INDEX_DELETING ) {
+ /* If we were editing this attr, reset it */
+ b->ai_indexmask &= ~BDB_INDEX_DELETING;
+ /* If this is leftover from a previous add, commit it */
+ if ( b->ai_newmask )
+ b->ai_indexmask = b->ai_newmask;
+ b->ai_newmask = a->ai_newmask;
+ ch_free( a );
+ rc = 0;
+ continue;
+ }
}
if (c_reply) {
snprintf(c_reply->msg, sizeof(c_reply->msg),