Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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);
                }
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
            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);
                }
            }
Ejemplo n.º 5
0
            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);
                }
            }