You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@directory.apache.org by ka...@apache.org on 2010/09/21 21:59:03 UTC
svn commit: r999582 -
/directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java
Author: kayyagari
Date: Tue Sep 21 19:59:02 2010
New Revision: 999582
URL: http://svn.apache.org/viewvc?rev=999582&view=rev
Log:
o implemented delete operation
Modified:
directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java
Modified: directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java
URL: http://svn.apache.org/viewvc/directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java?rev=999582&r1=999581&r2=999582&view=diff
==============================================================================
--- directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java (original)
+++ directory/apacheds/trunk/ldif-partition/src/main/java/org/apache/directory/server/core/partition/ldif/SingleFileLdifPartition.java Tue Sep 21 19:59:02 2010
@@ -355,9 +355,54 @@ public class SingleFileLdifPartition ext
@Override
- public void delete( Long id ) throws LdapException
+ public synchronized void delete( Long id ) throws LdapException
{
wrappedPartition.delete( id );
+
+ try
+ {
+ EntryOffset entryOffset = offsetMap.get( id );
+
+ // check if the entry to be removed is present at the end of file
+ if ( entryOffset.getEnd() == ldifFile.length() )
+ {
+ ldifFile.setLength( entryOffset.getStart() );
+ // check if entry is the context entry
+ if ( entryOffset.getStart() == 0 )
+ {
+ contextEntry = null;
+ }
+ }
+ else
+ {
+ FileChannel tmpBufChannel = tempBufFile.getChannel();
+ FileChannel mainChannel = ldifFile.getChannel();
+
+ // clear the buffer
+ tempBufFile.setLength( 0 );
+
+ long count = ( ldifFile.length() - entryOffset.getEnd() );
+
+ mainChannel.transferTo( entryOffset.getEnd(), count, tmpBufChannel );
+ ldifFile.setLength( entryOffset.getStart() );
+
+ Set<EntryOffset> belowParentOffsets = greaterThan( entryOffset );
+
+ long diff = entryOffset.length();
+ diff -= (2 * diff); // this offset change should always be negative
+
+ for ( EntryOffset o : belowParentOffsets )
+ {
+ o.changeOffsetsBy( diff );
+ }
+
+ tmpBufChannel.transferTo( 0, tmpBufChannel.size(), mainChannel );
+ }
+ }
+ catch( IOException e )
+ {
+ throw new LdapException( e );
+ }
}
@@ -379,7 +424,7 @@ public class SingleFileLdifPartition ext
return e;
}
}
-
+
// if non exists
return null;
}
@@ -458,7 +503,7 @@ public class SingleFileLdifPartition ext
// erase file
ldifFile.setLength( 0 );
}
-
+
ldifFile.seek( pos );
ldifFile.write( StringTools.getBytesUtf8( ldif + "\n" ) );