X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-sql%2Fsearch.c;h=44b061777238892f449427af4bef90033241171c;hb=40cac2e37a45cbe2ce5fb69e902ad602baf65284;hp=accaa533e7b426137e0d17ff1dea984ad49b2132;hpb=0f18e6ce2495062c6f8d1db6392f248f3178501f;p=openldap diff --git a/servers/slapd/back-sql/search.c b/servers/slapd/back-sql/search.c index accaa533e7..44b0617772 100644 --- a/servers/slapd/back-sql/search.c +++ b/servers/slapd/back-sql/search.c @@ -109,8 +109,6 @@ backsql_init_search( backsql_srch_info *bsi, struct berval *nbase, int scope, - int slimit, - int tlimit, time_t stoptime, Filter *filter, SQLHDBC dbh, @@ -127,8 +125,6 @@ backsql_init_search( BER_BVZERO( &bsi->bsi_base_id.eid_dn ); BER_BVZERO( &bsi->bsi_base_id.eid_ndn ); bsi->bsi_scope = scope; - bsi->bsi_slimit = slimit; - bsi->bsi_tlimit = tlimit; bsi->bsi_filter = filter; bsi->bsi_dbh = dbh; bsi->bsi_op = op; @@ -253,7 +249,6 @@ backsql_init_search( } } - bsi->bsi_abandon = 0; bsi->bsi_id_list = NULL; bsi->bsi_id_listtail = &bsi->bsi_id_list; bsi->bsi_n_candidates = 0; @@ -273,7 +268,7 @@ backsql_init_search( int getentry = BACKSQL_IS_GET_ENTRY( flags ); int gotit = 0; - assert( op->o_bd->be_private ); + assert( op->o_bd->be_private != NULL ); rc = backsql_dn2id( op, rs, dbh, nbase, &bsi->bsi_base_id, matched, 1 ); @@ -1248,10 +1243,10 @@ equality_match:; static int backsql_srch_query( backsql_srch_info *bsi, struct berval *query ) { - backsql_info *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private; - int rc; + backsql_info *bi = (backsql_info *)bsi->bsi_op->o_bd->be_private; + int rc; - assert( query ); + assert( query != NULL ); BER_BVZERO( query ); bsi->bsi_use_subtree_shortcut = 0; @@ -1289,14 +1284,8 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query ) &bsi->bsi_oc->bom_oc->soc_cname, '\'' ); } - backsql_strfcat( &bsi->bsi_sel, "l", - (ber_len_t)STRLENOF( " " BACKSQL_ALIASING - BACKSQL_ALIASING_QUOTE "objectClass" BACKSQL_ALIASING_QUOTE - ",ldap_entries.dn " BACKSQL_ALIASING BACKSQL_ALIASING_QUOTE "dn" BACKSQL_ALIASING_QUOTE ), - " " BACKSQL_ALIASING - BACKSQL_ALIASING_QUOTE "objectClass" BACKSQL_ALIASING_QUOTE - ",ldap_entries.dn " BACKSQL_ALIASING BACKSQL_ALIASING_QUOTE "dn" BACKSQL_ALIASING_QUOTE ); + backsql_strfcat( &bsi->bsi_sel, "b", &bi->sql_dn_oc_aliasing ); backsql_strfcat( &bsi->bsi_from, "lb", (ber_len_t)STRLENOF( " FROM ldap_entries," ), " FROM ldap_entries,", @@ -1351,7 +1340,7 @@ backsql_srch_query( backsql_srch_info *bsi, struct berval *query ) int i; BackendDB *bd = bsi->bsi_op->o_bd; - assert( bd->be_nsuffix ); + assert( bd->be_nsuffix != NULL ); for ( i = 0; !BER_BVISNULL( &bd->be_nsuffix[ i ] ); i++ ) { @@ -1464,6 +1453,12 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi ) Debug( LDAP_DEBUG_TRACE, "==>backsql_oc_get_candidates(): oc=\"%s\"\n", BACKSQL_OC_NAME( oc ), 0, 0 ); + /* check for abandon */ + if ( op->o_abandon ) { + bsi->bsi_status = SLAPD_ABANDON; + return BACKSQL_AVL_STOP; + } + if ( bsi->bsi_n_candidates == -1 ) { Debug( LDAP_DEBUG_TRACE, "backsql_oc_get_candidates(): " "unchecked limit has been overcome\n", 0, 0, 0 ); @@ -1696,7 +1691,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi ) return BACKSQL_AVL_CONTINUE; } - backsql_BindRowAsStrings( sth, &row ); + backsql_BindRowAsStrings_x( sth, &row, bsi->bsi_op->o_tmpmemctx ); rc = SQLFetch( sth ); for ( ; BACKSQL_SUCCESS( rc ); rc = SQLFetch( sth ) ) { struct berval dn, pdn, ndn; @@ -1762,7 +1757,7 @@ backsql_oc_get_candidates( void *v_oc, void *v_bsi ) break; } } - backsql_FreeRow( &row ); + backsql_FreeRow_x( &row, bsi->bsi_op->o_tmpmemctx ); SQLFreeStmt( sth, SQL_DROP ); Debug( LDAP_DEBUG_TRACE, "<==backsql_oc_get_candidates(): %d\n", @@ -1828,7 +1823,6 @@ backsql_search( Operation *op, SlapReply *rs ) bsi.bsi_e = &base_entry; rs->sr_err = backsql_init_search( &bsi, &op->o_req_ndn, op->ors_scope, - op->ors_slimit, op->ors_tlimit, stoptime, op->ors_filter, dbh, op, rs, op->ors_attrs, ( BACKSQL_ISF_MATCHED | BACKSQL_ISF_GET_ENTRY ) ); @@ -1849,6 +1843,10 @@ backsql_search( Operation *op, SlapReply *rs ) } break; } + + /* an entry was created; free it */ + entry_clean( bsi.bsi_e ); + /* fall thru */ default: @@ -1869,8 +1867,13 @@ backsql_search( Operation *op, SlapReply *rs ) #endif /* SLAP_ACL_HONOR_DISCLOSE */ send_ldap_result( op, rs ); - goto done; + if ( rs->sr_ref ) { + ber_bvarray_free( rs->sr_ref ); + rs->sr_ref = NULL; + } + + goto done; } #ifdef SLAP_ACL_HONOR_DISCLOSE /* NOTE: __NEW__ "search" access is required @@ -1943,6 +1946,13 @@ backsql_search( Operation *op, SlapReply *rs ) */ avl_apply( bi->sql_oc_by_oc, backsql_oc_get_candidates, &bsi, BACKSQL_AVL_STOP, AVL_INORDER ); + + /* check for abandon */ + if ( op->o_abandon ) { + eid = bsi.bsi_id_list; + rs->sr_err = SLAPD_ABANDON; + goto send_results; + } } if ( op->ors_limit != NULL /* isroot == FALSE */ @@ -1973,7 +1983,8 @@ backsql_search( Operation *op, SlapReply *rs ) /* check for abandon */ if ( op->o_abandon ) { - break; + rs->sr_err = SLAPD_ABANDON; + goto send_results; } /* check time limit */ @@ -2072,7 +2083,6 @@ backsql_search( Operation *op, SlapReply *rs ) rc = backsql_init_search( &bsi2, &e->e_nname, LDAP_SCOPE_BASE, - SLAP_NO_LIMIT, SLAP_NO_LIMIT, (time_t)(-1), NULL, dbh, op, rs, NULL, BACKSQL_ISF_GET_ENTRY ); @@ -2084,7 +2094,7 @@ backsql_search( Operation *op, SlapReply *rs ) } else { rs->sr_err = LDAP_OTHER; } - entry_clean( &user_entry2 ); + backsql_entry_clean( op, &user_entry2 ); } if ( bsi2.bsi_attrs != NULL ) { op->o_tmpfree( bsi2.bsi_attrs, @@ -2125,7 +2135,7 @@ backsql_search( Operation *op, SlapReply *rs ) * filter_has_subordinates() */ if ( bsi.bsi_flags & BSQL_SF_FILTER_HASSUBORDINATE ) { - rc = backsql_has_children( bi, dbh, &e->e_nname ); + rc = backsql_has_children( op, dbh, &e->e_nname ); switch ( rc ) { case LDAP_COMPARE_TRUE: @@ -2206,13 +2216,11 @@ backsql_search( Operation *op, SlapReply *rs ) next_entry:; if ( e == &user_entry ) { - entry_clean( &user_entry ); + backsql_entry_clean( op, &user_entry ); } next_entry2:; - if ( op->ors_slimit != SLAP_NO_LIMIT - && rs->sr_nentries >= op->ors_slimit ) - { + if ( --op->ors_slimit == -1 ) { rs->sr_err = LDAP_SIZELIMIT_EXCEEDED; goto send_results; } @@ -2229,12 +2237,20 @@ end_of_search:; } send_results:; - send_ldap_result( op, rs ); + if ( rs->sr_err != SLAPD_ABANDON ) { + send_ldap_result( op, rs ); + } + + /* cleanup in case of abandon */ + for ( ; eid != NULL; + eid = backsql_free_entryID( op, + eid, eid == &bsi.bsi_base_id ? 0 : 1 ) ) + ; - entry_clean( &base_entry ); + backsql_entry_clean( op, &base_entry ); /* in case we got here accidentally */ - entry_clean( &user_entry ); + backsql_entry_clean( op, &user_entry ); if ( rs->sr_v2ref ) { ber_bvarray_free( rs->sr_v2ref ); @@ -2282,7 +2298,8 @@ done:; } Debug( LDAP_DEBUG_TRACE, "<==backsql_search()\n", 0, 0, 0 ); - return 0; + + return rs->sr_err; } /* return LDAP_SUCCESS IFF we can retrieve the specified entry. @@ -2319,7 +2336,6 @@ backsql_entry_get( rc = backsql_init_search( &bsi, ndn, LDAP_SCOPE_BASE, - SLAP_NO_LIMIT, SLAP_NO_LIMIT, (time_t)(-1), NULL, dbh, op, &rs, at ? anlist : NULL, BACKSQL_ISF_GET_ENTRY ); @@ -2375,3 +2391,39 @@ return_results:; return rc; } +void +backsql_entry_clean( + Operation *op, + Entry *e ) +{ + void *ctx; + + ctx = ldap_pvt_thread_pool_context(); + + if ( ctx == NULL || ctx != op->o_tmpmemctx ) { + if ( !BER_BVISNULL( &e->e_name ) ) { + op->o_tmpfree( e->e_name.bv_val, op->o_tmpmemctx ); + BER_BVZERO( &e->e_name ); + } + + if ( !BER_BVISNULL( &e->e_nname ) ) { + op->o_tmpfree( e->e_nname.bv_val, op->o_tmpmemctx ); + BER_BVZERO( &e->e_nname ); + } + } + + entry_clean( e ); +} + +int +backsql_entry_release( + Operation *op, + Entry *e, + int rw ) +{ + backsql_entry_clean( op, e ); + + ch_free( e ); + + return 0; +}