예제 #1
0
            private int TranslateClosestForwardWithoutMidpoints(ReaderWorkItem workItem, long pos, long startIndex, long endIndex)
            {
                PosMap res = ReadPosMap(workItem, endIndex);

                // to allow backward reading of the last record, forward read will decline anyway
                if (pos > res.LogPos)
                {
                    return(Chunk.PhysicalDataSize);
                }

                long low  = startIndex;
                long high = endIndex;

                while (low < high)
                {
                    var mid = low + (high - low) / 2;
                    var v   = ReadPosMap(workItem, mid);

                    if (v.LogPos < pos)
                    {
                        low = mid + 1;
                    }
                    else
                    {
                        high = mid;
                        res  = v;
                    }
                }
                return(res.ActualPos);
            }
예제 #2
0
			private IEnumerable<PosMap> ReadPosMap(ReaderWorkItem workItem, long index, int count) {
				if (Chunk.ChunkFooter.IsMap12Bytes) {
					var pos = ChunkHeader.Size + Chunk.ChunkFooter.PhysicalDataSize + index * PosMap.FullSize;
					workItem.Stream.Seek(pos, SeekOrigin.Begin);
					for (int i = 0; i < count; i++)
						yield return PosMap.FromNewFormat(workItem.Reader);
				} else {
					var pos = ChunkHeader.Size + Chunk.ChunkFooter.PhysicalDataSize + index * PosMap.DeprecatedSize;
					workItem.Stream.Seek(pos, SeekOrigin.Begin);
					for (int i = 0; i < count; i++)
						yield return PosMap.FromOldFormat(workItem.Reader);
				}
			}
예제 #3
0
 private PosMap ReadPosMap(ReaderWorkItem workItem, long index)
 {
     if (Chunk.ChunkFooter.IsMap12Bytes)
     {
         var pos = ChunkHeader.Size + Chunk.ChunkFooter.PhysicalDataSize + index * PosMap.FullSize;
         workItem.Stream.Seek(pos, SeekOrigin.Begin);
         return(PosMap.FromNewFormat(workItem.Reader));
     }
     else
     {
         var pos = ChunkHeader.Size + Chunk.ChunkFooter.PhysicalDataSize + index * PosMap.DeprecatedSize;
         workItem.Stream.Seek(pos, SeekOrigin.Begin);
         return(PosMap.FromOldFormat(workItem.Reader));
     }
 }
예제 #4
0
 public Midpoint(int itemIndex, PosMap posmap)
 {
     ItemIndex = itemIndex;
     LogPos    = posmap.LogPos;
 }
예제 #5
0
 public Midpoint(int itemIndex, PosMap posmap)
 {
     ItemIndex = itemIndex;
     LogPos = posmap.LogPos;
 }