bool LoadKeyIndex(uint fileId, IKeyIndex info)
{
try
{
var reader = FileCollection.GetFile(fileId).GetExclusiveReader();
FileKeyIndex.SkipHeader(reader);
var keyCount = info.KeyValueCount;
_nextRoot.TrLogFileId = info.TrLogFileId;
_nextRoot.TrLogOffset = info.TrLogOffset;
_nextRoot.CommitUlong = info.CommitUlong;
if (info.Compression == KeyIndexCompression.Old)
{
_nextRoot.BuildTree(keyCount, () =>
{
var keyLength = reader.ReadVInt32();
var key = ByteBuffer.NewAsync(new byte[Math.Abs(keyLength)]);
reader.ReadBlock(key);
if (keyLength < 0)
{
_compression.DecompressKey(ref key);
}
return(new BTreeLeafMember
{
Key = key.ToByteArray(),
ValueFileId = reader.ReadVUInt32(),
ValueOfs = reader.ReadVUInt32(),
ValueSize = reader.ReadVInt32()
});
});
}
else
{
if (info.Compression != KeyIndexCompression.None)
{
return(false);
}
var prevKey = ByteBuffer.NewEmpty();
_nextRoot.BuildTree(keyCount, () =>
{
var prefixLen = (int)reader.ReadVUInt32();
var keyLengthWithoutPrefix = (int)reader.ReadVUInt32();
var key = ByteBuffer.NewAsync(new byte[prefixLen + keyLengthWithoutPrefix]);
Array.Copy(prevKey.Buffer, prevKey.Offset, key.Buffer, key.Offset, prefixLen);
reader.ReadBlock(key.SubBuffer(prefixLen));
prevKey = key;
return(new BTreeLeafMember
{
Key = key.ToByteArray(),
ValueFileId = reader.ReadVUInt32(),
ValueOfs = reader.ReadVUInt32(),
ValueSize = reader.ReadVInt32()
});
});
}
if (reader.Eof)
{
return(true);
}
if (reader.ReadInt32() == EndOfIndexFileMarker)
{
return(true);
}
return(false);
}
catch (Exception)
{
return(false);
}
}