]> git.sur5r.net Git - openldap/blob - servers/slapd/back-meta/cache-remove.c
Proxy caching update : op->o_caching_on flag removed
[openldap] / servers / slapd / back-meta / cache-remove.c
1 /* Copyright (c) 2003 by International Business Machines, Inc.
2  *
3  * International Business Machines, Inc. (hereinafter called IBM) grants
4  * permission under its copyrights to use, copy, modify, and distribute this
5  * Software with or without fee, provided that the above copyright notice and
6  * all paragraphs of this notice appear in all copies, and that the name of IBM
7  * not be used in connection with the marketing of any product incorporating
8  * the Software or modifications thereof, without specific, written prior
9  * permission.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS", AND IBM DISCLAIMS ALL WARRANTIES,
12  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
13  * PARTICULAR PURPOSE.  IN NO EVENT SHALL IBM BE LIABLE FOR ANY SPECIAL,
14  * DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER ARISING
15  * OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE, EVEN
16  * IF IBM IS APPRISED OF THE POSSIBILITY OF SUCH DAMAGES.
17  */
18
19 #include "portable.h"
20
21 #include <stdio.h>
22
23 #include <ac/socket.h>
24 #include <ac/string.h>
25 #include <ac/time.h>
26
27 #include "slap.h"
28 #include "ldif.h"
29 #include "../back-ldap/back-ldap.h"
30 #include "back-meta.h"
31 #include "ldap_pvt.h"
32 #undef ldap_debug       /* silence a warning in ldap-int.h */
33 #include "ldap_log.h"
34 #include "../../../libraries/libldap/ldap-int.h"
35 #include <sys/time.h>
36
37 #ifdef LDAP_CACHING 
38 static int
39 remove_func (
40         Operation       *op,
41         SlapReply       *rs
42 );
43  
44 struct query_info {
45         int                     freed; 
46         int                     deleted; 
47         struct berval*          uuid; 
48         struct timeval          tv; 
49         enum type_of_result     err; 
50 }; 
51    
52 int 
53 remove_query_data (
54         Operation       *op,
55         SlapReply       *rs,
56         struct berval* query_uuid, 
57         struct exception* result)
58 {
59         struct query_info       info; 
60         char                    filter_str[64]; 
61         Operation               op_tmp = *op;
62         Filter                  *filter; 
63         long timediff;
64         SlapReply               sreply = {REP_RESULT}; 
65         slap_callback cb = { remove_func, NULL }; 
66
67         sreply.sr_entry = NULL; 
68         sreply.sr_nentries = 0; 
69         snprintf(filter_str, sizeof(filter_str), "(queryid=%s)",
70                         query_uuid->bv_val);
71         filter = str2filter(filter_str);              
72         info.uuid = query_uuid; 
73         info.freed = 0; 
74         info.deleted = 0; 
75         info.err = SUCCESS; 
76         cb.sc_private = &info; 
77  
78         op_tmp.o_tag = LDAP_REQ_SEARCH;
79         op_tmp.o_protocol = LDAP_VERSION3;
80         op_tmp.o_callback = &cb;
81         op_tmp.o_time = slap_get_time();
82         op_tmp.o_do_not_cache = 1;
83
84         op_tmp.o_req_dn = op->o_bd->be_suffix[0];
85         op_tmp.o_req_ndn = op->o_bd->be_nsuffix[0];
86         op_tmp.ors_scope = LDAP_SCOPE_SUBTREE;
87         op_tmp.ors_deref = LDAP_DEREF_NEVER;
88         op_tmp.ors_slimit = 0;
89         op_tmp.ors_tlimit = 0;
90         op_tmp.ors_filter = filter;
91         op_tmp.ors_filterstr.bv_val = filter_str;
92         op_tmp.ors_filterstr.bv_len = strlen(filter_str);
93         op_tmp.ors_attrs = NULL;
94         op_tmp.ors_attrsonly = 0;
95
96         op->o_bd->be_search( &op_tmp, &sreply );
97
98         result->type = info.err;  
99         result->rc = info.deleted; 
100
101         return info.freed;  
102 }
103
104 static int
105 remove_func (
106         Operation       *op,
107         SlapReply       *rs
108 )
109 {
110         struct query_info       *info = op->o_callback->sc_private;
111         int                     count = 0;
112         int                     size;
113         long                    timediff;
114         Modifications           *mod;
115
116         Attribute               *attr;
117         Operation               op_tmp = *op;
118
119         SlapReply               sreply = {REP_RESULT}; 
120
121         if (rs->sr_type == REP_RESULT) 
122                 return 0; 
123
124         size = get_entry_size(rs->sr_entry, 0, NULL);
125
126         for (attr = rs->sr_entry->e_attrs; attr!= NULL; attr = attr->a_next) {
127                 if (attr->a_desc == slap_schema.si_ad_queryid) {
128                         for (count=0; attr->a_vals[count].bv_val; count++) 
129                                 ;
130                         break; 
131                 }
132         }       
133
134         if (count == 0) {
135                 info->err = REMOVE_ERR; 
136                 return 0; 
137         }
138         if (count == 1) {
139                 info->freed += size; 
140 #ifdef NEW_LOGGING
141                 LDAP_LOG( BACK_META, DETAIL1,
142                                 "DELETING ENTRY SIZE=%d TEMPLATE=%s\n",
143                                 size, attr->a_vals[0].bv_val, 0 );
144 #else
145                 Debug( LDAP_DEBUG_ANY, "DELETING ENTRY SIZE=%d TEMPLATE=%s\n",
146                                 size, attr->a_vals[0].bv_val, 0 );
147 #endif
148
149                 op_tmp.o_req_dn = rs->sr_entry->e_name;
150                 op_tmp.o_req_ndn = rs->sr_entry->e_nname;
151
152                 if (op->o_bd->be_delete(&op_tmp, rs)) {
153                         info->err = REMOVE_ERR; 
154                 } else {
155                         info->deleted++; 
156                 }
157                 return 0; 
158         }
159
160         mod = (Modifications*)malloc(sizeof(Modifications)); 
161         mod->sml_op = LDAP_MOD_DELETE; 
162         mod->sml_type.bv_len = sizeof("queryid"); 
163         mod->sml_type.bv_val = "queryid"; 
164         mod->sml_desc = slap_schema.si_ad_queryid;   
165         mod->sml_bvalues = (struct berval*) malloc( 2 * sizeof( struct berval) );
166         ber_dupbv(mod->sml_bvalues, info->uuid); 
167         mod->sml_bvalues[1].bv_val = NULL; 
168         mod->sml_bvalues[1].bv_len = 0; 
169         mod->sml_next = NULL; 
170 #ifdef NEW_LOGGING
171         LDAP_LOG( BACK_META, DETAIL1,
172                         "REMOVING TEMP ATTR : TEMPLATE=%s\n",
173                         attr->a_vals[0].bv_val, 0, 0 );
174 #else
175         Debug( LDAP_DEBUG_ANY, "REMOVING TEMP ATTR : TEMPLATE=%s\n",
176                         attr->a_vals[0].bv_val, 0, 0 );
177 #endif
178
179         op_tmp.o_req_dn = rs->sr_entry->e_name;
180         op_tmp.o_req_ndn = rs->sr_entry->e_nname;
181         op_tmp.orm_modlist = mod;
182         
183         if (op->o_bd->be_modify( &op_tmp, &sreply )) {
184                 info->err = REMOVE_ERR;
185         }
186
187         info->freed += LDIF_SIZE_NEEDED(9, (strlen(info->uuid->bv_val))); 
188
189         return 0;
190 }
191
192 #endif /* LDAP_CACHING */