private void WriteRecordToDisk(RecoveryRecord record, long?offset = null) { if (offset.HasValue) { Stream.Seek(offset.Value, SeekOrigin.Begin); } byte[] intBytes = BitConverter.GetBytes((int)record.RecordType); Stream.Write(intBytes, 0, intBytes.Length); byte[] longBytes = BitConverter.GetBytes(record.PageIndex); switch (record.RecordType) { case RecoveryRecordType.Update: Stream.Write(longBytes, 0, longBytes.Length); // page index Stream.Write(BitConverter.GetBytes(_pageSize), 0, sizeof(int)); // page size Stream.Write(record.PageContent, 0, record.PageContent.Length); // page content break; case RecoveryRecordType.Delete: Stream.Write(longBytes, 0, longBytes.Length); break; case RecoveryRecordType.Final: longBytes = BitConverter.GetBytes(_stream.Position + 8); Stream.Write(longBytes, 0, longBytes.Length); Stream.Flush(); break; } if (offset.HasValue) { Stream.Seek(0, SeekOrigin.End); } }
/// <summary> /// Writes an information of the deleted page to the recovery file /// </summary> public void WriteDeletePageRecord(long pageIndex) { CheckDisposed(); CheckWriteEnabled(); EnsureFileExists(FileName); if (!_deletedPages.Contains(pageIndex)) { _deletedPages.Add(pageIndex); if (_updatedPages.ContainsKey(pageIndex)) { _updatedPages.Remove(pageIndex); } } else { throw new PageMapException("Page is already removed"); } var record = new RecoveryRecord { RecordType = RecoveryRecordType.Delete, PageIndex = pageIndex, }; WriteRecordToDisk(record); }
/// <summary> /// Writes an information of the updated page to the recovery file /// </summary> /// <param name="page">An updated page</param> public void WriteUpdatePageRecord(IPage page) { CheckDisposed(); CheckWriteEnabled(); EnsureFileExists(FileName); var record = new RecoveryRecord { RecordType = RecoveryRecordType.Update, PageIndex = page.Index, PageContent = page.ContentCopy }; var updateRecord = new UpdateRecord { Content = record.PageContent, Offset = Stream.Length }; if (_updatedPages.ContainsKey(page.Index)) { _updatedPages[page.Index] = updateRecord; } else { _updatedPages.Add(page.Index, new UpdateRecord { Content = record.PageContent, Offset = Stream.Length }); } WriteRecordToDisk(record); }