Exemplo n.º 1
0
        private static void CopyStreamToPointer(Transaction tx, Stream value, byte *pos)
        {
            TemporaryPage tmp;

            using (tx.Environment.GetTemporaryPage(tx, out tmp))
            {
                var tempPageBuffer  = tmp.TempPageBuffer;
                var tempPagePointer = tmp.TempPagePointer;
                while (true)
                {
                    var read = value.Read(tempPageBuffer, 0, AbstractPager.PageSize);
                    if (read == 0)
                    {
                        break;
                    }

                    MemoryUtils.CopyInline(pos, tempPagePointer, read);
                    pos += read;

                    if (read != tempPageBuffer.Length)
                    {
                        break;
                    }
                }
            }
        }
Exemplo n.º 2
0
        public MemorySlice GetNodeKey(NodeHeader *node)
        {
            if (KeysPrefixed == false)
            {
                var keySize = node->KeySize;
                var key     = new byte[keySize];

                fixed(byte *ptr = key)
                MemoryUtils.CopyInline(ptr, (byte *)node + Constants.NodeHeaderSize, keySize);

                return(new Slice(key));
            }

            if (node->KeySize == 0)
            {
                return(new PrefixedSlice(Slice.Empty));
            }

            var prefixHeader = (PrefixedSliceHeader *)((byte *)node + Constants.NodeHeaderSize);

            var nonPrefixedSize = prefixHeader->NonPrefixedDataSize;
            var nonPrefixedData = new byte[nonPrefixedSize];

            fixed(byte *ptr = nonPrefixedData)
            MemoryUtils.CopyInline(ptr, (byte *)prefixHeader + Constants.PrefixedSliceHeaderSize, nonPrefixedSize);

            var prefixedSlice = new PrefixedSlice(prefixHeader->PrefixId, prefixHeader->PrefixUsage, new Slice(nonPrefixedData));

            if (prefixHeader->PrefixId == PrefixedSlice.NonPrefixedId)
            {
                return(prefixedSlice);
            }

            AssertPrefixNode(prefixedSlice.Header.PrefixId);

            var prefixNodePtr = (PrefixNodeHeader *)(_base + _prefixSection->PrefixOffsets[prefixedSlice.Header.PrefixId]);

            var prefixLength = prefixNodePtr->PrefixLength;
            var prefixData   = new byte[prefixLength];

            fixed(byte *ptr = prefixData)
            MemoryUtils.CopyInline(ptr, (byte *)prefixNodePtr + Constants.PrefixNodeHeaderSize, prefixLength);

            prefixedSlice.Prefix = new PrefixNode(new PrefixNodeHeader {
                PrefixLength = prefixLength
            }, prefixData, PageNumber);

            return(prefixedSlice);
        }