]> git.sur5r.net Git - openldap/blob - servers/slapd/back-ldbm/key.c
Import alias deref finding bug fix from devel
[openldap] / servers / slapd / back-ldbm / key.c
1 /* index.c - routines for dealing with attribute indexes */
2 /* $OpenLDAP$ */
3 /*
4  * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
6  */
7
8 #include "portable.h"
9
10 #include <stdio.h>
11
12 #include <ac/string.h>
13 #include <ac/socket.h>
14
15 #include "slap.h"
16 #include "back-ldbm.h"
17
18 /* read a key */
19 int
20 key_read(
21     Backend     *be,
22         DBCache *db,
23     struct berval *k,
24         ID_BLOCK **idout
25 )
26 {
27         Datum           key;
28         ID_BLOCK                *idl;
29
30         Debug( LDAP_DEBUG_TRACE, "=> key_read\n", 0, 0, 0 );
31
32         ldbm_datum_init( key );
33         key.dptr = k->bv_val;
34         key.dsize = k->bv_len;
35
36         idl = idl_fetch( be, db, key );
37
38         Debug( LDAP_DEBUG_TRACE, "<= index_read %ld candidates\n",
39                idl ? ID_BLOCK_NIDS(idl) : 0, 0, 0 );
40
41         *idout = idl;
42         return LDAP_SUCCESS;
43 }
44
45 /* Add or remove stuff from index files */
46 int
47 key_change(
48     Backend             *be,
49     DBCache     *db,
50     struct berval *k,
51     ID                  id,
52     int                 op
53 )
54 {
55         int     rc;
56         Datum   key;
57
58         Debug( LDAP_DEBUG_TRACE, "=> key_change(%s,%lx)\n",
59                 op == SLAP_INDEX_ADD_OP ? "ADD":"DELETE", (long) id, 0 );
60
61         ldbm_datum_init( key );
62         key.dptr = k->bv_val;
63         key.dsize = k->bv_len;
64
65         if (op == SLAP_INDEX_ADD_OP) {
66             /* Add values */
67             rc = idl_insert_key( be, db, key, id );
68
69         } else {
70             /* Delete values */
71             rc = idl_delete_key( be, db, key, id );
72         }
73
74
75         Debug( LDAP_DEBUG_TRACE, "<= key_change %d\n", rc, 0, 0 );
76
77         ldap_pvt_thread_yield();
78
79         return rc;
80 }