Hi Andrew,

>  static int show_deleted_search(struct ldb_module *module, struct ldb_request 
> *req)
>  {
>       struct ldb_context *ldb;
>       struct ldb_control *control;
>       struct ldb_control **saved_controls;
> -     struct show_deleted_search_request *ar;
>       struct ldb_request *down_req;
> -     char *old_filter;
> -     char *new_filter;
> +     struct ldb_parse_tree *nodeleted_tree;
> +     struct ldb_parse_tree *new_tree = req->op.search.tree;
>       int ret;
>  
>       ldb = ldb_module_get_ctx(module);
>  
> -     ar = talloc_zero(req, struct show_deleted_search_request);
> -     if (ar == NULL) {
> -             return LDB_ERR_OPERATIONS_ERROR;
> -     }
> -     ar->module = module;
> -     ar->req = req;
> -
>       /* check if there's a show deleted control */
>       control = ldb_request_get_control(req, LDB_CONTROL_SHOW_DELETED_OID);
>  
> -     if ( ! control) {
> -             old_filter = ldb_filter_from_tree(ar, req->op.search.tree);
> -             new_filter = talloc_asprintf(ar, "(&(!(isDeleted=TRUE))%s)",
> -                                              old_filter);
> -
> -             ret = ldb_build_search_req(&down_req, ldb, ar,
> -                                        req->op.search.base,
> -                                        req->op.search.scope,
> -                                        new_filter,
> -                                        req->op.search.attrs,
> -                                        req->controls,
> -                                        ar, show_deleted_search_callback,
> -                                        req);
> -
> -     } else {
> -             ret = ldb_build_search_req_ex(&down_req, ldb, ar,
> -                                           req->op.search.base,
> -                                           req->op.search.scope,
> -                                           req->op.search.tree,
> -                                           req->op.search.attrs,
> -                                           req->controls,
> -                                           ar, show_deleted_search_callback,
> -                                           req);
> +     if (! control) {
> +             nodeleted_tree = 
> talloc_get_type(ldb_module_get_private(module), 
> +                                              struct ldb_parse_tree);
> +             if (nodeleted_tree) {
> +                     new_tree = talloc(req, struct ldb_parse_tree);
> +                     if (!new_tree) {
> +                             ldb_oom(ldb);
> +                             return LDB_ERR_OPERATIONS_ERROR;
> +                     }
> +                     *new_tree = *nodeleted_tree;
> +                     /* Replace dummy part of 'and' with the old, tree,
> +                        without a parse step */
> +                     new_tree->u.list.elements[0] = req->op.search.tree;
> +             }
>       }
> +     
> +     ret = ldb_build_search_req_ex(&down_req, ldb, req,
> +                                   req->op.search.base,
> +                                   req->op.search.scope,
> +                                   new_tree,
> +                                   req->op.search.attrs,
> +                                   req->controls,
> +                                   req->context, req->callback,
> +                                   req);
>       if (ret != LDB_SUCCESS) {
>               return ret;
>       }
> @@ -138,10 +93,20 @@ static int show_deleted_search(struct ldb_module 
> *module, struct ldb_request *re
>  static int show_deleted_init(struct ldb_module *module)
>  {
>       struct ldb_context *ldb;
> +     struct ldb_parse_tree *nodeleted_tree;
>       int ret;
>  
>       ldb = ldb_module_get_ctx(module);
>  
> +     nodeleted_tree = ldb_parse_tree(module, 
> "(&(replace=me)(!(isDeleted=TRUE)))");
> +     if (!nodeleted_tree) {
> +             ldb_debug(ldb, LDB_DEBUG_ERROR,
> +                     "show_deleted: Unable to parse isDeleted master 
> expression!\n");
> +             return LDB_ERR_OPERATIONS_ERROR;
> +     }
> +
> +     ldb_module_set_private(module, nodeleted_tree);

Why do we need to keep that as a "global" variable?
That doesn't play nicely together with multiple async searches.
I'd prefer to let each search request build its own parse tree.

metze


Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to