Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }