From: Kurt Zeilenga Date: Wed, 20 Sep 2000 23:29:41 +0000 (+0000) Subject: Add idl_delete routines X-Git-Tag: LDBM_PRE_GIANT_RWLOCK~1935 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=4830b23b9dcac9e179da6f158e247d2e95efab70;p=openldap Add idl_delete routines --- diff --git a/servers/slapd/back-bdb/idl.c b/servers/slapd/back-bdb/idl.c index a105f29255..6415d8728d 100644 --- a/servers/slapd/back-bdb/idl.c +++ b/servers/slapd/back-bdb/idl.c @@ -49,12 +49,12 @@ static int idl_insert( ID *ids, ID id ) ids[0]++; ids[ids[0]] = id; - } else if ( ids[0]+1 >= BDB_IDL_MAX ) { + } else if ( ++ids[0] >= BDB_IDL_MAX ) { ids[0] = NOID; } else { /* insert id */ - AC_MEMCPY( &ids[x+1], &ids[x], (1+ids[0]-x) * sizeof(ID) ); + AC_MEMCPY( &ids[x+1], &ids[x], (ids[0]-x) * sizeof(ID) ); ids[0]++; ids[x] = id; } @@ -62,6 +62,24 @@ static int idl_insert( ID *ids, ID id ) return 0; } +static int idl_delete( ID *ids, ID id ) +{ + int x = idl_search( ids, id ); + + if( x == 0 || ids[x] != id ) { + /* not found */ + return -1; + + } else if ( --ids[0] == 0 ) { + if( x != 1 ) return -1; + + } else { + AC_MEMCPY( &ids[x], &ids[x+1], (1+ids[0]-x) * sizeof(ID) ); + } + + return 0; +} + int bdb_idl_insert_key( BackendDB *be, @@ -115,3 +133,58 @@ bdb_idl_insert_key( return rc; } + +int +bdb_idl_delete_key( + BackendDB *be, + DB *db, + DB_TXN *tid, + DBT *key, + ID id ) +{ + int rc; + ID ids[BDB_IDL_SIZE]; + DBT data; + + assert( id != NOID ); + + data.data = ids; + data.ulen = sizeof( ids ); + data.flags = DB_DBT_USERMEM; + + /* fetch the key and grab a write lock */ + rc = db->get( db, tid, key, &data, DB_RMW ); + + if ( rc != 0 ) { + return rc; + + } else if ( data.size == 0 || data.size % sizeof( ID ) ) { + /* size not multiple of ID size */ + return -1; + + } else if ( BDB_IS_ALLIDS(ids) ) { + return 0; + + } else if ( data.size != (1 + ids[0]) * sizeof( ID ) ) { + /* size mismatch */ + return -1; + + } else { + rc = idl_delete( ids, id ); + + if( rc != 0 ) return rc; + + if( BDB_IS_ALLIDS(ids) ) { + /* delete the key */ + rc = db->del( db, tid, key, 0 ); + return rc; + } + + data.size = (ids[0]+1) * sizeof( ID ); + } + + /* store the key */ + rc = db->put( db, tid, key, &data, 0 ); + + return rc; +}