]> git.sur5r.net Git - openldap/blob - servers/slapd/back-bdb/nextid.c
acf15046c7694ddf4f9b764491b7f8e4e2d4ae6c
[openldap] / servers / slapd / back-bdb / nextid.c
1 /* init.c - initialize bdb backend */
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 "back-bdb.h"
16
17 int bdb_next_id( BackendDB *be, DB_TXN *tid, ID *out )
18 {
19         struct bdb_info *bdb = (struct bdb_info *) be->be_private;
20         int rc;
21         ID kid = NOID;
22         ID id;
23         DBT key, data;
24         DB_TXN  *ltid;
25
26         rc = txn_begin( bdb->bi_dbenv, tid, &ltid, 0 );
27         if( rc != 0 ) {
28                 return rc;
29         }
30
31         DBTzero( &key );
32         key.data = (char *) &kid;
33         key.size = sizeof( kid );
34
35         DBTzero( &data );
36         data.data = (char *) &id;
37         data.ulen = sizeof( id );
38         data.flags = DB_DBT_USERMEM;
39
40         /* get exiting value (with write lock) */
41         rc = bdb->bi_entries->bdi_db->get( bdb->bi_nextid->bdi_db,
42                 ltid, &key, &data, DB_RMW );
43
44         if( rc == DB_NOTFOUND ) {
45                 /* must be first add */
46                 id = NOID;
47
48         } else if( rc != 0 ) {
49                 goto done;
50
51         } else if ( data.size != sizeof(ID) ) {
52                 /* size mismatch! */
53                 rc = -1;
54                 goto done;
55         }
56
57         id++;
58
59         /* store new value */
60         rc = bdb->bi_entries->bdi_db->put( bdb->bi_nextid->bdi_db,
61                 ltid, &key, &data, 0 );
62
63         *out = id;
64
65 done:
66         if( rc != 0 ) {
67                 (void) txn_abort( ltid );
68         } else {
69                 rc = txn_commit( ltid, 0 );
70         }
71
72         return rc;
73 }