]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/dn2id.c
ITS#2449, broken NOT filters
[openldap] / servers / slapd / back-bdb / dn2id.c
index d3e0ede9573c6ec4662491a7f763a00bb76ffeea..736409b63ce47237a1410a7d175be94b8dc4279d 100644 (file)
@@ -299,7 +299,7 @@ bdb_dn2id(
        DB_TXN *txn,
        struct berval   *dn,
        ID *id,
-       int flags )
+       void *ctx )
 {
        int             rc;
        DBT             key, data;
@@ -314,14 +314,9 @@ bdb_dn2id(
 
        assert (id);
  
-       *id = bdb_cache_find_entry_ndn2id(be, &bdb->bi_cache, dn);
-       if (*id != NOID) {
-               return 0;
-       }
-
        DBTzero( &key );
        key.size = dn->bv_len + 2;
-       key.data = ch_malloc( key.size );
+       key.data = sl_malloc( key.size, ctx );
        ((char *)key.data)[0] = DN_BASE_PREFIX;
        AC_MEMCPY( &((char *)key.data)[1], dn->bv_val, key.size - 1 );
 
@@ -332,7 +327,7 @@ bdb_dn2id(
        data.flags = DB_DBT_USERMEM;
 
        /* fetch it */
-       rc = db->get( db, txn, &key, &data, bdb->bi_db_opflags | flags);
+       rc = db->get( db, txn, &key, &data, bdb->bi_db_opflags );
 
        if( rc != 0 ) {
 #ifdef NEW_LOGGING
@@ -352,163 +347,43 @@ bdb_dn2id(
 #endif
        }
 
-       ch_free( key.data );
+       sl_free( key.data, ctx );
        return rc;
 }
 
 int
-bdb_dn2id_matched(
-       BackendDB       *be,
+bdb_dn2id_children(
+       Operation *op,
        DB_TXN *txn,
-       struct berval   *in,
-       ID *id,
-       ID *id2,
-       int flags )
+       Entry *e )
 {
        int             rc;
-       DBT             key, data;
-       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
-       DB *db = bdb->bi_dn2id->bdi_db;
-       char            *buf;
-       struct  berval dn;
-       ID              cached_id;
 
 #ifdef NEW_LOGGING
        LDAP_LOG ( INDEX, ARGS, 
-               "=> bdb_dn2id_matched( \"%s\" )\n", in->bv_val, 0, 0 );
-#else
-       Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_matched( \"%s\" )\n", in->bv_val, 0, 0 );
-#endif
-
-       DBTzero( &key );
-       key.size = in->bv_len + 2;
-       buf = ch_malloc( key.size );
-       key.data = buf;
-       dn.bv_val = buf+1;
-       dn.bv_len = key.size - 2;
-       AC_MEMCPY( dn.bv_val, in->bv_val, key.size - 1 );
-
-       /* store the ID */
-       DBTzero( &data );
-       data.data = id;
-       data.ulen = sizeof(ID);
-       data.flags = DB_DBT_USERMEM;
-
-       while(1) {
-               dn.bv_val[-1] = DN_BASE_PREFIX;
-
-               *id = NOID;
-
-               /* lookup cache */
-               cached_id = bdb_cache_find_entry_ndn2id(be, &bdb->bi_cache, &dn);
-               if (cached_id != NOID) {
-                       rc = 0;
-                       *id = cached_id;
-                       if ( dn.bv_val != buf+1 ) {
-                               *id2 = *id;
-                       }
-                       break;
-               } else {
-                       /* fetch it */
-                       rc = db->get(db, txn, &key, &data, bdb->bi_db_opflags | flags );
-               }
-
-               if( rc == DB_NOTFOUND ) {
-                       struct berval   pdn;
-
-                       if ( ! be_issuffix( be, &dn ) ) {
-                               dnParent( &dn, &pdn );
-                       } else {
-#ifdef NEW_LOGGING
-                               LDAP_LOG ( INDEX, DETAIL1, 
-                                       "<= bdb_dn2id_matched: no match\n", 0, 0, 0 );
-#else
-                               Debug( LDAP_DEBUG_TRACE,
-                                       "<= bdb_dn2id_matched: no match\n",
-                                       0, 0, 0 );
-#endif
-                               break;
-                       }
-
-                       key.size = pdn.bv_len + 2;
-                       dn = pdn;
-                       key.data = pdn.bv_val - 1;
-
-               } else if ( rc == 0 ) {
-                       if( data.size != sizeof( ID ) ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG ( INDEX, DETAIL1, 
-                                       "<= bdb_dn2id_matched: get size mismatch:"
-                                       "expected %ld, got %ld\n",
-                                       (long) sizeof(ID), (long) data.size, 0 );
+               "=> bdb_dn2id_children( %s )\n", e->e_nname.bv_val, 0, 0 );
 #else
-                               Debug( LDAP_DEBUG_ANY,
-                                       "<= bdb_dn2id_matched: get size mismatch: "
-                                       "expected %ld, got %ld\n",
-                                       (long) sizeof(ID), (long) data.size, 0 );
+       Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_children( %s )\n",
+               e->e_nname.bv_val, 0, 0 );
 #endif
-                       }
-
-                       if( dn.bv_val != buf+1 ) {
-                               *id2 = *id;
-                       }
 
-#ifdef NEW_LOGGING
-                       LDAP_LOG ( INDEX, DETAIL1, 
-                               "<= bdb_dn2id_matched: id=0x%08lx: %s %s\n",
-                               (long) *id, *id2 == 0 ? "entry" : "matched", dn.bv_val );
-#else
-                       Debug( LDAP_DEBUG_TRACE,
-                               "<= bdb_dn2id_matched: id=0x%08lx: %s %s\n",
-                               (long) *id, *id2 == 0 ? "entry" : "matched", dn.bv_val );
-#endif
-                       break;
-
-               } else {
-#ifdef NEW_LOGGING
-                       LDAP_LOG ( INDEX, ERR, 
-                               "<= bdb_dn2id_matched: get failed: %s (%d)\n",
-                               db_strerror(rc), rc, 0 );
-#else
-                       Debug( LDAP_DEBUG_ANY,
-                               "<= bdb_dn2id_matched: get failed: %s (%d)\n",
-                               db_strerror(rc), rc, 0 );
-#endif
-                       break;
-               }
+       if ( BEI(e)->bei_kids ) {
+               rc = 0;
        }
+       if ( BEI(e)->bei_state & CACHE_ENTRY_NO_KIDS ) {
+               rc = DB_NOTFOUND;
+       } else {
 
-       ch_free( buf );
-       return rc;
-}
-
-int
-bdb_dn2id_children(
-       BackendDB       *be,
-       DB_TXN *txn,
-       struct berval *dn, 
-       int flags )
-{
-       int             rc;
        DBT             key, data;
-       struct bdb_info *bdb = (struct bdb_info *) be->be_private;
+       struct bdb_info *bdb = (struct bdb_info *) op->o_bd->be_private;
        DB *db = bdb->bi_dn2id->bdi_db;
        ID              id;
 
-#ifdef NEW_LOGGING
-       LDAP_LOG ( INDEX, ARGS, 
-               "=> bdb_dn2id_children( %s )\n", dn->bv_val, 0, 0 );
-#else
-       Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_children( %s )\n",
-               dn->bv_val, 0, 0 );
-#endif
-
        DBTzero( &key );
-       key.size = dn->bv_len + 2;
-       key.data = ch_malloc( key.size );
+       key.size = e->e_nname.bv_len + 2;
+       key.data = sl_malloc( key.size, op->o_tmpmemctx );
        ((char *)key.data)[0] = DN_ONE_PREFIX;
-       AC_MEMCPY( &((char *)key.data)[1], dn->bv_val, key.size - 1 );
+       AC_MEMCPY( &((char *)key.data)[1], e->e_nname.bv_val, key.size - 1 );
 
        /* we actually could do a empty get... */
        DBTzero( &data );
@@ -518,17 +393,23 @@ bdb_dn2id_children(
        data.doff = 0;
        data.dlen = sizeof(id);
 
-       rc = db->get( db, txn, &key, &data, bdb->bi_db_opflags | flags );
-       free( key.data );
+       rc = db->get( db, txn, &key, &data, bdb->bi_db_opflags );
+       sl_free( key.data, op->o_tmpmemctx );
+
+       if ( rc == DB_NOTFOUND ) {
+               BEI(e)->bei_state |= CACHE_ENTRY_NO_KIDS;
+       }
+
+       }
 
 #ifdef NEW_LOGGING
        LDAP_LOG ( INDEX, DETAIL1, 
-               "<= bdb_dn2id_children( %s ): %schildren (%d)\n", 
-               dn->bv_val, rc == 0 ? "" : ( rc == DB_NOTFOUND ? "no " :
+               "<= bdb_dn2id_children( %s ): %s (%d)\n", 
+               e->e_nname.bv_val, rc == 0 ? "" : ( rc == DB_NOTFOUND ? "no " :
                db_strerror(rc)), rc );
 #else
-       Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_children( %s ): %schildren (%d)\n",
-               dn->bv_val,
+       Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_children( %s ): %s (%d)\n",
+               e->e_nname.bv_val,
                rc == 0 ? "" : ( rc == DB_NOTFOUND ? "no " :
                        db_strerror(rc) ), rc );
 #endif