struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        int rc;
        DBT data;
-#ifdef BDB_IDL_MULTI
-       /* buf must be large enough to grab the entire IDL in one
-        * get(), otherwise BDB 4 will leak resources on subsequent
-        * get's. We can safely call get() twice - once for the data,
-        * and once to get the DB_NOTFOUND result meaning there's
-        * no more data. See ITS#2040 for details.
-        */
-       ID buf[BDB_IDL_DB_SIZE*5];
        DBC *cursor;
        ID *i;
        void *ptr;
        size_t len;
        int rc2;
        int flags = bdb->bi_db_opflags | DB_MULTIPLE;
-#endif
+
+       /* buf must be large enough to grab the entire IDL in one
+        * get(), otherwise BDB 4 will leak resources on subsequent
+        * get's. We can safely call get() twice - once for the data,
+        * and once to get the DB_NOTFOUND result meaning there's
+        * no more data. See ITS#2040 for details. This bug is fixed
+        * in BDB 4.1 so a smaller buffer will work if stack space is
+        * too limited.
+        */
+       ID buf[BDB_IDL_DB_SIZE*5];
 
        {
                char buf[16];
 
        DBTzero( &data );
 
-#ifdef BDB_IDL_MULTI
        data.data = buf;
        data.ulen = sizeof(buf);
        data.flags = DB_DBT_USERMEM;
 #endif
                return rc2;
        }
