in FixAntenna/NetCore/FixEngine/Storage/File/IndexedMessageStorage.cs [65:139]
protected override void RetrieveMessagesImplementation(long from, long to, IMessageStorageListener listener, bool blocking)
{
if (from < 1)
{
throw new ArgumentException("From can't be <1");
}
if (to < 1)
{
throw new ArgumentException("To can't be <1");
}
FileStream readFile = null;
try
{
readFile = new FileStream(FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
for (var i = from; i <= to; i++)
{
var indexBlock = new ByteBuffer(IndexLength);
if (IsClosed)
{
throw new InvalidOperationException("Storage is closed");
}
indexBlock.Position = 0;
var len = -1;
lock (_indexLock)
{
_indexFile.Position = (i - 1) * IndexLength;
var tempIndexData = new byte[IndexLength];
len = _indexFile.Read(tempIndexData, 0, tempIndexData.Length);
indexBlock.Put(tempIndexData, 0, len);
}
if (len <= 0)
{
return; //no more data
}
var msgPos = GetMessagePosition(indexBlock);
var msgLen = GetMessageSize(indexBlock);
var message = ReadFromStorage(readFile, msgPos, msgLen);
NotifyListener(listener, blocking, message);
}
}
catch (Exception e)
{
if (Log.IsWarnEnabled)
{
if (Log.IsDebugEnabled)
{
Log.Warn("Problem in retrieving messages from indexed message storage: " + e.ToString(), e);
}
else
{
Log.Warn("Problem in retrieving messages from indexed message storage: " + e.ToString());
}
}
if (IsClosed)
{
throw new StorageClosedException("Storage is closed. Cause: " + e.Message);
}
else
{
throw new IOException(e.Message);
}
}
finally
{
readFile?.Close();
}
}