示例#1
0
        public static void Defragment(IDefragmentContext context, ArrayHandler handler)
        {
            int sourceAddress = context.SourceBuffer().ReadInt();
            int length        = context.SourceBuffer().ReadInt();

            if (sourceAddress == 0 && length == 0)
            {
                context.TargetBuffer().WriteInt(0);
                context.TargetBuffer().WriteInt(0);
                return;
            }
            Slot            slot         = context.AllocateMappedTargetSlot(sourceAddress, length);
            ByteArrayBuffer sourceBuffer = null;

            try
            {
                sourceBuffer = context.SourceBufferByAddress(sourceAddress, length);
            }
            catch (IOException exc)
            {
                throw new Db4oIOException(exc);
            }
            DefragmentContextImpl payloadContext = new DefragmentContextImpl(sourceBuffer, (DefragmentContextImpl
                                                                                            )context);

            handler.DefragmentSlot(payloadContext);
            payloadContext.WriteToTarget(slot.Address());
            context.TargetBuffer().WriteInt(slot.Address());
            context.TargetBuffer().WriteInt(length);
        }
示例#2
0
 private int CopyDependentSlot(IDefragmentContext context, int sourceId)
 {
     try
     {
         ByteArrayBuffer sourceBuffer      = context.SourceBufferById(sourceId);
         Slot            targetPayloadSlot = context.AllocateTargetSlot(sourceBuffer.Length());
         int             targetId          = context.Services().TargetNewId();
         context.Services().MapIDs(sourceId, targetId, false);
         context.Services().Mapping().MapId(targetId, targetPayloadSlot);
         DefragmentContextImpl payloadContext = new DefragmentContextImpl(sourceBuffer, (DefragmentContextImpl
                                                                                         )context);
         int           clazzId                 = payloadContext.CopyIDReturnOriginalID();
         ITypeHandler4 payloadHandler          = payloadContext.TypeHandlerForId(clazzId);
         ITypeHandler4 versionedPayloadHandler = HandlerRegistry.CorrectHandlerVersion(payloadContext
                                                                                       , payloadHandler);
         versionedPayloadHandler.Defragment(payloadContext);
         payloadContext.WriteToTarget(targetPayloadSlot.Address());
         return(targetId);
     }
     catch (IOException ioexc)
     {
         throw new Db4oIOException(ioexc);
     }
 }
示例#3
0
 private int CopyDependentSlot(IDefragmentContext context, int sourceId)
 {
     try
     {
         var sourceBuffer = context.SourceBufferById(sourceId);
         var targetPayloadSlot = context.AllocateTargetSlot(sourceBuffer.Length());
         var targetId = context.Services().TargetNewId();
         context.Services().MapIDs(sourceId, targetId, false);
         context.Services().Mapping().MapId(targetId, targetPayloadSlot);
         var payloadContext = new DefragmentContextImpl(sourceBuffer, (DefragmentContextImpl
             ) context);
         var clazzId = payloadContext.CopyIDReturnOriginalID();
         var payloadHandler = payloadContext.TypeHandlerForId(clazzId);
         var versionedPayloadHandler = HandlerRegistry.CorrectHandlerVersion(payloadContext
             , payloadHandler);
         versionedPayloadHandler.Defragment(payloadContext);
         payloadContext.WriteToTarget(targetPayloadSlot.Address());
         return targetId;
     }
     catch (IOException ioexc)
     {
         throw new Db4oIOException(ioexc);
     }
 }
示例#4
0
 public static void Defragment(IDefragmentContext context, ArrayHandler handler)
 {
     var sourceAddress = context.SourceBuffer().ReadInt();
     var length = context.SourceBuffer().ReadInt();
     if (sourceAddress == 0 && length == 0)
     {
         context.TargetBuffer().WriteInt(0);
         context.TargetBuffer().WriteInt(0);
         return;
     }
     var slot = context.AllocateMappedTargetSlot(sourceAddress, length);
     ByteArrayBuffer sourceBuffer = null;
     try
     {
         sourceBuffer = context.SourceBufferByAddress(sourceAddress, length);
     }
     catch (IOException exc)
     {
         throw new Db4oIOException(exc);
     }
     var payloadContext = new DefragmentContextImpl(sourceBuffer, (DefragmentContextImpl
         ) context);
     handler.DefragmentSlot(payloadContext);
     payloadContext.WriteToTarget(slot.Address());
     context.TargetBuffer().WriteInt(slot.Address());
     context.TargetBuffer().WriteInt(length);
 }