public static Db4objects.Db4o.Internal.Freespace.AbstractFreespaceManager CreateNew (LocalObjectContainer file, byte systemType) { systemType = CheckType(systemType); int unblockedDiscardLimit = file.ConfigImpl.DiscardFreeSpace(); int blockedDiscardLimit = unblockedDiscardLimit == int.MaxValue ? unblockedDiscardLimit : file.BlockConverter().BytesToBlocks(unblockedDiscardLimit); int remainderSizeLimit = file.BlockConverter().BytesToBlocks(RemainderSizeLimit); IProcedure4 slotFreedCallback = new _IProcedure4_52(file); switch (systemType) { case FmIx: { return new FreespaceManagerIx(blockedDiscardLimit, remainderSizeLimit); } case FmBtree: { return new BTreeFreespaceManager(file, slotFreedCallback, blockedDiscardLimit, remainderSizeLimit ); } default: { return new InMemoryFreespaceManager(slotFreedCallback, blockedDiscardLimit, remainderSizeLimit ); break; } } }
public virtual void Write(Transaction trans) { if (!WriteObjectBegin()) { return; } try { LocalObjectContainer container = (LocalObjectContainer)trans.Container(); if (DTrace.enabled) { DTrace.PersistentOwnLength.Log(GetID()); } int length = OwnLength(); length = container.BlockConverter().BlockAlignedBytes(length); Slot slot = container.AllocateSlot(length); if (IsNew()) { SetID(IdSystem(trans).NewId(SlotChangeFactory())); IdSystem(trans).NotifySlotCreated(_id, slot, SlotChangeFactory()); } else { IdSystem(trans).NotifySlotUpdated(_id, slot, SlotChangeFactory()); } if (DTrace.enabled) { DTrace.PersistentBaseNewSlot.LogLength(GetID(), slot); } ByteArrayBuffer writer = ProduceWriteBuffer(trans, length); WriteToFile(trans, writer, slot); } finally { EndProcessing(); } }
public ConsistencyChecker(IObjectContainer db) { _db = (LocalObjectContainer) db; _overlaps = new OverlapMap(_db.BlockConverter()); }