Esempio n. 1
0
        /// <summary>
        /// Get a new empty page - can be a reused page (EmptyPage) or a clean one (extend datafile)
        /// </summary>
        public T NewPage <T>(BasePage prevPage = null)
            where T : BasePage
        {
            // get header
            var header   = this.GetPage <HeaderPage>(0);
            var pageID   = (uint)0;
            var diskData = new byte[0];

            // try get page from Empty free list
            if (header.FreeEmptyPageID != uint.MaxValue)
            {
                var free = this.GetPage <BasePage>(header.FreeEmptyPageID);

                // remove page from empty list
                this.AddOrRemoveToFreeList(false, free, header, ref header.FreeEmptyPageID);

                pageID = free.PageID;

                // if used page has original disk data, copy to my new page
                if (free.DiskData.Length > 0)
                {
                    diskData = free.DiskData;
                }
            }
            else
            {
                pageID = ++header.LastPageID;

                // set header page as dirty after increment LastPageID
                this.SetDirty(header);
            }

            var page = BasePage.CreateInstance <T>(pageID);

            // copy disk data from re-used page (or be an empty)
            page.DiskData = diskData;

            // add page to cache with correct T type (could be an old Empty page type)
            this.SetDirty(page);

            // if there a page before, just fix NextPageID pointer
            if (prevPage != null)
            {
                page.PrevPageID     = prevPage.PageID;
                prevPage.NextPageID = page.PageID;

                this.SetDirty(prevPage);
            }

            return(page);
        }
Esempio n. 2
0
        /// <summary>
        /// Get a new empty page - can be a reused page (EmptyPage) or a clean one (extend datafile)
        /// Set as Dirty
        /// </summary>
        public T NewPage <T>(BasePage prevPage = null)
            where T : BasePage
        {
            // get header and mark as dirty
            var header = this.GetPage <HeaderPage>(0, true);
            var pageID = (uint)0;

            // try get page from Empty free list
            if (header.FreeEmptyPageID != uint.MaxValue)
            {
                var free = this.GetPage <BasePage>(header.FreeEmptyPageID);

                // remove page from empty list
                this.AddOrRemoveToFreeList(false, free, header, ref header.FreeEmptyPageID);

                pageID = free.PageID;
            }
            else
            {
                pageID = ++header.LastPageID;
            }

            var page = BasePage.CreateInstance <T>(pageID);

            // mark new page as dirty as soon as possible
            this.SetDirty(page);

            // if there a page before, just fix NextPageID pointer
            if (prevPage != null)
            {
                this.SetDirty(prevPage);
                page.PrevPageID     = prevPage.PageID;
                prevPage.NextPageID = page.PageID;
            }

            return(page);
        }