public static void CollectIdsInternal(CollectIdContext context, ITypeHandler4 handler , int linkLength, bool doWithSlotIndirection) { if (!(IsCascading(handler))) { IReadBuffer buffer = context.Buffer(); buffer.Seek(buffer.Offset() + linkLength); return; } if (handler is StandardReferenceTypeHandler) { context.AddId(); return; } LocalObjectContainer container = (LocalObjectContainer)context.Container(); SlotFormat slotFormat = context.SlotFormat(); if (HandleAsObject(handler)) { // TODO: Code is similar to QCandidate.readArrayCandidates. Try to refactor to one place. int collectionID = context.ReadInt(); ByteArrayBuffer collectionBuffer = container.ReadBufferById(context.Transaction() , collectionID); ObjectHeader objectHeader = new ObjectHeader(container, collectionBuffer); QueryingReadContext subContext = new QueryingReadContext(context.Transaction(), context .HandlerVersion(), collectionBuffer, collectionID, context.Collector()); objectHeader.ClassMetadata().CollectIDs(subContext); return; } QueryingReadContext queryingReadContext = new QueryingReadContext(context.Transaction (), context.HandlerVersion(), context.Buffer(), 0, context.Collector()); IClosure4 collectIDsFromQueryingContext = new _IClosure4_263(handler, queryingReadContext ); if (doWithSlotIndirection) { slotFormat.DoWithSlotIndirection(queryingReadContext, handler, collectIDsFromQueryingContext ); } else { collectIDsFromQueryingContext.Run(); } }
/// <exception cref="Db4objects.Db4o.Internal.FieldIndexException"></exception> public sealed override void CollectIDs(CollectIdContext context) { if (!Alive()) { IncrementOffset(context.Buffer()); return; } ITypeHandler4 handler = HandlerRegistry.CorrectHandlerVersion(context, GetHandler ()); Handlers4.CollectIdsInternal(context, handler, LinkLength(), true); }