in jdbm-partition/src/main/java/org/apache/directory/server/core/partition/impl/btree/jdbm/JdbmTable.java [620:715]
public synchronized void remove( PartitionTxn transaction, K key, V value ) throws LdapException
{
try
{
if ( LOG.isDebugEnabled() )
{
LOG.debug( "---> Remove {} = {}, {}", name, key, value );
}
if ( key == null )
{
if ( LOG.isDebugEnabled() )
{
LOG.debug( "<--- Remove NULL key {}", name );
}
return;
}
if ( !allowsDuplicates )
{
V oldValue = bt.find( key );
// Remove the value only if it is the same as value.
if ( ( oldValue != null ) && oldValue.equals( value ) )
{
bt.remove( key );
count--;
if ( LOG.isDebugEnabled() )
{
LOG.debug( "<--- Remove ONE {} = {}, {}", name, key, value );
}
}
return;
}
DupsContainer<V> values = getDupsContainer( ( byte[] ) bt.find( key ) );
if ( values.isArrayTree() )
{
ArrayTree<V> set = values.getArrayTree();
// If removal succeeds then remove if set is empty else replace it
if ( set.remove( value ) != null )
{
if ( set.isEmpty() )
{
bt.remove( key );
}
else
{
bt.insert( key, ( V ) marshaller.serialize( set ), true );
}
count--;
if ( LOG.isDebugEnabled() )
{
LOG.debug( "<--- Remove AVL {} = {}, {}", name, key, value );
}
}
return;
}
// if the number of duplicates falls below the numDupLimit value
BTree tree = getBTree( values.getBTreeRedirect() );
if ( tree.find( value ) != null && tree.remove( value ) != null )
{
/*
* If we drop below the duplicate limit then we revert from using
* a Jdbm BTree to using an in memory AvlTree.
*/
if ( tree.size() <= numDupLimit )
{
ArrayTree<V> avlTree = convertToArrayTree( tree );
bt.insert( key, ( V ) marshaller.serialize( avlTree ), true );
recMan.delete( tree.getRecordId() );
}
count--;
if ( LOG.isDebugEnabled() )
{
LOG.debug( "<--- Remove BTREE {} = {}, {}", name, key, value );
}
}
}
catch ( Exception e )
{
LOG.error( I18n.err( I18n.ERR_34002_ERROR_WHILE_ADDING_KEY_VALUE_ON_TABLE, key, value, name ), e );
}
}