1 /* dn2id.c - routines to deal with the dn2id index */
12 #include "back-bdb2.h"
13 #include "proto-back-bdb2.h"
25 struct ldbminfo *li = (struct ldbminfo *) be->be_private;
27 Debug( LDAP_DEBUG_TRACE, "=> bdb2i_dn2id_add( \"%s\", %ld )\n", dn, id, 0 );
29 if ( (db = bdb2i_cache_open( be, "dn2id", BDB2_SUFFIX, LDBM_WRCREAT ))
31 Debug( LDAP_DEBUG_ANY, "Could not open/create dn2id%s\n",
36 ldbm_datum_init( key );
37 key.dsize = strlen( dn ) + 2;
38 key.dptr = ch_malloc( key.dsize );
39 sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
41 ldbm_datum_init( data );
42 data.dptr = (char *) &id;
43 data.dsize = sizeof(ID);
46 if ( li->li_dbcachewsync ) flags |= LDBM_SYNC;
48 rc = bdb2i_cache_store( db, key, data, flags );
53 char *pdn = dn_parent( NULL, dn );
56 ldbm_datum_init( key );
57 key.dsize = strlen( pdn ) + 2;
58 key.dptr = ch_malloc( key.dsize );
59 sprintf( key.dptr, "%c%s", DN_ONE_PREFIX, pdn );
60 rc = bdb2i_idl_insert_key( be, db, key, id );
67 char **subtree = dn_subtree( NULL, dn );
69 if( subtree != NULL ) {
71 for( i=0; subtree[i] != NULL; i++ ) {
72 ldbm_datum_init( key );
73 key.dsize = strlen( subtree[i] ) + 2;
74 key.dptr = ch_malloc( key.dsize );
75 sprintf( key.dptr, "%c%s", DN_SUBTREE_PREFIX, subtree[i] );
77 rc = bdb2i_idl_insert_key( be, db, key, id );
82 charray_free( subtree );
86 bdb2i_cache_close( be, db );
88 Debug( LDAP_DEBUG_TRACE, "<= bdb2i_dn2id_add %d\n", rc, 0, 0 );
98 struct ldbminfo *li = (struct ldbminfo *) be->be_private;
103 Debug( LDAP_DEBUG_TRACE, "=> bdb2i_dn2id( \"%s\" )\n", dn, 0, 0 );
105 /* first check the cache */
106 if ( (id = bdb2i_cache_find_entry_dn2id( be, &li->li_cache, dn )) != NOID ) {
107 Debug( LDAP_DEBUG_TRACE, "<= bdb2i_dn2id %ld (in cache)\n", id,
112 if ( (db = bdb2i_cache_open( be, "dn2id", BDB2_SUFFIX, LDBM_WRCREAT ))
114 Debug( LDAP_DEBUG_ANY, "<= bdb2i_dn2id could not open dn2id%s\n",
119 ldbm_datum_init( key );
121 key.dsize = strlen( dn ) + 2;
122 key.dptr = ch_malloc( key.dsize );
123 sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
125 data = bdb2i_cache_fetch( db, key );
127 bdb2i_cache_close( be, db );
131 if ( data.dptr == NULL ) {
132 Debug( LDAP_DEBUG_TRACE, "<= bdb2i_dn2id NOID\n", 0, 0, 0 );
136 (void) memcpy( (char *) &id, data.dptr, sizeof(ID) );
138 ldbm_datum_free( db->dbc_db, data );
140 Debug( LDAP_DEBUG_TRACE, "<= bdb2i_dn2id %ld\n", id, 0, 0 );
154 Debug( LDAP_DEBUG_TRACE, "=> bdb2i_dn2idl( \"%c%s\" )\n", prefix, dn, 0 );
156 if ( (db = bdb2i_cache_open( be, "dn2id", BDB2_SUFFIX, LDBM_WRCREAT ))
158 Debug( LDAP_DEBUG_ANY,
159 "<= bdb2i_dn2idl could not open dn2id%s\n", BDB2_SUFFIX,
164 ldbm_datum_init( key );
166 key.dsize = strlen( dn ) + 2;
167 key.dptr = ch_malloc( key.dsize );
168 sprintf( key.dptr, "%c%s", prefix, dn );
170 idl = bdb2i_idl_fetch( be, db, key );
174 bdb2i_cache_close( be, db );
190 Debug( LDAP_DEBUG_TRACE, "=> bdb2i_dn2id_delete( \"%s\", %ld )\n",
193 if ( (db = bdb2i_cache_open( be, "dn2id", BDB2_SUFFIX, LDBM_WRCREAT ))
195 Debug( LDAP_DEBUG_ANY,
196 "<= bdb2i_dn2id_delete could not open dn2id%s\n", BDB2_SUFFIX,
202 char *pdn = dn_parent( NULL, dn );
205 ldbm_datum_init( key );
206 key.dsize = strlen( pdn ) + 2;
207 key.dptr = ch_malloc( key.dsize );
208 sprintf( key.dptr, "%c%s", DN_ONE_PREFIX, pdn );
209 (void) bdb2i_idl_delete_key( be, db, key, id );
216 char **subtree = dn_subtree( NULL, dn );
218 if( subtree != NULL ) {
220 for( i=0; subtree[i] != NULL; i++ ) {
221 ldbm_datum_init( key );
222 key.dsize = strlen( subtree[i] ) + 2;
223 key.dptr = ch_malloc( key.dsize );
224 sprintf( key.dptr, "%c%s", DN_SUBTREE_PREFIX, subtree[i] );
226 (void) bdb2i_idl_delete_key( be, db, key, id );
231 charray_free( subtree );
235 ldbm_datum_init( key );
237 key.dsize = strlen( dn ) + 2;
238 key.dptr = ch_malloc( key.dsize );
239 sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
241 rc = bdb2i_cache_delete( db, key );
245 bdb2i_cache_close( be, db );
247 Debug( LDAP_DEBUG_TRACE, "<= bdb2i_dn2id_delete %d\n", rc, 0, 0 );
252 * dn2entry - look up dn in the cache/indexes and return the corresponding
264 struct ldbminfo *li = (struct ldbminfo *) be->be_private;
269 Debug(LDAP_DEBUG_TRACE, "dn2entry_%s: dn: \"%s\"\n",
270 rw ? "w" : "r", dn, 0);
272 if( matched != NULL ) {
273 /* caller cares about match */
277 if ( (id = bdb2i_dn2id( be, dn )) != NOID &&
278 (e = bdb2i_id2entry_rw( be, id, rw )) != NULL )
284 Debug(LDAP_DEBUG_ANY,
285 "dn2entry_%s: no entry for valid id (%ld), dn \"%s\"\n",
286 rw ? "w" : "r", id, dn);
287 /* must have been deleted from underneath us */
288 /* treat as if NOID was found */
291 /* caller doesn't care about match */
292 if( matched == NULL ) return NULL;
294 /* entry does not exist - see how much of the dn does exist */
295 /* dn_parent checks returns NULL if dn is suffix */
296 if ( (pdn = dn_parent( be, dn )) != NULL ) {
297 /* get entry with reader lock */
298 if ( (e = bdb2i_dn2entry_r( be, pdn, matched )) != NULL ) {