2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4 * Copyright 1999-2003 The OpenLDAP Foundation.
5 * Portions Copyright 2003 IBM Corporation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
12 * A copy of this license is available in the file LICENSE in the
13 * top-level directory of the distribution or, alternatively, at
14 * <http://www.OpenLDAP.org/license.html>.
17 * This work was initially developed by the Apurva Kumar for inclusion
18 * in OpenLDAP Software.
25 #include <ac/socket.h>
26 #include <ac/string.h>
31 #include "../back-ldap/back-ldap.h"
32 #include "back-meta.h"
34 #undef ldap_debug /* silence a warning in ldap-int.h */
36 #include "../../../libraries/libldap/ldap-int.h"
50 enum type_of_result err;
57 struct berval* query_uuid,
58 struct exception* result)
60 struct query_info info;
62 Operation op_tmp = *op;
65 SlapReply sreply = {REP_RESULT};
66 slap_callback cb = { remove_func, NULL };
68 sreply.sr_entry = NULL;
69 sreply.sr_nentries = 0;
70 snprintf(filter_str, sizeof(filter_str), "(queryid=%s)",
72 filter = str2filter(filter_str);
73 info.uuid = query_uuid;
77 cb.sc_private = &info;
79 op_tmp.o_tag = LDAP_REQ_SEARCH;
80 op_tmp.o_protocol = LDAP_VERSION3;
81 op_tmp.o_callback = &cb;
82 op_tmp.o_time = slap_get_time();
83 op_tmp.o_do_not_cache = 1;
85 op_tmp.o_req_dn = op->o_bd->be_suffix[0];
86 op_tmp.o_req_ndn = op->o_bd->be_nsuffix[0];
87 op_tmp.ors_scope = LDAP_SCOPE_SUBTREE;
88 op_tmp.ors_deref = LDAP_DEREF_NEVER;
89 op_tmp.ors_slimit = 0;
90 op_tmp.ors_tlimit = 0;
91 op_tmp.ors_filter = filter;
92 op_tmp.ors_filterstr.bv_val = filter_str;
93 op_tmp.ors_filterstr.bv_len = strlen(filter_str);
94 op_tmp.ors_attrs = NULL;
95 op_tmp.ors_attrsonly = 0;
97 op->o_bd->be_search( &op_tmp, &sreply );
99 result->type = info.err;
100 result->rc = info.deleted;
111 struct query_info *info = op->o_callback->sc_private;
118 Operation op_tmp = *op;
120 SlapReply sreply = {REP_RESULT};
122 if (rs->sr_type == REP_RESULT)
125 size = get_entry_size(rs->sr_entry, 0, NULL);
127 for (attr = rs->sr_entry->e_attrs; attr!= NULL; attr = attr->a_next) {
128 if (attr->a_desc == slap_schema.si_ad_queryid) {
129 for (count=0; attr->a_vals[count].bv_val; count++)
136 info->err = REMOVE_ERR;
142 LDAP_LOG( BACK_META, DETAIL1,
143 "DELETING ENTRY SIZE=%d TEMPLATE=%s\n",
144 size, attr->a_vals[0].bv_val, 0 );
146 Debug( LDAP_DEBUG_ANY, "DELETING ENTRY SIZE=%d TEMPLATE=%s\n",
147 size, attr->a_vals[0].bv_val, 0 );
150 op_tmp.o_req_dn = rs->sr_entry->e_name;
151 op_tmp.o_req_ndn = rs->sr_entry->e_nname;
153 if (op->o_bd->be_delete(&op_tmp, rs)) {
154 info->err = REMOVE_ERR;
161 mod = (Modifications*)malloc(sizeof(Modifications));
162 mod->sml_op = LDAP_MOD_DELETE;
163 mod->sml_type.bv_len = sizeof("queryid");
164 mod->sml_type.bv_val = "queryid";
165 mod->sml_desc = slap_schema.si_ad_queryid;
166 mod->sml_bvalues = (struct berval*) malloc( 2 * sizeof( struct berval) );
167 ber_dupbv(mod->sml_bvalues, info->uuid);
168 mod->sml_bvalues[1].bv_val = NULL;
169 mod->sml_bvalues[1].bv_len = 0;
170 mod->sml_next = NULL;
172 LDAP_LOG( BACK_META, DETAIL1,
173 "REMOVING TEMP ATTR : TEMPLATE=%s\n",
174 attr->a_vals[0].bv_val, 0, 0 );
176 Debug( LDAP_DEBUG_ANY, "REMOVING TEMP ATTR : TEMPLATE=%s\n",
177 attr->a_vals[0].bv_val, 0, 0 );
180 op_tmp.o_req_dn = rs->sr_entry->e_name;
181 op_tmp.o_req_ndn = rs->sr_entry->e_nname;
182 op_tmp.orm_modlist = mod;
184 if (op->o_bd->be_modify( &op_tmp, &sreply )) {
185 info->err = REMOVE_ERR;
188 info->freed += LDIF_SIZE_NEEDED(9, (strlen(info->uuid->bv_val)));