+
+ idl = idl_allids( op->o_bd );
+
+ rc = index_param( op->o_bd, ava->aa_desc, LDAP_FILTER_APPROX,
+ &dbname, &mask, &prefix );
+
+ if( rc != LDAP_SUCCESS ) {
+#ifdef NEW_LOGGING
+ LDAP_LOG( FILTER, ERR,
+ "approx_candidates: index_param returned %d\n", rc, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE,
+ "<= approx_candidates: index_param returned=%d\n",
+ rc, 0, 0 );
+#endif
+
+ return idl;
+ }
+
+ if( dbname == NULL ) {
+ /* not indexed */
+#ifdef NEW_LOGGING
+ LDAP_LOG( FILTER, ERR, "approx_candidates: not indexed\n", 0, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_ANY,
+ "<= approx_candidates: not indexed\n",
+ 0, 0, 0 );
+#endif
+
+ return idl;
+ }
+
+ mr = ava->aa_desc->ad_type->sat_approx;
+ if( !mr ) {
+ /* no approx matching rule, try equality matching rule */
+ mr = ava->aa_desc->ad_type->sat_equality;
+ }
+
+ if( !mr ) {
+ return idl;
+ }
+
+ if( !mr->smr_filter ) {
+ return idl;
+ }
+
+ rc = (mr->smr_filter)(
+ LDAP_FILTER_APPROX,
+ mask,
+ ava->aa_desc->ad_type->sat_syntax,
+ mr,
+ &prefix,
+ &ava->aa_value,
+ &keys, op->o_tmpmemctx );
+
+ if( rc != LDAP_SUCCESS ) {
+#ifdef NEW_LOGGING
+ LDAP_LOG( FILTER, ERR,
+ "approx_candidates: (%s%s) MR filter failed (%d)\n",
+ dbname, LDBM_SUFFIX, rc );
+#else
+ Debug( LDAP_DEBUG_TRACE,
+ "<= approx_candidates: (%s%s) MR filter failed (%d)\n",
+ dbname, LDBM_SUFFIX, rc );
+#endif
+
+ return idl;
+ }
+
+ if( keys == NULL ) {
+#ifdef NEW_LOGGING
+ LDAP_LOG( FILTER, INFO,
+ "approx_candidates: no keys (%s%s)\n",
+ dbname, LDBM_SUFFIX, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE,
+ "<= approx_candidates: no keys (%s%s)\n",
+ dbname, LDBM_SUFFIX, 0 );
+#endif
+
+ return idl;
+ }
+
+ db = ldbm_cache_open( op->o_bd, dbname, LDBM_SUFFIX, LDBM_WRCREAT );
+
+ if ( db == NULL ) {
+#ifdef NEW_LOGGING
+ LDAP_LOG( FILTER, ERR,
+ "approx_candidates db open failed (%s%s)\n",
+ dbname, LDBM_SUFFIX, 0 );
+#else
+ Debug( LDAP_DEBUG_ANY,
+ "<= approx_candidates db open failed (%s%s)\n",
+ dbname, LDBM_SUFFIX, 0 );
+#endif
+
+ return idl;
+ }
+
+ for ( i= 0; keys[i].bv_val != NULL; i++ ) {
+ ID_BLOCK *save;
+ ID_BLOCK *tmp;
+
+ rc = key_read( op->o_bd, db, &keys[i], &tmp );
+
+ if( rc != LDAP_SUCCESS ) {
+ idl_free( idl );
+ idl = NULL;
+#ifdef NEW_LOGGING
+ LDAP_LOG( FILTER, ERR,
+ "approx_candidates: key read failed (%d)\n", rc, 0, 0 );
+#else
+ Debug( LDAP_DEBUG_TRACE, "<= approx_candidates key read failed (%d)\n",
+ rc, 0, 0 );
+#endif
+
+ break;
+ }
+
+ if( tmp == NULL ) {