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; } } } }
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); }