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 );
37 Debug( LDAP_DEBUG_ANY,
38 "=> bdb_next_id: aborted!\n",
42 rc = txn_abort( ltid );
44 Debug( LDAP_DEBUG_ANY,
45 "=> bdb_next_id: txn_abort failed: %s (%d)\n",
46 db_strerror(rc), rc, 0 );
51 rc = txn_begin( bdb->bi_dbenv, tid, <id, 0 );
53 Debug( LDAP_DEBUG_ANY,
54 "=> bdb_next_id: txn_begin failed: %s (%d)\n",
55 db_strerror(rc), rc, 0 );
59 /* get existing value for read/modify/write */
60 rc = bdb->bi_nextid->bdi_db->get( bdb->bi_nextid->bdi_db,
61 ltid, &key, &data, DB_RMW );
64 case DB_LOCK_DEADLOCK:
65 case DB_LOCK_NOTGRANTED:
73 if ( data.size != sizeof( id ) ) {
74 Debug( LDAP_DEBUG_ANY,
75 "=> bdb_next_id: get size mismatch: expected %ld, got %ld\n",
76 (long) sizeof( id ), (long) data.size, 0 );
83 Debug( LDAP_DEBUG_ANY,
84 "=> bdb_next_id: get failed: %s (%d)\n",
85 db_strerror(rc), rc, 0 );
90 data.size = sizeof( id );
93 rc = bdb->bi_nextid->bdi_db->put( bdb->bi_nextid->bdi_db,
94 ltid, &key, &data, 0 );
97 case DB_LOCK_DEADLOCK:
98 case DB_LOCK_NOTGRANTED:
106 rc = txn_commit( ltid, 0 );
109 Debug( LDAP_DEBUG_ANY,
110 "=> bdb_next_id: commit failed: %s (%d)\n",
111 db_strerror(rc), rc, 0 );
116 Debug( LDAP_DEBUG_ANY,
117 "=> bdb_next_id: put failed: %s (%d)\n",
118 db_strerror(rc), rc, 0 );
119 done: (void) txn_abort( ltid );
125 int bdb_last_id( BackendDB *be, DB_TXN *tid )
127 struct bdb_info *bdb = (struct bdb_info *) be->be_private;
134 key.data = (char *) &kid;
135 key.size = sizeof( kid );
138 data.data = (char *) &id;
139 data.ulen = sizeof( id );
140 data.flags = DB_DBT_USERMEM;
143 /* get existing value for read/modify/write */
144 rc = bdb->bi_nextid->bdi_db->get( bdb->bi_nextid->bdi_db,
145 tid, &key, &data, 0 );
148 case DB_LOCK_DEADLOCK:
149 case DB_LOCK_NOTGRANTED:
158 if ( data.size != sizeof( id ) ) {
159 Debug( LDAP_DEBUG_ANY,
160 "=> bdb_last_id: get size mismatch: expected %ld, got %ld\n",
161 (long) sizeof( id ), (long) data.size, 0 );
168 Debug( LDAP_DEBUG_ANY,
169 "=> bdb_next_id: get failed: %s (%d)\n",
170 db_strerror(rc), rc, 0 );