xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/back-wt/id2entry.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1 /*	$NetBSD: id2entry.c,v 1.2 2021/08/14 16:15:02 christos Exp $	*/
2 
3 /* OpenLDAP WiredTiger backend */
4 /* $OpenLDAP$ */
5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6  *
7  * Copyright 2002-2021 The OpenLDAP Foundation.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted only as authorized by the OpenLDAP
12  * Public License.
13  *
14  * A copy of this license is available in the file LICENSE in the
15  * top-level directory of the distribution or, alternatively, at
16  * <http://www.OpenLDAP.org/license.html>.
17  */
18 /* ACKNOWLEDGEMENTS:
19  * This work was developed by HAMANO Tsukasa <hamano@osstech.co.jp>
20  * based on back-bdb for inclusion in OpenLDAP Software.
21  * WiredTiger is a product of MongoDB Inc.
22  */
23 
24 #include "back-wt.h"
25 #include "slap-config.h"
26 
wt_id2entry_put(Operation * op,WT_SESSION * session,Entry * e,const char * config)27 static int wt_id2entry_put(
28 	Operation *op,
29 	WT_SESSION *session,
30 	Entry *e,
31 	const char *config )
32 {
33 	struct berval bv;
34 	WT_CURSOR *cursor = NULL;
35 	WT_ITEM item;
36 	int rc;
37 
38 	rc = entry_encode( e, &bv );
39 	if(rc != LDAP_SUCCESS){
40 		return -1;
41 	}
42 	item.size = bv.bv_len;
43 	item.data = bv.bv_val;
44 
45 	rc = session->open_cursor(session, WT_TABLE_ID2ENTRY, NULL,
46 							  config, &cursor);
47 	if ( rc ) {
48 		Debug( LDAP_DEBUG_ANY,
49 			   LDAP_XSTRING(wt_id2entry_put)
50 			   ": open_cursor failed: %s (%d)\n",
51 			   wiredtiger_strerror(rc), rc );
52 		goto done;
53 	}
54 	cursor->set_key(cursor, e->e_id);
55 	cursor->set_value(cursor, e->e_ndn, &item);
56 	rc = cursor->insert(cursor);
57 	if ( rc ) {
58 		Debug( LDAP_DEBUG_ANY,
59 			   LDAP_XSTRING(wt_id2entry_put)
60 			   ": insert failed: %s (%d)\n",
61 			   wiredtiger_strerror(rc), rc );
62 		goto done;
63 	}
64 
65 done:
66 	ch_free( bv.bv_val );
67 	if(cursor){
68 		cursor->close(cursor);
69 	}
70 	return rc;
71 }
72 
wt_id2entry_add(Operation * op,WT_SESSION * session,Entry * e)73 int wt_id2entry_add(
74 	Operation *op,
75 	WT_SESSION *session,
76 	Entry *e )
77 {
78 	return wt_id2entry_put(op, session, e, "overwrite=false");
79 }
80 
wt_id2entry_update(Operation * op,WT_SESSION * session,Entry * e)81 int wt_id2entry_update(
82 	Operation *op,
83 	WT_SESSION *session,
84 	Entry *e )
85 {
86 	return wt_id2entry_put(op, session, e, "overwrite=true");
87 }
88 
wt_id2entry_delete(Operation * op,WT_SESSION * session,Entry * e)89 int wt_id2entry_delete(
90 	Operation *op,
91 	WT_SESSION *session,
92 	Entry *e )
93 {
94 	int rc;
95 	WT_CURSOR *cursor = NULL;
96 	rc = session->open_cursor(session, WT_TABLE_ID2ENTRY, NULL,
97 							  NULL, &cursor);
98 	if ( rc ) {
99 		Debug( LDAP_DEBUG_ANY,
100 			   LDAP_XSTRING(wt_id2entry_delete)
101 			   ": open_cursor failed: %s (%d)\n",
102 			   wiredtiger_strerror(rc), rc );
103 		goto done;
104 	}
105 	cursor->set_key(cursor, e->e_id);
106 	rc = cursor->remove(cursor);
107 	if ( rc ) {
108 		Debug( LDAP_DEBUG_ANY,
109 			   LDAP_XSTRING(wt_id2entry_delete)
110 			   ": remove failed: %s (%d)\n",
111 			   wiredtiger_strerror(rc), rc );
112 		goto done;
113 	}
114 
115 done:
116 	if(cursor){
117 		cursor->close(cursor);
118 	}
119 	return rc;
120 }
121 
wt_id2entry(BackendDB * be,WT_SESSION * session,ID id,Entry ** ep)122 int wt_id2entry( BackendDB *be,
123 				 WT_SESSION *session,
124 				 ID id,
125 				 Entry **ep ){
126 	int rc;
127 	WT_CURSOR *cursor = NULL;
128 	WT_ITEM item;
129 	EntryHeader eh;
130 	int eoff;
131 	Entry *e = NULL;
132 
133 	rc = session->open_cursor(session, WT_TABLE_ID2ENTRY"(entry)", NULL,
134 							  NULL, &cursor);
135 	if ( rc ) {
136 		Debug( LDAP_DEBUG_ANY,
137 			   LDAP_XSTRING(wt_id2entry)
138 			   ": open_cursor failed: %s (%d)\n",
139 			   wiredtiger_strerror(rc), rc );
140 		goto done;
141 	}
142 
143 	cursor->set_key(cursor, id);
144 	rc = cursor->search(cursor);
145 	if ( rc ) {
146 		goto done;
147 	}
148 
149 	cursor->get_value(cursor, &item);
150 	rc = wt_entry_header( &item,  &eh );
151 	eoff = eh.data - (char *)item.data;
152 	eh.bv.bv_len = eh.nvals * sizeof( struct berval ) + item.size;
153 	eh.bv.bv_val = ch_malloc( eh.bv.bv_len );
154 	memset(eh.bv.bv_val, 0xff, eh.bv.bv_len);
155 	eh.data = eh.bv.bv_val + eh.nvals * sizeof( struct berval );
156 	memcpy(eh.data, item.data, item.size);
157 	eh.data += eoff;
158 	rc = entry_decode( &eh, &e );
159 	if ( rc ) {
160 		Debug( LDAP_DEBUG_ANY,
161 			   LDAP_XSTRING(wt_id2entry)
162 			   ": entry decode error: %d\n",
163 			   rc );
164 		goto done;
165 	}
166 	e->e_id = id;
167 	*ep = e;
168 
169 done:
170 	if(cursor){
171 		cursor->close(cursor);
172 	}
173 	return rc;
174 }
175 
wt_entry_return(Entry * e)176 int wt_entry_return(
177 	Entry *e
178 	)
179 {
180 	if ( !e ) {
181 		return 0;
182 	}
183 
184     /* Our entries are allocated in two blocks; the data comes from
185 	 * the db itself and the Entry structure and associated pointers
186 	 * are allocated in entry_decode. The db data pointer is saved
187 	 * in e_bv.
188 	 */
189 	if ( e->e_bv.bv_val ) {
190 #if 0
191 		/* See if the DNs were changed by modrdn */
192 		if( e->e_nname.bv_val < e->e_bv.bv_val || e->e_nname.bv_val >
193 			e->e_bv.bv_val + e->e_bv.bv_len ) {
194 			ch_free(e->e_name.bv_val);
195 			ch_free(e->e_nname.bv_val);
196 		}
197 #endif
198 		e->e_name.bv_val = NULL;
199 		e->e_nname.bv_val = NULL;
200 		/* In tool mode the e_bv buffer is realloc'd, leave it alone */
201 		if( !(slapMode & SLAP_TOOL_MODE) ) {
202 			free( e->e_bv.bv_val );
203 		}
204 		BER_BVZERO( &e->e_bv );
205 	}
206 
207 	entry_free( e );
208 }
209 
wt_entry_release(Operation * op,Entry * e,int rw)210 int wt_entry_release(
211 	Operation *op,
212 	Entry *e,
213 	int rw )
214 {
215 	struct wt_info *wi = (struct wt_info *) op->o_bd->be_private;
216 	return wt_entry_return( e );
217 }
218 
219 /*
220  * return LDAP_SUCCESS IFF we can retrieve the specified entry.
221  */
wt_entry_get(Operation * op,struct berval * ndn,ObjectClass * oc,AttributeDescription * at,int rw,Entry ** ent)222 int wt_entry_get(
223 	Operation *op,
224 	struct berval *ndn,
225 	ObjectClass *oc,
226 	AttributeDescription *at,
227 	int rw,
228 	Entry **ent )
229 {
230 	return 0;
231 }
232 
233 /*
234  * Local variables:
235  * indent-tabs-mode: t
236  * tab-width: 4
237  * c-basic-offset: 4
238  * End:
239  */
240