public VoronStream ReadStream(Slice key) { var tree = FixedTreeFor(key, ChunkDetails.SizeOf); var numberOfChunks = tree.NumberOfEntries; if (numberOfChunks <= 0) { return(null); } var chunksDetails = new ChunkDetails[numberOfChunks]; var i = 0; using (var it = tree.Iterate()) { if (it.Seek(0) == false) { return(null); } do { using (it.Value(out Slice slice)) { chunksDetails[i++] = *(ChunkDetails *)slice.Content.Ptr; } } while (it.MoveNext()); } return(new VoronStream(tree.Name, chunksDetails, _llt)); }
private bool TryGetLastChunkDetailsForStream(Slice key, out ChunkDetails lastChunk) { lastChunk = default; var tree = FixedTreeFor(key, ChunkDetails.SizeOf); if (tree.NumberOfEntries == 0) { return(false); } using (var it = tree.Iterate()) { if (it.SeekToLast() == false) { return(false); } using (tree.Read(it.CurrentKey, out Slice slice)) { if (slice.HasValue == false) { return(false); } lastChunk = *(ChunkDetails *)slice.Content.Ptr; return(true); } } }
public ChunkDetails[] ReadTreeChunks(Slice key, out FixedSizeTree tree) { tree = FixedTreeFor(key, ChunkDetails.SizeOf); var numberOfChunks = tree.NumberOfEntries; if (numberOfChunks <= 0) { return(null); } var chunksDetails = new ChunkDetails[numberOfChunks]; var i = 0; using (var it = tree.Iterate()) { if (it.Seek(0) == false) { Debug.Assert(false, "ReadTreeChunks failed to find any chunks, but we checked that the fst is not empty"); return(null); // can never happen } do { using (it.Value(out Slice slice)) { chunksDetails[i++] = *(ChunkDetails *)slice.Content.Ptr; } } while (it.MoveNext()); } return(chunksDetails); }
private void FlushPage(long pageNumber, int chunkSize) { var chunkDetails = new ChunkDetails { PageNumber = pageNumber, ChunkSize = chunkSize }; using (Slice.External(_parent._tx.Allocator, (byte *)&chunkDetails, ChunkDetails.SizeOf, out Slice value)) { _tree.Add(_chunkNumber++, value); } }
private void RecordChunkPage(long pageNumber, int chunkSize) { var chunkDetails = new ChunkDetails { PageNumber = pageNumber, ChunkSize = chunkSize }; ((StreamPageHeader *)_currentPage.Pointer)->ChunkSize = chunkSize; using (Slice.External(_parent._tx.Allocator, (byte *)&chunkDetails, ChunkDetails.SizeOf, out Slice value)) { _tree.Add(_chunkNumber++, value); } }