X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fback-ldbm%2Fnextid.c;h=c80a7015bfe10e11b907e61d1d6b6c0261c45a14;hb=324431062bff39a1bd3969bd37d4913526dd583f;hp=af718a10dc979f7fddb5fc5467d8349ca773ba19;hpb=e4f6d548773d1a79d9ca6fa82b6c486fbdc0c47b;p=openldap diff --git a/servers/slapd/back-ldbm/nextid.c b/servers/slapd/back-ldbm/nextid.c index af718a10dc..c80a7015bf 100644 --- a/servers/slapd/back-ldbm/nextid.c +++ b/servers/slapd/back-ldbm/nextid.c @@ -1,69 +1,78 @@ /* nextid.c - keep track of the next id to be given out */ -/* - * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file +/* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2006 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" #include +#include #include - -#ifdef HAVE_SYS_PARAM_H -#include -#endif +#include #include "slap.h" #include "back-ldbm.h" -static ID -next_id_read( Backend *be ) +static int +next_id_read( Backend *be, ID *idp ) { - struct ldbminfo *li = (struct ldbminfo *) be->be_private; - ID id = NOID; Datum key, data; DBCache *db; + *idp = NOID; + if ( (db = ldbm_cache_open( be, "nextid", LDBM_SUFFIX, LDBM_WRCREAT )) == NULL ) { Debug( LDAP_DEBUG_ANY, "Could not open/create nextid" LDBM_SUFFIX "\n", 0, 0, 0 ); - return( NOID ); + + return( -1 ); } ldbm_datum_init( key ); - key.dptr = (char *) &id; + key.dptr = (char *) idp; key.dsize = sizeof(ID); data = ldbm_cache_fetch( db, key ); if( data.dptr != NULL ) { - memcpy( &id, data.dptr, sizeof( ID ) ); + AC_MEMCPY( idp, data.dptr, sizeof( ID ) ); ldbm_datum_free( db->dbc_db, data ); } else { - id = 1; + *idp = 1; } ldbm_cache_close( be, db ); - return id; + return( 0 ); } -ID +int next_id_write( Backend *be, ID id ) { - struct ldbminfo *li = (struct ldbminfo *) be->be_private; Datum key, data; DBCache *db; ID noid = NOID; - int flags; + int flags, rc = 0; if ( (db = ldbm_cache_open( be, "nextid", LDBM_SUFFIX, LDBM_WRCREAT )) == NULL ) { Debug( LDAP_DEBUG_ANY, "Could not open/create nextid" LDBM_SUFFIX "\n", 0, 0, 0 ); - return( NOID ); + + return( -1 ); } ldbm_datum_init( key ); @@ -76,53 +85,51 @@ next_id_write( Backend *be, ID id ) data.dsize = sizeof(ID); flags = LDBM_REPLACE; - if( li->li_dbcachewsync ) flags |= LDBM_SYNC; - if ( ldbm_cache_store( db, key, data, flags ) != 0 ) { - id = NOID; + rc = -1; } ldbm_cache_close( be, db ); - return id; + return( rc ); } -ID -next_id_get( Backend *be ) +int +next_id_get( Backend *be, ID *idp ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; - ID id = NOID; + int rc = 0; - ldap_pvt_thread_mutex_lock( &li->li_nextid_mutex ); + *idp = NOID; if ( li->li_nextid == NOID ) { - li->li_nextid = next_id_read( be ); + if ( ( rc = next_id_read( be, idp ) ) ) { + return( rc ); + } + li->li_nextid = *idp; } - id = li->li_nextid; + *idp = li->li_nextid; - ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex ); - return id; + return( rc ); } -ID -next_id( Backend *be ) +int +next_id( Backend *be, ID *idp ) { struct ldbminfo *li = (struct ldbminfo *) be->be_private; - ID id = NOID; - - ldap_pvt_thread_mutex_lock( &li->li_nextid_mutex ); + int rc = 0; if ( li->li_nextid == NOID ) { - li->li_nextid = next_id_read( be ); + if ( ( rc = next_id_read( be, idp ) ) ) { + return( rc ); + } + li->li_nextid = *idp; } - if ( li->li_nextid != NOID ) { - id = li->li_nextid++; - - (void) next_id_write( be, li->li_nextid ); + *idp = li->li_nextid++; + if ( next_id_write( be, li->li_nextid ) ) { + rc = -1; } - ldap_pvt_thread_mutex_unlock( &li->li_nextid_mutex ); - return id; - + return( rc ); }