/* This file is part of the db4o object database http://www.db4o.com Copyright (C) 2004 - 2011 Versant Corporation http://www.versant.com db4o is free software; you can redistribute it and/or modify it under the terms of version 3 of the GNU General Public License as published by the Free Software Foundation. db4o is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/. */ package com.db4o.internal.handlers.array; import java.io.*; import com.db4o.ext.*; import com.db4o.internal.*; import com.db4o.internal.delete.*; import com.db4o.internal.marshall.*; import com.db4o.internal.slots.*; import com.db4o.marshall.*; /** * @exclude */ public class ArrayHandler0 extends ArrayHandler1 { protected ArrayVersionHelper createVersionHelper() { return new ArrayVersionHelper0(); } protected void withContent(AbstractBufferContext context, Runnable runnable){ int address = context.readInt(); int length = context.readInt(); if(address == 0){ return; } ReadBuffer temp = context.buffer(); ByteArrayBuffer indirectedBuffer = container(context).decryptedBufferByAddress(address, length); context.buffer(indirectedBuffer); runnable.run(); context.buffer(temp); } public void delete(DeleteContext context) throws Db4oIOException { context.readSlot(); context.defragmentRecommended(); } public Object read(ReadContext readContext) { InternalReadContext context = (InternalReadContext) readContext; ByteArrayBuffer buffer = (ByteArrayBuffer) context.readIndirectedBuffer(); if (buffer == null) { return null; } // With the following line we ask the context to work with // a different buffer. Should this logic ever be needed by // a user handler, it should be implemented by using a Queue // in the UnmarshallingContext. // The buffer has to be set back from the outside! See below ReadBuffer contextBuffer = context.buffer(buffer); Object array = super.read(context); // The context buffer has to be set back. context.buffer(contextBuffer); return array; } public static void defragment(DefragmentContext 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); } public void defragment(DefragmentContext context) { defragment(context, this); } }