Exemplo n.º 1
0
	    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;
			}
		}
Exemplo n.º 2
0
		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();
		}
Exemplo n.º 3
0
		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;
			}
		}