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));
        }
Exemplo n.º 2
0
        /// <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);
        }
Exemplo n.º 3
0
        public IPage Get(ITransaction transaction, ulong pageNumber, CacheHints hints)
        {
            if (!_pages.TryGetValue(pageNumber, out IPage page))
            {
                return(null);
            }

            return(page.Reference());
        }
Exemplo n.º 4
0
        /// <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);
                }
            }
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 6
0
 IPage IPageCache.Get(ITransaction transaction, ulong pageNumber, CacheHints hints)
 {
     return(_pageCache.Get(transaction, pageNumber, hints));
 }