X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fnextid.c;h=b9e4151b34aa715c2b2b1a72f9baff38f6591e5a;hb=c5b6a86502dc0c16027cd87e3d9544e9078083db;hp=dbbbfb26332883c6c1c99c19e6810c04a423368c;hpb=68a5db572c3542718121119c71c30b6f69660b3c;p=openldap diff --git a/servers/slapd/back-bdb/nextid.c b/servers/slapd/back-bdb/nextid.c index dbbbfb2633..b9e4151b34 100644 --- a/servers/slapd/back-bdb/nextid.c +++ b/servers/slapd/back-bdb/nextid.c @@ -1,7 +1,7 @@ /* init.c - initialize bdb backend */ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -13,84 +13,63 @@ #include "back-bdb.h" int bdb_next_id( BackendDB *be, DB_TXN *tid, ID *out ) +{ + struct bdb_info *bdb = (struct bdb_info *) be->be_private; + + ldap_pvt_thread_mutex_lock( &bdb->bi_lastid_mutex ); + *out = ++bdb->bi_lastid; + ldap_pvt_thread_mutex_unlock( &bdb->bi_lastid_mutex ); + + return 0; +} + +int bdb_last_id( BackendDB *be, DB_TXN *tid ) { struct bdb_info *bdb = (struct bdb_info *) be->be_private; int rc; - ID kid = NOID; - ID id; + ID id = 0; DBT key, data; - DB_TXN *ltid; + DBC *cursor; DBTzero( &key ); - key.data = (char *) &kid; - key.size = sizeof( kid ); + key.flags = DB_DBT_USERMEM; + key.data = (char *) &id; + key.ulen = sizeof( id ); DBTzero( &data ); - data.data = (char *) &id; - data.ulen = sizeof( id ); - data.flags = DB_DBT_USERMEM; + data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL; - if( 0 ) { -retry: if( tid != NULL ) { - /* nested transaction, abort and return */ - (void) txn_abort( ltid ); - return rc; - } - rc = txn_abort( ltid ); - if( rc != 0 ) { - return rc; - } - } + /* Get a read cursor */ + rc = bdb->bi_id2entry->bdi_db->cursor( bdb->bi_id2entry->bdi_db, + tid, &cursor, 0 ); - rc = txn_begin( bdb->bi_dbenv, tid, <id, 0 ); - if( rc != 0 ) { - return rc; + if (rc == 0) { + rc = cursor->c_get(cursor, &key, &data, DB_LAST); + cursor->c_close(cursor); } - /* get existing value for read/modify/write */ - rc = bdb->bi_nextid->bdi_db->get( bdb->bi_nextid->bdi_db, - ltid, &key, &data, DB_RMW ); - switch(rc) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - case DB_NOTFOUND: - id = NOID; - break; - + id = 0; + rc = 0; + /* FALLTHROUGH */ case 0: - if ( data.size != sizeof(ID) ) { - /* size mismatch! */ - rc = -1; - goto done; - } break; default: +#ifdef NEW_LOGGING + LDAP_LOG ( INDEX, ERR, "bdb_last_id: get failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); +#else + Debug( LDAP_DEBUG_ANY, + "=> bdb_last_id: get failed: %s (%d)\n", + db_strerror(rc), rc, 0 ); +#endif goto done; } - id++; - - /* put new value */ - rc = bdb->bi_nextid->bdi_db->put( bdb->bi_nextid->bdi_db, - ltid, &key, &data, 0 ); - - switch(rc) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; - - case 0: - *out = id; - rc = txn_commit( ltid, 0 ); - break; - - default: -done: (void) txn_abort( ltid ); - } + bdb->bi_lastid = id; +done: return rc; }