internal void WriteDirect(TransactionHeader* transactionHeader, PageFromScratchBuffer pages) { for (int i = 0; i < pages.NumberOfPages; i++) { var page = _env.ScratchBufferPool.ReadPage(pages.ScratchFileNumber, pages.PositionInScratchBuffer+i); int numberOfPages = 1; if (page.IsOverflow) { numberOfPages = (page.OverflowSize / AbstractPager.PageSize) + (page.OverflowSize % AbstractPager.PageSize == 0 ? 0 : 1); i += numberOfPages; _overflowPagesInTransaction += (numberOfPages - 1); } WritePageDirect(page, numberOfPages); _state.NextPageNumber = transactionHeader->NextPageNumber; } }
private void InitTransactionHeader() { var allocation = _env.ScratchBufferPool.Allocate(this, 1); var page = _env.ScratchBufferPool.ReadPage(allocation.ScratchFileNumber, allocation.PositionInScratchBuffer); _transactionHeaderPage = allocation; UnmanagedMemory.Set(page.Base, 0, AbstractPager.PageSize); _txHeader = (TransactionHeader*)page.Base; _txHeader->HeaderMarker = Constants.TransactionHeaderMarker; _txHeader->TransactionId = _id; _txHeader->NextPageNumber = _state.NextPageNumber; _txHeader->LastPageNumber = -1; _txHeader->PageCount = -1; _txHeader->Crc = 0; _txHeader->TxMarker = TransactionMarker.None; _txHeader->Compressed = false; _txHeader->CompressedSize = 0; _txHeader->UncompressedSize = 0; _allocatedPagesInTransaction = 0; _overflowPagesInTransaction = 0; _scratchPagesTable.Clear(); }
internal void WriteDirect(TransactionHeader* transactionHeader, PageFromScratchBuffer pages) { for (int i = 0; i < pages.NumberOfPages; i++) { var page = _env.ScratchBufferPool.ReadPage(pages.ScratchFileNumber, pages.PositionInScratchBuffer+i); int numberOfPages = 1; if (page.IsOverflow) { numberOfPages = (page.OverflowSize / AbstractPager.PageSize) + (page.OverflowSize % AbstractPager.PageSize == 0 ? 0 : 1); i += numberOfPages; _overflowPagesInTransaction += (numberOfPages - 1); } var pageFromScratchBuffer = _env.ScratchBufferPool.Allocate(this, numberOfPages); var dest = _env.ScratchBufferPool.AcquirePagePointer(pageFromScratchBuffer.ScratchFileNumber, pageFromScratchBuffer.PositionInScratchBuffer); StdLib.memcpy(dest, page.Base, numberOfPages*AbstractPager.PageSize); _allocatedPagesInTransaction++; _dirtyPages.Add(page.PageNumber); page.Dirty = true; if (numberOfPages > 1) _dirtyOverflowPages.Add(page.PageNumber + 1, numberOfPages - 1); _scratchPagesTable[page.PageNumber] = pageFromScratchBuffer; _transactionPages.Add(pageFromScratchBuffer); _state.NextPageNumber = transactionHeader->NextPageNumber; } }