/// <exception cref="Db4objects.Db4o.Ext.Db4oIOException"></exception>
		private void WritePageToDisk(CachedIoAdapter.Page page)
		{
			ValidateReadOnly();
			try
			{
				_io.Write(page._buffer, page.Size());
				_filePointer = page.EndAddress();
				page._dirty = false;
			}
			catch (Db4oIOException e)
			{
				_readOnly = true;
				throw;
			}
		}
		// _posPageMap.put(new Long(page.startPosition / PAGE_SIZE), page);
		/// <exception cref="Db4objects.Db4o.Ext.Db4oIOException"></exception>
		private int IoRead(CachedIoAdapter.Page page)
		{
			int count = _io.Read(page._buffer);
			if (count > 0)
			{
				_filePointer = page._startAddress + count;
			}
			return count;
		}
		private void MovePageToHead(CachedIoAdapter.Page page)
		{
			if (page == _head)
			{
				return;
			}
			if (page == _tail)
			{
				CachedIoAdapter.Page tempTail = _tail._prev;
				tempTail._next = null;
				_tail._next = _head;
				_tail._prev = null;
				_head._prev = page;
				_head = _tail;
				_tail = tempTail;
			}
			else
			{
				page._prev._next = page._next;
				page._next._prev = page._prev;
				page._next = _head;
				_head._prev = page;
				page._prev = null;
				_head = page;
			}
		}
		/// <exception cref="Db4objects.Db4o.Ext.Db4oIOException"></exception>
		private void GetPageFromDisk(CachedIoAdapter.Page page, long pos)
		{
			long startAddress = pos - pos % _pageSize;
			page.StartAddress(startAddress);
			IoSeek(page._startAddress);
			int count = IoRead(page);
			if (count > 0)
			{
				page.EndAddress(startAddress + count);
			}
			else
			{
				page.EndAddress(startAddress);
			}
		}
		/// <exception cref="Db4objects.Db4o.Ext.Db4oIOException"></exception>
		private void FlushPage(CachedIoAdapter.Page page)
		{
			if (!page._dirty)
			{
				return;
			}
			IoSeek(page.StartAddress());
			WritePageToDisk(page);
			return;
		}
		private void ResetPageAddress(CachedIoAdapter.Page page, long startAddress)
		{
			page.StartAddress(startAddress);
			page.EndAddress(startAddress + _pageSize);
		}
		private bool ContainsHeaderBlock(CachedIoAdapter.Page page)
		{
			return page.StartAddress() <= FileHeader1.HeaderLength;
		}
		private void FlushIfHeaderBlockPage(CachedIoAdapter.Page page)
		{
			if (ContainsHeaderBlock(page))
			{
				FlushPage(page);
			}
		}