]> git.sur5r.net Git - openldap/blob - servers/slapd/back-ldbm/dn2id.c
4ee592da0748a1909ecea750c47e93d617461a25
[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 #ifdef LDBM_PESSIMISTIC
45         rc = ldbm_cache_store( db, key, data, LDBM_INSERT | LDBM_SYNC );
46 #else
47         rc = ldbm_cache_store( db, key, data, LDBM_INSERT );
48 #endif
49
50         free( dn );
51         ldbm_cache_close( be, db );
52
53         Debug( LDAP_DEBUG_TRACE, "<= dn2id_add %d\n", rc, 0, 0 );
54         return( rc );
55 }
56
57 ID
58 dn2id(
59     Backend     *be,
60     char        *dn
61 )
62 {
63         struct ldbminfo *li = (struct ldbminfo *) be->be_private;
64         struct dbcache  *db;
65         Entry           *e;
66         ID              id;
67         Datum           key, data;
68
69
70         dn = strdup( dn );
71         dn_normalize_case( dn );
72         Debug( LDAP_DEBUG_TRACE, "=> dn2id( \"%s\" )\n", dn, 0, 0 );
73
74         /* first check the cache */
75         if ( (e = cache_find_entry_dn( &li->li_cache, dn )) != NULL ) {
76                 id = e->e_id;
77                 free( dn );
78                 Debug( LDAP_DEBUG_TRACE, "<= dn2id %d (in cache)\n", e->e_id,
79                     0, 0 );
80                 cache_return_entry( &li->li_cache, e );
81
82                 return( id );
83         }
84
85         if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
86             == NULL ) {
87                 free( dn );
88                 Debug( LDAP_DEBUG_ANY, "<= dn2id could not open dn2id%s\n",
89                     LDBM_SUFFIX, 0, 0 );
90                 return( NOID );
91         }
92
93         key.dptr = dn;
94         key.dsize = strlen( dn ) + 1;
95
96         data = ldbm_cache_fetch( db, key );
97
98         ldbm_cache_close( be, db );
99         free( dn );
100
101         if ( data.dptr == NULL ) {
102                 Debug( LDAP_DEBUG_TRACE, "<= dn2id NOID\n", 0, 0, 0 );
103                 return( NOID );
104         }
105
106         (void) memcpy( (char *) &id, data.dptr, sizeof(ID) );
107
108         ldbm_datum_free( db->dbc_db, data );
109
110         Debug( LDAP_DEBUG_TRACE, "<= dn2id %d\n", id, 0, 0 );
111         return( id );
112 }
113
114 int
115 dn2id_delete(
116     Backend     *be,
117     char        *dn
118 )
119 {
120         struct ldbminfo *li = (struct ldbminfo *) be->be_private;
121         struct dbcache  *db;
122         Datum           key;
123         int             rc;
124
125         Debug( LDAP_DEBUG_TRACE, "=> dn2id_delete( \"%s\" )\n", dn, 0, 0 );
126
127         if ( (db = ldbm_cache_open( be, "dn2id", LDBM_SUFFIX, LDBM_WRCREAT ))
128             == NULL ) {
129                 Debug( LDAP_DEBUG_ANY,
130                     "<= dn2id_delete could not open dn2id%s\n", LDBM_SUFFIX,
131                     0, 0 );
132                 return( -1 );
133         }
134
135         dn_normalize_case( dn );
136         key.dptr = dn;
137         key.dsize = strlen( dn ) + 1;
138
139         rc = ldbm_cache_delete( db, key );
140
141         ldbm_cache_close( be, db );
142
143         Debug( LDAP_DEBUG_TRACE, "<= dn2id_delete %d\n", rc, 0, 0 );
144         return( rc );
145 }
146
147 /*
148  * dn2entry - look up dn in the cache/indexes and return the corresponding
149  * entry.
150  */
151
152 Entry *
153 dn2entry(
154     Backend     *be,
155     char        *dn,
156     char        **matched
157 )
158 {
159         struct ldbminfo *li = (struct ldbminfo *) be->be_private;
160         ID              id;
161         Entry           *e;
162         char            *pdn;
163
164         if ( (id = dn2id( be, dn )) != NOID && (e = id2entry( be, id ))
165             != NULL ) {
166                 return( e );
167         }
168         *matched = NULL;
169
170         /* stop when we get to the suffix */
171         if ( be_issuffix( be, dn ) ) {
172                 return( NULL );
173         }
174
175         /* entry does not exist - see how much of the dn does exist */
176         if ( (pdn = dn_parent( be, dn )) != NULL ) {
177                 if ( (e = dn2entry( be, pdn, matched )) != NULL ) {
178                         *matched = pdn;
179                         cache_return_entry( &li->li_cache, e );
180                 } else {
181                         free( pdn );
182                 }
183         }
184
185         return( NULL );
186 }