-#else /* BDB_IDL_MULTI */
-       data.data = ids;
-       data.ulen = BDB_IDL_UM_SIZEOF;
-       data.flags = DB_DBT_USERMEM;
-       /* fetch it */
-       rc = db->get( db, tid, key, &data, bdb->bi_db_opflags );
-#endif /* BDB_IDL_MULTI */
-
        if( rc == DB_NOTFOUND ) {
                return rc;
 
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        int     rc;
        DBT data;
-#ifdef BDB_IDL_MULTI
        DBC *cursor;
        ID lo, hi, tmp;
        char *err;
-#else
-       ID ids[BDB_IDL_DB_SIZE];
-#endif
 
        {
                char buf[16];
        assert( id != NOID );
 
        DBTzero( &data );
-#ifdef BDB_IDL_MULTI
        data.size = sizeof( ID );
        data.ulen = data.size;
        data.flags = DB_DBT_USERMEM;
                return rc;
        }
        rc = cursor->c_close( cursor );
-#else  /* !BDB_IDL_MULTI */
-       data.data = ids;
-       data.ulen = sizeof ids;
-       data.flags = DB_DBT_USERMEM;
-
-       /* fetch the key for read/modify/write */
-       rc = db->get( db, tid, key, &data, DB_RMW | bdb->bi_db_opflags );
-
-       if( rc == DB_NOTFOUND ) {
-               ids[0] = 1;
-               ids[1] = id;
-               data.size = 2 * sizeof( ID );
-
-       } else if ( rc != 0 ) {
-#ifdef NEW_LOGGING
-               LDAP_LOG( INDEX, ERR, "bdb_idl_insert_key: get failed: %s (%d)\n", 
-                       db_strerror(rc), rc, 0 );
-#else
-               Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: "
-                       "get failed: %s (%d)\n",
-                       db_strerror(rc), rc, 0 );
-#endif
-               return rc;
-
-       } else if ( data.size == 0 || data.size % sizeof( ID ) ) {
-               /* size not multiple of ID size */
-#ifdef NEW_LOGGING
-               LDAP_LOG( INDEX, ERR, 
-                       "bdb_idl_insert_key: odd size: expected %ld multiple, got %ld\n", 
-                       (long) sizeof( ID ), (long) data.size, 0 );
-#else
-               Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: "
-                       "odd size: expected %ld multiple, got %ld\n",
-                       (long) sizeof( ID ), (long) data.size, 0 );
-#endif
-               return -1;
-       
-       } else if ( data.size != BDB_IDL_SIZEOF(ids) ) {
-               /* size mismatch */
-#ifdef NEW_LOGGING
-               LDAP_LOG( INDEX, ERR, 
-                       "bdb_idl_insert_key: odd size: expected %ld multiple, got %ld\n", 
-                       (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size, 0 );
-#else
-               Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: "
-                       "get size mismatch: expected %ld, got %ld\n",
-                       (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size, 0 );
-#endif
-               return -1;
-
-       } else if ( BDB_IDL_IS_RANGE(ids) ) {
-               if( id < ids[1] ) {
-                       ids[1] = id;
-               } else if ( ids[2] > id ) {
-                       ids[2] = id;
-               } else {
-                       return 0;
-               }
-
-       } else {
-               rc = bdb_idl_insert( ids, id );
-
-               if( rc == -1 ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( INDEX, DETAIL1, "bdb_idl_insert_key: dup\n", 0, 0, 0 );
-#else
-                       Debug( LDAP_DEBUG_TRACE, "=> bdb_idl_insert_key: dup\n",
-                               0, 0, 0 );
-#endif
-                       return 0;
-               }
-               if( rc != 0 ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( INDEX, ERR, 
-                               "bdb_idl_insert_key: insert failed: (%d)\n", rc, 0, 0 );
-#else
-                       Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: "
-                               "bdb_idl_insert failed (%d)\n",
-                               rc, 0, 0 );
-#endif
-                       
-                       return rc;
-               }
-
-               data.size = BDB_IDL_SIZEOF( ids );
-       }
-
-       /* store the key */
-       rc = db->put( db, tid, key, &data, 0 );
-#endif
-       if( rc != 0 && rc != DB_KEYEXIST ) {
+       if( rc != 0 ) {
 #ifdef NEW_LOGGING
                LDAP_LOG( INDEX, ERR, 
-                       "bdb_idl_insert_key: put failed: %s (%d)\n", 
+                       "bdb_idl_insert_key: c_close failed: %s (%d)\n", 
                        db_strerror(rc), rc, 0 );
 #else
                Debug( LDAP_DEBUG_ANY, "=> bdb_idl_insert_key: "
-                       "put failed: %s (%d)\n",
+                       "c_close failed: %s (%d)\n",
                        db_strerror(rc), rc, 0 );
 #endif
        }
        struct bdb_info *bdb = (struct bdb_info *) be->be_private;
        int     rc;
        DBT data;
-#ifdef BDB_IDL_MULTI
        DBC *cursor;
        ID lo, hi, tmp;
        char *err;
-#else
-       ID ids[BDB_IDL_DB_SIZE];
-#endif
 
        {
                char buf[16];
        assert( id != NOID );
 
        DBTzero( &data );
-
-#ifdef BDB_IDL_MULTI
        data.data = &tmp;
        data.size = sizeof( id );
        data.ulen = data.size;
                return rc;
        }
        rc = cursor->c_close( cursor );
-
-#else  /* BDB_IDL_MULTI */
-
-       data.data = ids;
-       data.ulen = sizeof( ids );
-       data.flags = DB_DBT_USERMEM;
-
-       /* fetch the key for read/modify/write */
-       rc = db->get( db, tid, key, &data, DB_RMW | bdb->bi_db_opflags );
-
-       if ( rc != 0 ) {
-#ifdef NEW_LOGGING
-               LDAP_LOG( INDEX, ERR, "bdb_idl_delete_key: get failed: %s (%d)\n", 
-                       db_strerror(rc), rc, 0 );
-#else
-               Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: "
-                       "get failed: %s (%d)\n",
-                       db_strerror(rc), rc, 0 );
-#endif
-               return rc;
-
-       } else if ( data.size == 0 || data.size % sizeof( ID ) ) {
-               /* size not multiple of ID size */
-#ifdef NEW_LOGGING
-               LDAP_LOG( INDEX, ERR, 
-                       "bdb_idl_delete_key: odd size: expected: %ld multiple, got %ld\n", 
-                       (long) sizeof( ID ), (long) data.size, 0 );
-#else
-               Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: "
-                       "odd size: expected %ld multiple, got %ld\n",
-                       (long) sizeof( ID ), (long) data.size, 0 );
-#endif
-               return -1;
-       
-       } else if ( BDB_IDL_IS_RANGE(ids) ) {
-               return 0;
-
-       } else if ( data.size != (1 + ids[0]) * sizeof( ID ) ) {
-               /* size mismatch */
-#ifdef NEW_LOGGING
-               LDAP_LOG( INDEX, ERR, 
-                       "bdb_idl_delete_key: get size mismatch: expected: %ld, got %ld\n", 
-                       (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size, 0 );
-#else
-               Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: "
-                       "get size mismatch: expected %ld, got %ld\n",
-                       (long) ((1 + ids[0]) * sizeof( ID )), (long) data.size, 0 );
-#endif
-               return -1;
-
-       } else {
-               rc = idl_delete( ids, id );
-
-               if( rc != 0 ) {
-#ifdef NEW_LOGGING
-                       LDAP_LOG( INDEX, ERR, 
-                               "bdb_idl_delete_key: delete failed: (%d)\n", rc, 0, 0 );
-#else
-                       Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: "
-                               "idl_delete failed (%d)\n",
-                               rc, 0, 0 );
-#endif
-                       return rc;
-               }
-
-               if( ids[0] == 0 ) {
-                       /* delete the key */
-                       rc = db->del( db, tid, key, 0 );
-                       if( rc != 0 ) {
-#ifdef NEW_LOGGING
-                               LDAP_LOG( INDEX, ERR, 
-                                       "bdb_idl_delete_key: delete failed: %s (%d)\n",
-                                       db_strerror(rc), rc, 0 );
-#else
-                               Debug( LDAP_DEBUG_ANY, "=> bdb_idl_delete_key: "
-                                       "delete failed: %s (%d)\n",
-                                       db_strerror(rc), rc, 0 );
-#endif
-                       }
-                       return rc;
-               }
-
-               data.size = (ids[0]+1) * sizeof( ID );
-       }
-
-       /* store the key */
-       rc = db->put( db, tid, key, &data, 0 );
-
-#endif /* BDB_IDL_MULTI */
-
        if( rc != 0 ) {
 #ifdef NEW_LOGGING
-               LDAP_LOG( INDEX, ERR, "bdb_idl_delete_key: put failed: %s (%d)\n", 
+               LDAP_LOG( INDEX, ERR, "bdb_idl_delete_key: c_close failed: %s (%d)\n", 
                        db_strerror(rc), rc, 0 );
 #else
                Debug( LDAP_DEBUG_ANY,
-                       "=> bdb_idl_delete_key: put failed: %s (%d)\n",
+                       "=> bdb_idl_delete_key: c_close failed: %s (%d)\n",
                        db_strerror(rc), rc, 0 );
 #endif
        }