mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-01-24 13:24:56 +08:00
Add idl_delete routines
This commit is contained in:
parent
6543336245
commit
4830b23b9d
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user