]> git.sur5r.net Git - openldap/commitdiff
ITS#5183 preliminary fix - this whole approach needs re-design
authorHoward Chu <hyc@openldap.org>
Sun, 18 Nov 2007 20:50:20 +0000 (20:50 +0000)
committerHoward Chu <hyc@openldap.org>
Sun, 18 Nov 2007 20:50:20 +0000 (20:50 +0000)
servers/slapd/back-bdb/back-bdb.h
servers/slapd/back-bdb/dbcache.c
servers/slapd/back-bdb/index.c
servers/slapd/back-bdb/init.c
servers/slapd/back-bdb/modify.c
servers/slapd/back-bdb/proto-bdb.h

index bb6214b413717ae310a6d0d6749159f632ba7529..36b821c8aebeca4585afa90a4f4f0726130bd672 100644 (file)
@@ -174,7 +174,7 @@ typedef struct bdb_cache {
 #define BDB_INDICES            128
 
 struct bdb_db_info {
-       char            *bdi_name;
+       struct berval   bdi_name;
        DB                      *bdi_db;
 };
 
index 35529c79231b31e5d29c047cae8f103a2b0624cb..e08c2493cfdd6baf30ea177665d07d6feab54cea 100644 (file)
@@ -60,7 +60,7 @@ bdb_db_hash(
 int
 bdb_db_cache(
        Backend *be,
-       const char *name,
+       struct berval *name,
        DB **dbout )
 {
        int i, flags;
@@ -72,7 +72,7 @@ bdb_db_cache(
        *dbout = NULL;
 
        for( i=BDB_NDB; i < bdb->bi_ndatabases; i++ ) {
-               if( !strcmp( bdb->bi_databases[i]->bdi_name, name) ) {
+               if( !ber_bvcmp( &bdb->bi_databases[i]->bdi_name, name) ) {
                        *dbout = bdb->bi_databases[i]->bdi_db;
                        return 0;
                }
@@ -82,7 +82,7 @@ bdb_db_cache(
 
        /* check again! may have been added by another thread */
        for( i=BDB_NDB; i < bdb->bi_ndatabases; i++ ) {
-               if( !strcmp( bdb->bi_databases[i]->bdi_name, name) ) {
+               if( !ber_bvcmp( &bdb->bi_databases[i]->bdi_name, name) ) {
                        *dbout = bdb->bi_databases[i]->bdi_db;
                        ldap_pvt_thread_mutex_unlock( &bdb->bi_database_mutex );
                        return 0;
@@ -96,7 +96,7 @@ bdb_db_cache(
 
        db = (struct bdb_db_info *) ch_calloc(1, sizeof(struct bdb_db_info));
 
-       db->bdi_name = ch_strdup( name );
+       ber_dupbv( &db->bdi_name, name );
 
        rc = db_create( &db->bdi_db, bdb->bi_dbenv, 0 );
        if( rc != 0 ) {
@@ -113,8 +113,9 @@ bdb_db_cache(
 #endif
        rc = db->bdi_db->set_flags( db->bdi_db, DB_DUP | DB_DUPSORT );
 
-       file = ch_malloc( strlen( name ) + sizeof(BDB_SUFFIX) );
-       sprintf( file, "%s%s", name, BDB_SUFFIX );
+       file = ch_malloc( db->bdi_name.bv_len + sizeof(BDB_SUFFIX) );
+       strcpy( file, db->bdi_name.bv_val );
+       strcpy( file+db->bdi_name.bv_len, BDB_SUFFIX );
 
 #ifdef HAVE_EBCDIC
        __atoe( file );
index e193dae30d90e5ab122931421e12b28f2dbe0ac5..8c652bd086e1b8a0e1df21c4b6023a996f9a3d9b 100644 (file)
@@ -28,7 +28,7 @@
 static char presence_keyval[LUTIL_HASH_BYTES] = {0,0,0,1};
 static struct berval presence_key = {LUTIL_HASH_BYTES, presence_keyval};
 
-static AttrInfo *index_mask(
+AttrInfo *bdb_index_mask(
        Backend *be,
        AttributeDescription *desc,
        struct berval *atname )
@@ -70,21 +70,6 @@ static AttrInfo *index_mask(
        return 0;
 }
 
-int bdb_index_is_indexed(
-       Backend *be,
-       AttributeDescription *desc )
-{
-       AttrInfo *ai;
-       struct berval prefix;
-
-       ai = index_mask( be, desc, &prefix );
-
-       if( !ai )
-               return LDAP_INAPPROPRIATE_MATCHING;
-
-       return LDAP_SUCCESS;
-}
-
 /* This function is only called when evaluating search filters.
  */
 int bdb_index_param(
@@ -100,7 +85,7 @@ int bdb_index_param(
        slap_mask_t mask, type = 0;
        DB *db;
 
-       ai = index_mask( be, desc, prefixp );
+       ai = bdb_index_mask( be, desc, prefixp );
 
        if ( !ai ) {
 #ifdef BDB_MONITOR_IDX
@@ -127,7 +112,7 @@ int bdb_index_param(
        }
        mask = ai->ai_indexmask;
 
-       rc = bdb_db_cache( be, prefixp->bv_val, &db );
+       rc = bdb_db_cache( be, prefixp, &db );
 
        if( rc != LDAP_SUCCESS ) {
                return rc;
@@ -200,7 +185,7 @@ static int indexer(
 
        assert( mask != 0 );
 
-       rc = bdb_db_cache( op->o_bd, atname->bv_val, &db );
+       rc = bdb_db_cache( op->o_bd, atname, &db );
        
        if ( rc != LDAP_SUCCESS ) {
                Debug( LDAP_DEBUG_ANY,
index bca81d8f50907696a1b813a5ae5181847f12f705..3d9d89d95dab38dc0f4e308f36a1c051fe8ad6ea 100644 (file)
 
 static const struct bdbi_database {
        char *file;
-       char *name;
+       struct berval name;
        int type;
        int flags;
 } bdbi_databases[] = {
-       { "id2entry" BDB_SUFFIX, "id2entry", DB_BTREE, 0 },
-       { "dn2id" BDB_SUFFIX, "dn2id", DB_BTREE, 0 },
-       { NULL, NULL, 0, 0 }
+       { "id2entry" BDB_SUFFIX, BER_BVC("id2entry"), DB_BTREE, 0 },
+       { "dn2id" BDB_SUFFIX, BER_BVC("dn2id"), DB_BTREE, 0 },
+       { NULL, BER_BVNULL, 0, 0 }
 };
 
 typedef void * db_malloc(size_t);
@@ -373,7 +373,7 @@ shm_retry:
                BDB_INDICES * sizeof(struct bdb_db_info *) );
 
        /* open (and create) main database */
-       for( i = 0; bdbi_databases[i].name; i++ ) {
+       for( i = 0; bdbi_databases[i].name.bv_val; i++ ) {
                struct bdb_db_info *db;
 
                db = (struct bdb_db_info *) ch_calloc(1, sizeof(struct bdb_db_info));
@@ -546,7 +546,7 @@ bdb_db_close( BackendDB *be, ConfigReply *cr )
                rc = db->bdi_db->close( db->bdi_db, 0 );
                /* Lower numbered names are not strdup'd */
                if( bdb->bi_ndatabases >= BDB_NDB )
-                       free( db->bdi_name );
+                       free( db->bdi_name.bv_val );
                free( db );
        }
        free( bdb->bi_databases );
index df1cf3dfcad38c64a75ca3c54f3cdd6c9e07b42d..3b852eea91903ebcf6018396e9b0ea296358fdb7 100644 (file)
@@ -42,6 +42,9 @@ int bdb_modify_internal(
        Attribute       *save_attrs;
        Attribute       *ap;
        int                     glue_attr_delete = 0;
+       int                     got_delete;
+       struct berval ix_at;
+       AttrInfo *ai;
 
        Debug( LDAP_DEBUG_TRACE, "bdb_modify_internal: 0x%08lx: %s\n",
                e->e_id, e->e_dn, 0);
@@ -88,6 +91,7 @@ int bdb_modify_internal(
 
        for ( ml = modlist; ml != NULL; ml = ml->sml_next ) {
                mod = &ml->sml_mod;
+               got_delete = 0;
 
                switch ( mod->sm_op ) {
                case LDAP_MOD_ADD:
@@ -117,6 +121,8 @@ int bdb_modify_internal(
                        if( err != LDAP_SUCCESS ) {
                                Debug(LDAP_DEBUG_ARGS, "bdb_modify_internal: %d %s\n",
                                        err, *text, 0);
+                       } else {
+                               got_delete = 1;
                        }
                        break;
 
@@ -129,6 +135,8 @@ int bdb_modify_internal(
                        if( err != LDAP_SUCCESS ) {
                                Debug(LDAP_DEBUG_ARGS, "bdb_modify_internal: %d %s\n",
                                        err, *text, 0);
+                       } else {
+                               got_delete = 1;
                        }
                        break;
 
@@ -142,6 +150,8 @@ int bdb_modify_internal(
                                Debug(LDAP_DEBUG_ARGS,
                                        "bdb_modify_internal: %d %s\n",
                                        err, *text, 0);
+                       } else {
+                               got_delete = 1;
                        }
                        break;
 
@@ -194,13 +204,24 @@ int bdb_modify_internal(
 
                /* check if modified attribute was indexed
                 * but not in case of NOOP... */
-               err = bdb_index_is_indexed( op->o_bd, mod->sm_desc );
-               if ( err == LDAP_SUCCESS && !op->o_noop ) {
-                       ap = attr_find( save_attrs, mod->sm_desc );
-                       if ( ap ) ap->a_flags |= SLAP_ATTR_IXDEL;
-
-                       ap = attr_find( e->e_attrs, mod->sm_desc );
-                       if ( ap ) ap->a_flags |= SLAP_ATTR_IXADD;
+               ai = bdb_index_mask( op->o_bd, mod->sm_desc, &ix_at );
+               if ( ai && !op->o_noop ) {
+                       if ( got_delete ) {
+                               struct berval ix2;
+
+                               ap = attr_find( save_attrs, mod->sm_desc );
+                               if ( ap ) ap->a_flags |= SLAP_ATTR_IXDEL;
+
+                               /* Find all other attrs that index to same slot */
+                               for ( ap = e->e_attrs; ap; ap=ap->a_next ) {
+                                       ai = bdb_index_mask( op->o_bd, ap->a_desc, &ix2 );
+                                       if ( ai && ix2.bv_val == ix_at.bv_val )
+                                               ap->a_flags |= SLAP_ATTR_IXADD;
+                               }
+                       } else {
+                               ap = attr_find( e->e_attrs, mod->sm_desc );
+                               if ( ap ) ap->a_flags |= SLAP_ATTR_IXADD;
+                       }
                }
        }
 
index 4b547dce703ed685f706805af9b6f59afcb41897..1e4c0c936fef2b786db470df1d47ad4572303be5 100644 (file)
@@ -74,7 +74,7 @@ int bdb_back_init_cf( BackendInfo *bi );
 int
 bdb_db_cache(
     Backend    *be,
-    const char *name,
+    struct berval *name,
        DB **db );
 
 /*
@@ -328,7 +328,7 @@ int bdb_idl_append_one( ID *ids, ID id );
 /*
  * index.c
  */
-#define bdb_index_is_indexed           BDB_SYMBOL(index_is_indexed)
+#define bdb_index_mask                         BDB_SYMBOL(index_mask)
 #define bdb_index_param                                BDB_SYMBOL(index_param)
 #define bdb_index_values                       BDB_SYMBOL(index_values)
 #define bdb_index_entry                                BDB_SYMBOL(index_entry)
@@ -336,9 +336,10 @@ int bdb_idl_append_one( ID *ids, ID id );
 #define bdb_index_recrun                       BDB_SYMBOL(index_recrun)
 
 extern int
-bdb_index_is_indexed LDAP_P((
+bdb_index_mask LDAP_P((
        Backend *be,
-       AttributeDescription *desc ));
+       AttributeDescription *desc,
+       struct berval *name ));
 
 extern int
 bdb_index_param LDAP_P((