TeamCity.CSharpInteractive/MessageIndicesReader.cs (43 lines of code) (raw):
// ReSharper disable ClassNeverInstantiated.Global
namespace TeamCity.CSharpInteractive;
using System.Buffers;
internal class MessageIndicesReader : IMessageIndicesReader
{
private readonly ILog<MessageIndicesReader> _log;
private readonly MemoryPool<byte> _memoryPool;
private readonly IFileSystem _fileSystem;
public MessageIndicesReader(
ILog<MessageIndicesReader> log,
MemoryPool<byte> memoryPool,
IFileSystem fileSystem)
{
_log = log;
_memoryPool = memoryPool;
_fileSystem = fileSystem;
}
public IEnumerable<ulong> Read(string indicesFile)
{
using var reader = _fileSystem.OpenReader(indicesFile);
using var bufferOwner = _memoryPool.Rent(sizeof(ulong));
var buffer = bufferOwner.Memory[..sizeof(ulong)];
int size;
var prevIndex = 0UL;
var number = 0UL;
while ((size = reader.Read(buffer)) == sizeof(ulong))
{
buffer.Span.Reverse();
var index = BitConverter.ToUInt64(buffer.Span);
if (index <= prevIndex)
{
_log.Warning($"Corrupted file \"{indicesFile}\", invalid index {index} at offset {number * sizeof(ulong)}.");
break;
}
prevIndex = index;
number++;
yield return index;
}
if (size != 0)
{
_log.Warning($"Corrupted file \"{indicesFile}\", invalid size.");
}
}
}