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