in mavibot/src/main/java/org/apache/directory/mavibot/btree/AbstractBTree.java [403:469]
public V insert( K key, V value ) throws IOException
{
// Check that we have a TransactionManager
if ( transactionManager == null )
{
throw new BTreeCreationException( "We don't have a transactionLManager" );
}
V existingValue = null;
if ( key == null )
{
throw new IllegalArgumentException( "Key must not be null" );
}
// Take the lock if it's not already taken by another thread and if we
// aren't on a sub-btree
if ( btreeType != BTreeTypeEnum.PERSISTED_SUB )
{
transactionManager.beginTransaction();
}
try
{
InsertResult<K, V> result = insert( key, value, -1L );
if ( result instanceof ExistsResult )
{
existingValue = value;
}
else if ( result instanceof ModifyResult )
{
existingValue = ( ( ModifyResult<K, V> ) result ).getModifiedValue();
}
// Commit now if it's not a sub-btree
if ( btreeType != BTreeTypeEnum.PERSISTED_SUB )
{
//FIXME when result type is ExistsResult then we should avoid writing the headers
transactionManager.commit();
}
return existingValue;
}
catch ( IOException ioe )
{
// We have had an exception, we must rollback the transaction
// if it's not a sub-btree
if ( btreeType != BTreeTypeEnum.PERSISTED_SUB )
{
transactionManager.rollback();
}
return null;
}
catch ( DuplicateValueNotAllowedException e )
{
// We have had an exception, we must rollback the transaction
// if it's not a sub-btree
if ( btreeType != BTreeTypeEnum.PERSISTED_SUB )
{
transactionManager.rollback();
}
throw e;
}
}