]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/search.c
Code clean-up.
[openldap] / servers / slapd / back-ldbm / search.c
index 0b488c00041a33e748dc0cb450cde7a5faf17de8..a754e21e2a9d9d1ab167dcd7b1e9839a978a20da 100644 (file)
@@ -11,9 +11,9 @@
 #include "back-ldbm.h"
 #include "proto-back-ldbm.h"
 
-static IDList  *base_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, int *err);
-static IDList  *onelevel_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, int *err);
-static IDList  *subtree_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, Entry *e, int *err, int lookupbase);
+static ID_BLOCK        *base_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, int *err);
+static ID_BLOCK        *onelevel_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, int *err);
+static ID_BLOCK        *subtree_candidates(Backend *be, Connection *conn, Operation *op, char *base, Filter *filter, char **attrs, int attrsonly, char **matched, Entry *e, int *err, int lookupbase);
 
 #define GRABSIZE       BUFSIZ
 
@@ -45,11 +45,11 @@ ldbm_back_search(
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
        int             err;
        time_t          stoptime;
-       IDList          *candidates;
+       ID_BLOCK                *candidates;
        ID              id;
        Entry           *e;
        Attribute       *ref;
-       char            *matched;
+       char            *matched = NULL;
        int             rmaxsize, nrefs;
        char            *rbuf, *rcur, *r;
        int             nentries = 0;
@@ -57,14 +57,14 @@ ldbm_back_search(
 
        Debug(LDAP_DEBUG_ARGS, "=> ldbm_back_search\n", 0, 0, 0);
 
-       if ( tlimit == 0 && be_isroot( be, op->o_dn ) ) {
+       if ( tlimit == 0 && be_isroot( be, op->o_ndn ) ) {
                tlimit = -1;    /* allow root to set no limit */
        } else {
                tlimit = (tlimit > be->be_timelimit || tlimit < 1) ?
                    be->be_timelimit : tlimit;
                stoptime = op->o_time + tlimit;
        }
-       if ( slimit == 0 && be_isroot( be, op->o_dn ) ) {
+       if ( slimit == 0 && be_isroot( be, op->o_ndn ) ) {
                slimit = -1;    /* allow root to set no limit */
        } else {
                slimit = (slimit > be->be_sizelimit || slimit < 1) ?
@@ -85,9 +85,9 @@ ldbm_back_search(
                realBase = ch_strdup(base);
        }
 
-       (void) dn_normalize (realBase);
+       (void) dn_normalize_case( realBase );
 
-       Debug( LDAP_DEBUG_TRACE, "using base %s\n",
+       Debug( LDAP_DEBUG_TRACE, "using base \"%s\"\n",
                realBase, 0, 0 );
 
        switch ( scope ) {
@@ -140,9 +140,9 @@ ldbm_back_search(
        for ( id = idl_firstid( candidates ); id != NOID;
            id = idl_nextid( candidates, id ) ) {
                /* check for abandon */
-               pthread_mutex_lock( &op->o_abandonmutex );
+               ldap_pvt_thread_mutex_lock( &op->o_abandonmutex );
                if ( op->o_abandon ) {
-                       pthread_mutex_unlock( &op->o_abandonmutex );
+                       ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex );
                        idl_free( candidates );
                        free( rbuf );
                        if( realBase != NULL) {
@@ -150,13 +150,13 @@ ldbm_back_search(
                        }
                        return( 0 );
                }
-               pthread_mutex_unlock( &op->o_abandonmutex );
+               ldap_pvt_thread_mutex_unlock( &op->o_abandonmutex );
 
                /* check time limit */
-               pthread_mutex_lock( &currenttime_mutex );
+               ldap_pvt_thread_mutex_lock( &currenttime_mutex );
                time( &currenttime );
                if ( tlimit != -1 && currenttime > stoptime ) {
-                       pthread_mutex_unlock( &currenttime_mutex );
+                       ldap_pvt_thread_mutex_unlock( &currenttime_mutex );
                        send_ldap_search_result( conn, op,
                            LDAP_TIMELIMIT_EXCEEDED, NULL, nrefs > 0 ? rbuf :
                            NULL, nentries );
@@ -167,11 +167,11 @@ ldbm_back_search(
                        }
                        return( 0 );
                }
-               pthread_mutex_unlock( &currenttime_mutex );
+               ldap_pvt_thread_mutex_unlock( &currenttime_mutex );
 
                /* get the entry with reader lock */
                if ( (e = id2entry_r( be, id )) == NULL ) {
-                       Debug( LDAP_DEBUG_ARGS, "candidate %lu not found\n",
+                       Debug( LDAP_DEBUG_ARGS, "candidate %ld not found\n",
                               id, 0, 0 );
                        continue;
                }
@@ -181,10 +181,10 @@ ldbm_back_search(
                 * this for subtree searches, and don't check the filter explicitly
                 * here since it's only a candidate anyway.
                 */
-               if ( e->e_dn != NULL &&
-                       strncasecmp( e->e_dn, "ref=", 4 ) == 0 &&
-                       (ref = attr_find( e->e_attrs, "ref" )) != NULL &&
-                       scope == LDAP_SCOPE_SUBTREE )
+               if ( scope == LDAP_SCOPE_SUBTREE &&
+                       e->e_ndn != NULL &&
+                       strncmp( e->e_ndn, "REF=", 4 ) == 0 &&
+                       (ref = attr_find( e->e_attrs, "ref" )) != NULL )
                {
                        int     i, len;
 
@@ -215,15 +215,16 @@ ldbm_back_search(
                                scopeok = 1;
                                if ( scope == LDAP_SCOPE_ONELEVEL ) {
                                        if ( (dn = dn_parent( be, e->e_dn )) != NULL ) {
-                                               (void) dn_normalize( dn );
-                                               scopeok = (dn == realBase) ? 1 : (! strcasecmp( dn, realBase ));
+                                               (void) dn_normalize_case( dn );
+                                               scopeok = (dn == realBase)
+                                                       ? 1
+                                                       : (strcmp( dn, realBase ) ? 0 : 1 );
+                                               free( dn );
                                        } else {
                                                scopeok = (realBase == NULL || *realBase == '\0');
                                        }
-                                       free( dn );
                                } else if ( scope == LDAP_SCOPE_SUBTREE ) {
-                                       dn = ch_strdup( e->e_dn );
-                                       (void) dn_normalize( dn );
+                                       dn = ch_strdup( e->e_ndn );
                                        scopeok = dn_issuffix( dn, realBase );
                                        free( dn );
                                }
@@ -253,28 +254,35 @@ ldbm_back_search(
                                        case LDAP_DEREF_ALWAYS:
                                                {
                                                        Entry *newe = derefAlias_r( be, conn, op, e );
-                                                       cache_return_entry_r( &li->li_cache, e );
-                                                       e = newe;
+                                                       if ( newe == NULL ) { /* problem with the alias */
+                                                               cache_return_entry_r( &li->li_cache, e );
+                                                               e = NULL;
+                                                       }
+                                                       else if ( newe != e ) { /* reassign e */
+                                                               cache_return_entry_r( &li->li_cache, e );
+                                                               e = newe;
+                                                       }       
                                                }
                                                break;
                                        }
+                                       if (e) {
+                                               switch ( send_search_entry( be, conn, op, e,
+                                                       attrs, attrsonly ) ) {
+                                               case 0:         /* entry sent ok */
+                                                       nentries++;
+                                                       break;
+                                               case 1:         /* entry not sent */
+                                                       break;
+                                               case -1:        /* connection closed */
+                                                       cache_return_entry_r( &li->li_cache, e );
+                                                       idl_free( candidates );
+                                                       free( rbuf );
 
-                                       switch ( send_search_entry( be, conn, op, e,
-                                               attrs, attrsonly ) ) {
-                                       case 0:         /* entry sent ok */
-                                               nentries++;
-                                               break;
-                                       case 1:         /* entry not sent */
-                                               break;
-                                       case -1:        /* connection closed */
-                                               cache_return_entry_r( &li->li_cache, e );
-                                               idl_free( candidates );
-                                               free( rbuf );
-
-                                               if( realBase != NULL) {
-                                                       free( realBase );
+                                                       if( realBase != NULL) {
+                                                               free( realBase );
+                                                       }
+                                                       return( 0 );
                                                }
-                                               return( 0 );
                                        }
                                }
                        }
@@ -285,7 +293,7 @@ ldbm_back_search(
                        cache_return_entry_r( &li->li_cache, e );
                }
 
-               pthread_yield();
+               ldap_pvt_thread_yield();
        }
        idl_free( candidates );
        if ( nrefs > 0 ) {
@@ -304,7 +312,7 @@ ldbm_back_search(
        return( 0 );
 }
 
-static IDList *
+static ID_BLOCK *
 base_candidates(
     Backend    *be,
     Connection *conn,
@@ -320,10 +328,10 @@ base_candidates(
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
        int             rc;
        ID              id;
-       IDList          *idl;
+       ID_BLOCK                *idl;
        Entry           *e;
 
-       Debug(LDAP_DEBUG_TRACE, "base_candidates: base: %s\n", base, 0, 0);
+       Debug(LDAP_DEBUG_TRACE, "base_candidates: base: \"%s\"\n", base, 0, 0);
 
        *err = LDAP_SUCCESS;
 
@@ -345,7 +353,7 @@ base_candidates(
        return( idl );
 }
 
-static IDList *
+static ID_BLOCK *
 onelevel_candidates(
     Backend    *be,
     Connection *conn,
@@ -359,15 +367,15 @@ onelevel_candidates(
 )
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
-       Entry           *e;
+       Entry           *e = NULL;
        Filter          *f;
        char            buf[20];
-       IDList          *candidates;
+       ID_BLOCK                *candidates;
 
-       Debug(LDAP_DEBUG_TRACE, "onelevel_candidates: base: %s\n", base, 0, 0);
+       Debug(LDAP_DEBUG_TRACE, "onelevel_candidates: base: \"%s\"\n", base, 0, 0);
 
        *err = LDAP_SUCCESS;
-       e = NULL;
+
        /* get the base object with reader lock */
        if ( base != NULL && *base != '\0' &&
                (e = dn2entry_r( be, base, matched )) == NULL )
@@ -402,11 +410,13 @@ onelevel_candidates(
        filter_free( f );
 
        /* free entry and reader lock */
-       cache_return_entry_r( &li->li_cache, e );
+       if( e != NULL ) {
+               cache_return_entry_r( &li->li_cache, e );
+       }
        return( candidates );
 }
 
-static IDList *
+static ID_BLOCK *
 subtree_candidates(
     Backend    *be,
     Connection *conn,
@@ -423,10 +433,10 @@ subtree_candidates(
 {
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
        Filter          *f, **filterarg_ptr;
-       IDList          *candidates;
+       ID_BLOCK                *candidates;
 
-       Debug(LDAP_DEBUG_TRACE, "subtree_candidates: base: %s\n",
-               base ? base : "NULL", 0, 0);
+       Debug(LDAP_DEBUG_TRACE, "subtree_candidates: base: \"%s\" %s\n",
+               base ? base : "NULL", lookupbase ? "lookupbase" : "", 0);
 
        /*
         * get the base object - unless we already have it (from one-level).
@@ -442,6 +452,8 @@ subtree_candidates(
        *err = LDAP_SUCCESS;
        f = NULL;
        if ( lookupbase ) {
+               e = NULL;
+
                if ( base != NULL && *base != '\0' &&
                        (e = dn2entry_r( be, base, matched )) == NULL )
                {