]> git.sur5r.net Git - openldap/blob - servers/slapd/back-ldbm/dn2id.c
c4116086b00d5aab3d143a14f045956a3737c51d
[openldap] / servers / slapd / back-ldbm / dn2id.c
1 /* dn2id.c - routines to deal with the dn2id index */
2
3 #include <stdio.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/socket.h>
7 #include "slap.h"
8 #include "back-ldbm.h"
9
10 extern struct dbcache   *ldbm_cache_open();
11 extern Entry            *cache_find_entry_dn();
12 extern Entry            *id2entry();
13 extern char             *dn_parent();
14 extern Datum            ldbm_cache_fetch();
15
16 int
17 dn2id_add(
18     Backend     *be,
19     char        *dn,
20     ID          id
21 )
22 {
23         int             rc;
24         struct dbcache  *db;
25         Datum           key, data;
26
27         Debug( LDAP_DEBUG_TRACE, "=> dn2id_add( \"%s\", %ld )\n", dn, id, 0 );
28
29         if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
30             == NULL ) {
31                 Debug( LDAP_DEBUG_ANY, "Could not open/create dn2id%s\n",
32                     LDBM_SUFFIX, 0, 0 );
33                 return( -1 );
34         }
35
36         dn = strdup( dn );
37         dn_normalize_case( dn );
38
39         key.dptr = dn;
40         key.dsize = strlen( dn ) + 1;
41         data.dptr = (char *) &id;
42         data.dsize = sizeof(ID);
43
44         rc = ldbm_cache_store( db, key, data, LDBM_INSERT );
45
46         free( dn );
47         ldbm_cache_close( be, db );
48
49         Debug( LDAP_DEBUG_TRACE, "<= dn2id_add %d\n", rc, 0, 0 );
50         return( rc );
51 }
52
53 ID
54 dn2id(
55     Backend     *be,
56     char        *dn
57 )
58 {
59         struct ldbminfo *li = (struct ldbminfo *) be->be_private;
60         struct dbcache  *db;
61         Entry           *e;
62         ID              id;
63         Datum           key, data;
64
65         Debug( LDAP_DEBUG_TRACE, "=> dn2id( \"%s\" )\n", dn, 0, 0 );
66
67         dn = strdup( dn );
68         dn_normalize_case( dn );
69
70         /* first check the cache */
71         if ( (e = cache_find_entry_dn( &li->li_cache, dn )) != NULL ) {
72                 id = e->e_id;
73                 free( dn );
74                 Debug( LDAP_DEBUG_TRACE, "<= dn2id %d (in cache)\n", e->e_id,
75                     0, 0 );
76                 cache_return_entry( &li->li_cache, e );
77
78                 return( id );
79         }
80
81         if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
82             == NULL ) {
83                 free( dn );
84                 Debug( LDAP_DEBUG_ANY, "<= dn2id could not open dn2id%s\n",
85                     LDBM_SUFFIX, 0, 0 );
86                 return( NOID );
87         }
88
89         key.dptr = dn;
90         key.dsize = strlen( dn ) + 1;
91
92         data = ldbm_cache_fetch( db, key );
93
94         ldbm_cache_close( be, db );
95         free( dn );
96
97         if ( data.dptr == NULL ) {
98                 Debug( LDAP_DEBUG_TRACE, "<= dn2id NOID\n", 0, 0, 0 );
99                 return( NOID );
100         }
101
102         (void) memcpy( (char *) &id, data.dptr, sizeof(ID) );
103
104         ldbm_datum_free( db->dbc_db, data );
105
106         Debug( LDAP_DEBUG_TRACE, "<= dn2id %d\n", id, 0, 0 );
107         return( id );
108 }
109
110 int
111 dn2id_delete(
112     Backend     *be,
113     char        *dn
114 )
115 {
116         struct ldbminfo *li = (struct ldbminfo *) be->be_private;
117         struct dbcache  *db;
118         Datum           key;
119         int             rc;
120
121         Debug( LDAP_DEBUG_TRACE, "=> dn2id_delete( \"%s\" )\n", dn, 0, 0 );
122
123         if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
124             == NULL ) {
125                 Debug( LDAP_DEBUG_ANY,
126                     "<= dn2id_delete could not open dn2id%s\n", LDBM_SUFFIX,
127                     0, 0 );
128                 return( -1 );
129         }
130
131         dn_normalize_case( dn );
132         key.dptr = dn;
133         key.dsize = strlen( dn ) + 1;
134
135         rc = ldbm_cache_delete( db, key );
136
137         ldbm_cache_close( be, db );
138
139         Debug( LDAP_DEBUG_TRACE, "<= dn2id_delete %d\n", rc, 0, 0 );
140         return( rc );
141 }
142
143 /*
144  * dn2entry - look up dn in the cache/indexes and return the corresponding
145  * entry.
146  */
147
148 Entry *
149 dn2entry(
150     Backend     *be,
151     char        *dn,
152     char        **matched
153 )
154 {
155         struct ldbminfo *li = (struct ldbminfo *) be->be_private;
156         ID              id;
157         Entry           *e;
158         char            *pdn;
159
160         if ( (id = dn2id( be, dn )) != NOID && (e = id2entry( be, id ))
161             != NULL ) {
162                 return( e );
163         }
164         *matched = NULL;
165
166         /* stop when we get to the suffix */
167         if ( be_issuffix( be, dn ) ) {
168                 return( NULL );
169         }
170
171         /* entry does not exist - see how much of the dn does exist */
172         if ( (pdn = dn_parent( be, dn )) != NULL ) {
173                 if ( (e = dn2entry( be, pdn, matched )) != NULL ) {
174                         *matched = pdn;
175                         cache_return_entry( &li->li_cache, e );
176                 } else {
177                         free( pdn );
178                 }
179         }
180
181         return( NULL );
182 }