1 /* dn2id.c - routines to deal with the dn2id index */
4 * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
12 #include <ac/string.h>
13 #include <ac/socket.h>
16 #include "back-ldbm.h"
17 #include "proto-back-ldbm.h"
29 struct ldbminfo *li = (struct ldbminfo *) be->be_private;
31 Debug( LDAP_DEBUG_TRACE, "=> dn2id_add( \"%s\", %ld )\n", dn, id, 0 );
34 if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
36 Debug( LDAP_DEBUG_ANY, "Could not open/create dn2id%s\n",
41 ldbm_datum_init( key );
42 key.dsize = strlen( dn ) + 2;
43 key.dptr = ch_malloc( key.dsize );
44 sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
46 ldbm_datum_init( data );
47 data.dptr = (char *) &id;
48 data.dsize = sizeof(ID);
51 if ( li->li_dbcachewsync ) flags |= LDBM_SYNC;
53 rc = ldbm_cache_store( db, key, data, flags );
58 char *pdn = dn_parent( NULL, dn );
61 ldbm_datum_init( key );
62 key.dsize = strlen( pdn ) + 2;
63 key.dptr = ch_malloc( key.dsize );
64 sprintf( key.dptr, "%c%s", DN_ONE_PREFIX, pdn );
65 rc = idl_insert_key( be, db, key, id );
72 char **subtree = dn_subtree( NULL, dn );
74 if( subtree != NULL ) {
76 for( i=0; subtree[i] != NULL; i++ ) {
77 ldbm_datum_init( key );
78 key.dsize = strlen( subtree[i] ) + 2;
79 key.dptr = ch_malloc( key.dsize );
80 sprintf( key.dptr, "%c%s",
81 DN_SUBTREE_PREFIX, subtree[i] );
83 rc = idl_insert_key( be, db, key, id );
90 charray_free( subtree );
94 ldbm_cache_close( be, db );
96 Debug( LDAP_DEBUG_TRACE, "<= dn2id_add %d\n", rc, 0, 0 );
106 struct ldbminfo *li = (struct ldbminfo *) be->be_private;
111 Debug( LDAP_DEBUG_TRACE, "=> dn2id( \"%s\" )\n", dn, 0, 0 );
113 /* first check the cache */
114 if ( (id = cache_find_entry_dn2id( be, &li->li_cache, dn )) != NOID ) {
115 Debug( LDAP_DEBUG_TRACE, "<= dn2id %ld (in cache)\n", id,
120 if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
122 Debug( LDAP_DEBUG_ANY, "<= dn2id could not open dn2id%s\n",
127 ldbm_datum_init( key );
129 key.dsize = strlen( dn ) + 2;
130 key.dptr = ch_malloc( key.dsize );
131 sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
133 data = ldbm_cache_fetch( db, key );
135 ldbm_cache_close( be, db );
139 if ( data.dptr == NULL ) {
140 Debug( LDAP_DEBUG_TRACE, "<= dn2id NOID\n", 0, 0, 0 );
144 (void) memcpy( (char *) &id, data.dptr, sizeof(ID) );
146 assert( id != NOID );
148 ldbm_datum_free( db->dbc_db, data );
150 Debug( LDAP_DEBUG_TRACE, "<= dn2id %ld\n", id, 0, 0 );
165 Debug( LDAP_DEBUG_TRACE, "=> dn2idl( \"%c%s\" )\n", prefix, dn, 0 );
167 if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
169 Debug( LDAP_DEBUG_ANY, "<= dn2idl could not open dn2id%s\n",
174 ldbm_datum_init( key );
176 key.dsize = strlen( dn ) + 2;
177 key.dptr = ch_malloc( key.dsize );
178 sprintf( key.dptr, "%c%s", prefix, dn );
180 idl = idl_fetch( be, db, key );
182 ldbm_cache_close( be, db );
201 Debug( LDAP_DEBUG_TRACE, "=> dn2id_delete( \"%s\", %ld )\n", dn, id, 0 );
203 assert( id != NOID );
205 if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
207 Debug( LDAP_DEBUG_ANY,
208 "<= dn2id_delete could not open dn2id%s\n", LDBM_SUFFIX,
215 char *pdn = dn_parent( NULL, dn );
218 ldbm_datum_init( key );
219 key.dsize = strlen( pdn ) + 2;
220 key.dptr = ch_malloc( key.dsize );
221 sprintf( key.dptr, "%c%s", DN_ONE_PREFIX, pdn );
223 (void) idl_delete_key( be, db, key, id );
231 char **subtree = dn_subtree( NULL, dn );
233 if( subtree != NULL ) {
235 for( i=0; subtree[i] != NULL; i++ ) {
236 ldbm_datum_init( key );
237 key.dsize = strlen( subtree[i] ) + 2;
238 key.dptr = ch_malloc( key.dsize );
239 sprintf( key.dptr, "%c%s",
240 DN_SUBTREE_PREFIX, subtree[i] );
242 (void) idl_delete_key( be, db, key, id );
247 charray_free( subtree );
251 ldbm_datum_init( key );
253 key.dsize = strlen( dn ) + 2;
254 key.dptr = ch_malloc( key.dsize );
255 sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
257 rc = ldbm_cache_delete( db, key );
261 ldbm_cache_close( be, db );
263 Debug( LDAP_DEBUG_TRACE, "<= dn2id_delete %d\n", rc, 0, 0 );
268 * dn2entry - look up dn in the cache/indexes and return the corresponding
284 Debug(LDAP_DEBUG_TRACE, "dn2entry_%s: dn: \"%s\"\n",
285 rw ? "w" : "r", dn, 0);
287 if( matched != NULL ) {
288 /* caller cares about match */
292 if ( (id = dn2id( be, dn )) != NOID &&
293 (e = id2entry_rw( be, id, rw )) != NULL )
299 Debug(LDAP_DEBUG_ANY,
300 "dn2entry_%s: no entry for valid id (%ld), dn \"%s\"\n",
301 rw ? "w" : "r", id, dn);
302 /* must have been deleted from underneath us */
303 /* treat as if NOID was found */
306 /* caller doesn't care about match */
307 if( matched == NULL ) return NULL;
309 /* entry does not exist - see how much of the dn does exist */
310 /* dn_parent checks returns NULL if dn is suffix */
311 if ( (pdn = dn_parent( be, dn )) != NULL ) {
312 /* get entry with reader lock */
313 if ( (e = dn2entry_r( be, pdn, matched )) != NULL ) {