1 /* dn2id.c - routines to deal with the dn2id index */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
12 #include <ac/string.h>
13 #include <ac/socket.h>
27 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
28 DB *db = bdb->bi_dn2id->bdi_db;
30 Debug( LDAP_DEBUG_TRACE, "=> bdb_index_dn_add( \"%s\", %ld )\n", dn, id, 0 );
34 key.size = strlen( dn ) + 2;
35 key.data = ch_malloc( key.size );
36 ((char *)key.data)[0] = DN_BASE_PREFIX;
37 AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
40 data.data = (char *) &id;
41 data.size = sizeof( id );
43 /* store it -- don't override */
44 rc = db->put( db, txn, &key, &data, DB_NOOVERWRITE );
50 char *pdn = dn_parent( NULL, dn );
51 ((char *)(key.data))[0] = DN_ONE_PREFIX;
54 key.size = strlen( pdn ) + 2;
55 AC_MEMCPY( &((char*)key.data)[1],
58 rc = bdb_idl_insert_key( be, db, txn, &key, id );
68 char **subtree = dn_subtree( NULL, dn );
70 if( subtree != NULL ) {
72 ((char *)key.data)[0] = DN_SUBTREE_PREFIX;
73 for( i=0; subtree[i] != NULL; i++ ) {
74 key.size = strlen( subtree[i] ) + 2;
75 AC_MEMCPY( &((char *)key.data)[1],
76 subtree[i], key.size - 1 );
78 rc = bdb_idl_insert_key( be, db, txn, &key, id );
85 charray_free( subtree );
91 Debug( LDAP_DEBUG_TRACE, "<= bdb_index_dn_add %d\n", rc, 0, 0 );
102 struct ldbminfo *li = (struct ldbminfo *) be->be_private;
107 Debug( LDAP_DEBUG_TRACE, "=> dn2id( \"%s\" )\n", dn, 0, 0 );
109 /* first check the cache */
110 if ( (id = cache_find_entry_dn2id( be, &li->li_cache, dn )) != NOID ) {
111 Debug( LDAP_DEBUG_TRACE, "<= dn2id %ld (in cache)\n", id,
116 if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
118 Debug( LDAP_DEBUG_ANY, "<= dn2id could not open dn2id%s\n",
123 ldbm_datum_init( key );
125 key.dsize = strlen( dn ) + 2;
126 key.dptr = ch_malloc( key.dsize );
127 sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
129 data = ldbm_cache_fetch( db, key );
131 ldbm_cache_close( be, db );
135 if ( data.dptr == NULL ) {
136 Debug( LDAP_DEBUG_TRACE, "<= dn2id NOID\n", 0, 0, 0 );
140 AC_MEMCPY( (char *) &id, data.dptr, sizeof(ID) );
142 assert( id != NOID );
144 ldbm_datum_free( db->dbc_db, data );
146 Debug( LDAP_DEBUG_TRACE, "<= dn2id %ld\n", id, 0, 0 );
161 Debug( LDAP_DEBUG_TRACE, "=> dn2idl( \"%c%s\" )\n", prefix, dn, 0 );
163 if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
165 Debug( LDAP_DEBUG_ANY, "<= dn2idl could not open dn2id%s\n",
170 ldbm_datum_init( key );
172 key.dsize = strlen( dn ) + 2;
173 key.dptr = ch_malloc( key.dsize );
174 sprintf( key.dptr, "%c%s", prefix, dn );
176 idl = idl_fetch( be, db, key );
178 ldbm_cache_close( be, db );
197 Debug( LDAP_DEBUG_TRACE, "=> dn2id_delete( \"%s\", %ld )\n", dn, id, 0 );
199 assert( id != NOID );
201 if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
203 Debug( LDAP_DEBUG_ANY,
204 "<= dn2id_delete could not open dn2id%s\n", LDBM_SUFFIX,
211 char *pdn = dn_parent( NULL, dn );
214 ldbm_datum_init( key );
215 key.dsize = strlen( pdn ) + 2;
216 key.dptr = ch_malloc( key.dsize );
217 sprintf( key.dptr, "%c%s", DN_ONE_PREFIX, pdn );
219 (void) idl_delete_key( be, db, key, id );
227 char **subtree = dn_subtree( NULL, dn );
229 if( subtree != NULL ) {
231 for( i=0; subtree[i] != NULL; i++ ) {
232 ldbm_datum_init( key );
233 key.dsize = strlen( subtree[i] ) + 2;
234 key.dptr = ch_malloc( key.dsize );
235 sprintf( key.dptr, "%c%s",
236 DN_SUBTREE_PREFIX, subtree[i] );
238 (void) idl_delete_key( be, db, key, id );
243 charray_free( subtree );
247 ldbm_datum_init( key );
249 key.dsize = strlen( dn ) + 2;
250 key.dptr = ch_malloc( key.dsize );
251 sprintf( key.dptr, "%c%s", DN_BASE_PREFIX, dn );
253 rc = ldbm_cache_delete( db, key );
257 ldbm_cache_close( be, db );
259 Debug( LDAP_DEBUG_TRACE, "<= dn2id_delete %d\n", rc, 0, 0 );
264 * dn2entry - look up dn in the cache/indexes and return the corresponding
280 Debug(LDAP_DEBUG_TRACE, "dn2entry_%s: dn: \"%s\"\n",
281 rw ? "w" : "r", dn, 0);
283 if( matched != NULL ) {
284 /* caller cares about match */
288 if ( (id = dn2id( be, dn )) != NOID &&
289 (e = id2entry_rw( be, id, rw )) != NULL )
295 Debug(LDAP_DEBUG_ANY,
296 "dn2entry_%s: no entry for valid id (%ld), dn \"%s\"\n",
297 rw ? "w" : "r", id, dn);
298 /* must have been deleted from underneath us */
299 /* treat as if NOID was found */
302 /* caller doesn't care about match */
303 if( matched == NULL ) return NULL;
305 /* entry does not exist - see how much of the dn does exist */
306 /* dn_parent checks returns NULL if dn is suffix */
307 if ( (pdn = dn_parent( be, dn )) != NULL ) {
308 /* get entry with reader lock */
309 if ( (e = dn2entry_r( be, pdn, matched )) != NULL ) {