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
11 #include <ac/string.h>
25 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
26 DB *db = bdb->bi_dn2id->bdi_db;
28 Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_add( \"%s\", %ld )\n", dn, id, 0 );
32 key.size = strlen( dn ) + 2;
33 key.data = ch_malloc( key.size );
34 ((char *)key.data)[0] = DN_BASE_PREFIX;
35 AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
38 data.data = (char *) &id;
39 data.size = sizeof( id );
41 /* store it -- don't override */
42 rc = db->put( db, txn, &key, &data, DB_NOOVERWRITE );
48 char *pdn = dn_parent( NULL, dn );
49 ((char *)(key.data))[0] = DN_ONE_PREFIX;
52 key.size = strlen( pdn ) + 2;
53 AC_MEMCPY( &((char*)key.data)[1],
56 rc = bdb_idl_insert_key( be, db, txn, &key, id );
66 char **subtree = dn_subtree( NULL, dn );
68 if( subtree != NULL ) {
70 ((char *)key.data)[0] = DN_SUBTREE_PREFIX;
71 for( i=0; subtree[i] != NULL; i++ ) {
72 key.size = strlen( subtree[i] ) + 2;
73 AC_MEMCPY( &((char *)key.data)[1],
74 subtree[i], key.size - 1 );
76 rc = bdb_idl_insert_key( be, db, txn, &key, id );
83 charray_free( subtree );
89 Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_add %d\n", rc, 0, 0 );
102 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
103 DB *db = bdb->bi_dn2id->bdi_db;
105 Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_delete( \"%s\", %ld )\n", dn, id, 0 );
108 key.size = strlen( dn ) + 2;
109 key.data = ch_malloc( key.size );
110 ((char *)key.data)[0] = DN_BASE_PREFIX;
111 AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
113 /* store it -- don't override */
114 rc = db->del( db, txn, &key, 0 );
120 char *pdn = dn_parent( NULL, dn );
121 ((char *)(key.data))[0] = DN_ONE_PREFIX;
124 key.size = strlen( pdn ) + 2;
125 AC_MEMCPY( &((char*)key.data)[1],
128 rc = bdb_idl_delete_key( be, db, txn, &key, id );
138 char **subtree = dn_subtree( NULL, dn );
140 if( subtree != NULL ) {
142 ((char *)key.data)[0] = DN_SUBTREE_PREFIX;
143 for( i=0; subtree[i] != NULL; i++ ) {
144 key.size = strlen( subtree[i] ) + 2;
145 AC_MEMCPY( &((char *)key.data)[1],
146 subtree[i], key.size - 1 );
148 rc = bdb_idl_delete_key( be, db, txn, &key, id );
155 charray_free( subtree );
161 Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_delete %d\n", rc, 0, 0 );
174 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
175 DB *db = bdb->bi_dn2id->bdi_db;
177 Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id( \"%s\" )\n", dn, 0, 0 );
180 key.size = strlen( dn ) + 2;
181 key.data = ch_malloc( key.size );
182 ((char *)key.data)[0] = DN_BASE_PREFIX;
183 AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
188 data.ulen = sizeof(ID);
189 data.flags = DB_DBT_USERMEM;
192 rc = db->get( db, txn, &key, &data, 0 );
194 Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id: id=%ld: %s (%d)\n",
195 id, db_strerror( rc ), rc );
211 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
212 DB *db = bdb->bi_dn2id->bdi_db;
216 Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_matched( \"%s\" )\n", dn, 0, 0 );
219 key.size = strlen( dn ) + 2;
220 key.data = ch_malloc( key.size );
221 ((char *)key.data)[0] = DN_BASE_PREFIX;
226 data.ulen = sizeof(ID);
227 data.flags = DB_DBT_USERMEM;
232 AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
235 rc = db->get( db, txn, &key, &data, 0 );
237 if( rc == DB_NOTFOUND ) {
238 char *pdn = dn_parent( be, dn );
242 if( pdn == NULL || *pdn == '\0' ) {
249 key.size = strlen( dn ) + 2;
251 } else if ( rc == 0 ) {
253 *matchedDN = (char *) dn;
255 Debug( LDAP_DEBUG_TRACE,
256 "<= bdb_dn2id_matched: id=%ld: %s\n",
278 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
279 DB *db = bdb->bi_dn2id->bdi_db;
282 Debug( LDAP_DEBUG_TRACE, "=> bdb_dn2id_children( %s )\n",
286 key.size = strlen( dn ) + 2;
287 key.data = ch_malloc( key.size );
288 ((char *)key.data)[0] = DN_ONE_PREFIX;
289 AC_MEMCPY( &((char *)key.data)[1], dn, key.size - 1 );
291 /* we actually could do a empty get... */
294 data.ulen = sizeof(id);
295 data.flags = DB_DBT_USERMEM;
297 data.dlen = sizeof(id);
299 rc = db->get( db, txn, &key, &data, 0 );
301 Debug( LDAP_DEBUG_TRACE, "<= bdb_dn2id_children( %s ): %s (%d)\n",
303 rc == 0 ? "yes" : ( rc == DB_NOTFOUND ? "no" :
304 db_strerror(rc) ), rc );