public IPage GetPage(ITransaction transaction, ulong pageNumber, CacheHints hints, PageHeadCollection pages) { PageHead pageHead; if (transaction == null) { pageHead = pages.GetPageHead(pageNumber, hints); return(pageHead == null ? null : pageHead.GetVersion(null)); } TransactionHead transactionHead; lock (_transactions) if (!_transactions.TryGetValue(transaction.TransactionId, out transactionHead)) { throw new FileLayerException("You can not get pages for a transaction until you begin the transaction"); } var modifiedPage = transactionHead.GetModifiedPage(pageNumber); if (modifiedPage != null) { return(modifiedPage); } pageHead = pages.GetPageHead(pageNumber, hints); return(pageHead == null ? null : pageHead.GetVersion(transactionHead.Root.Transaction.BeginVersionNumber)); }
/// <summary> /// Reads all of the bytes referenced by this location into a buffer and returns it /// </summary> public byte[] ReadAll( ITransaction transaction, CacheHints hints) { var record = new byte[Length]; ReadInto(transaction, hints, record); return(record); }
public IPage Get(ITransaction transaction, ulong pageNumber, CacheHints hints) { if (!_pages.TryGetValue(pageNumber, out IPage page)) { return(null); } return(page.Reference()); }
/// <summary> /// Reads all of the bytes referenced by this location into the buffer supplied /// </summary> public void ReadInto( ITransaction transaction, CacheHints hints, byte[] record) { #if DEBUG if ((ulong)record.LongLength != Length) { throw new FileLayerException("The buffer passed is the wrong length"); } #endif if (ContunuationPages == null) { using (var page = PageStore.Get(transaction, PageNumber, hints)) Array.Copy(page.Data, Offset, record, 0, record.Length); } else { var recordOffset = 0UL; var bytesToCopy = PageStore.PageSize - Offset; using (var page = PageStore.Get(transaction, PageNumber, hints)) Array.Copy(page.Data, Offset, record, (long)recordOffset, bytesToCopy); foreach (var pageNumber in ContunuationPages) { recordOffset += bytesToCopy; bytesToCopy = PageStore.PageSize; if (recordOffset + bytesToCopy > Length) { bytesToCopy = (uint)(Length - recordOffset); } using (var page = PageStore.Get(transaction, pageNumber, hints)) Array.Copy(page.Data, 0, record, (long)recordOffset, bytesToCopy); } } }
/// <summary> /// Returns the page head for a page number. The page head is the had /// of a linked list of versions of that page /// </summary> /// <returns>Null if the page does not exist in storage</returns> public PageHead GetPageHead(ulong pageNumber, CacheHints hints) { PageHead pageHead; lock (_pages) { if (!_pages.TryGetValue(pageNumber, out pageHead)) { var page = GetFromFileSet(pageNumber); if (page == null) { return(null); } pageHead = new PageHead(pageNumber, page); _pages.Add(pageNumber, pageHead); } } return(pageHead); }
IPage IPageCache.Get(ITransaction transaction, ulong pageNumber, CacheHints hints) { return(_pageCache.Get(transaction, pageNumber, hints)); }