1 /* init.c - initialize bdb backend */
4 * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
5 * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
11 #include <ac/string.h>
15 int bdb_next_id( BackendDB *be, DB_TXN *tid, ID *out )
17 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
25 key.data = (char *) &kid;
26 key.size = sizeof( kid );
29 data.data = (char *) &id;
30 data.ulen = sizeof( id );
31 data.flags = DB_DBT_USERMEM;
34 retry: if( tid != NULL ) {
35 /* nested transaction, abort and return */
36 (void) txn_abort( ltid );
39 rc = txn_abort( ltid );
45 rc = txn_begin( bdb->bi_dbenv, tid, <id, 0 );
50 /* get existing value for read/modify/write */
51 rc = bdb->bi_nextid->bdi_db->get( bdb->bi_nextid->bdi_db,
52 ltid, &key, &data, DB_RMW );
55 case DB_LOCK_DEADLOCK:
56 case DB_LOCK_NOTGRANTED:
64 if ( data.size != sizeof(ID) ) {
78 rc = bdb->bi_nextid->bdi_db->put( bdb->bi_nextid->bdi_db,
79 ltid, &key, &data, 0 );
82 case DB_LOCK_DEADLOCK:
83 case DB_LOCK_NOTGRANTED:
88 rc = txn_commit( ltid, 0 );
92 done: (void) txn_abort( ltid );