X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-bdb%2Fnextid.c;h=fe62acb8b5f6e870d27cda11e55dadb3b79d828f;hb=3bf9998d7885ef6bbc4690d4229e5cb5068a35de;hp=7ceda5f9cfffe78305dd657981a227c2c53af9fb;hpb=0bcc892fdf387a231736681e261cfd3b7702f549;p=openldap diff --git a/servers/slapd/back-bdb/nextid.c b/servers/slapd/back-bdb/nextid.c index 7ceda5f9cf..fe62acb8b5 100644 --- a/servers/slapd/back-bdb/nextid.c +++ b/servers/slapd/back-bdb/nextid.c @@ -1,8 +1,17 @@ /* init.c - initialize bdb backend */ /* $OpenLDAP$ */ -/* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* This work is part of OpenLDAP Software . + * + * Copyright 2000-2008 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . */ #include "portable.h" @@ -12,161 +21,54 @@ #include "back-bdb.h" -int bdb_next_id( BackendDB *be, DB_TXN *tid, ID *out ) +int bdb_next_id( BackendDB *be, ID *out ) { struct bdb_info *bdb = (struct bdb_info *) be->be_private; - int rc; - ID kid = NOID; - ID id; - DBT key, data; - DB_TXN *ltid; - - DBTzero( &key ); - key.data = (char *) &kid; - key.size = sizeof( kid ); - - DBTzero( &data ); - data.data = (char *) &id; - data.ulen = sizeof( id ); - data.flags = DB_DBT_USERMEM; - - if( 0 ) { -retry: if( tid != NULL ) { - /* nested transaction, abort and return */ - (void) txn_abort( ltid ); - Debug( LDAP_DEBUG_ANY, - "=> bdb_next_id: aborted!\n", - 0, 0, 0 ); - return rc; - } - rc = txn_abort( ltid ); - if( rc != 0 ) { - Debug( LDAP_DEBUG_ANY, - "=> bdb_next_id: txn_abort failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); - return rc; - } - } - - rc = txn_begin( bdb->bi_dbenv, tid, <id, 0 ); - if( rc != 0 ) { - Debug( LDAP_DEBUG_ANY, - "=> bdb_next_id: txn_begin failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); - return rc; - } - - /* 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 = 0; - break; - - case 0: - if ( data.size != sizeof( id ) ) { - Debug( LDAP_DEBUG_ANY, - "=> bdb_next_id: get size mismatch: expected %ld, got %ld\n", - (long) sizeof( id ), (long) data.size, 0 ); - rc = -1; - goto done; - } - break; - - default: - Debug( LDAP_DEBUG_ANY, - "=> bdb_next_id: get failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); - goto done; - } - - id++; - data.size = sizeof( 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; + ldap_pvt_thread_mutex_lock( &bdb->bi_lastid_mutex ); + *out = ++bdb->bi_lastid; + ldap_pvt_thread_mutex_unlock( &bdb->bi_lastid_mutex ); - bdb->bi_lastid = id; - - rc = txn_commit( ltid, 0 ); - - if( rc != 0 ) { - Debug( LDAP_DEBUG_ANY, - "=> bdb_next_id: commit failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); - } - break; - - default: - Debug( LDAP_DEBUG_ANY, - "=> bdb_next_id: put failed: %s (%d)\n", - db_strerror(rc), rc, 0 ); -done: (void) txn_abort( ltid ); - } - - return rc; + 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; + unsigned char idbuf[sizeof(ID)]; DBT key, data; + DBC *cursor; DBTzero( &key ); - key.data = (char *) &kid; - key.size = sizeof( kid ); + key.flags = DB_DBT_USERMEM; + key.data = (char *) idbuf; + key.ulen = sizeof( idbuf ); DBTzero( &data ); - data.data = (char *) &id; - data.ulen = sizeof( id ); - data.flags = DB_DBT_USERMEM; + data.flags = DB_DBT_USERMEM | DB_DBT_PARTIAL; -retry: - /* get existing value for read/modify/write */ - rc = bdb->bi_nextid->bdi_db->get( bdb->bi_nextid->bdi_db, - tid, &key, &data, 0 ); + /* Get a read cursor */ + rc = bdb->bi_id2entry->bdi_db->cursor( bdb->bi_id2entry->bdi_db, + tid, &cursor, 0 ); - switch(rc) { - case DB_LOCK_DEADLOCK: - case DB_LOCK_NOTGRANTED: - goto retry; + if (rc == 0) { + rc = cursor->c_get(cursor, &key, &data, DB_LAST); + cursor->c_close(cursor); + } + switch(rc) { case DB_NOTFOUND: - id = 0; rc = 0; break; - case 0: - if ( data.size != sizeof( id ) ) { - Debug( LDAP_DEBUG_ANY, - "=> bdb_last_id: get size mismatch: expected %ld, got %ld\n", - (long) sizeof( id ), (long) data.size, 0 ); - rc = -1; - goto done; - } + BDB_DISK2ID( idbuf, &id ); break; default: Debug( LDAP_DEBUG_ANY, - "=> bdb_next_id: get failed: %s (%d)\n", + "=> bdb_last_id: get failed: %s (%d)\n", db_strerror(rc), rc, 0 ); goto done; }