private Page DiskReadPage(string tableName, int pageIndex, int fileId) { string filename = DatabaseName + "." + tableName + ".data." + fileId; DataFileHeader tableDataFileHeader = ReadDataFileHeader(tableName, fileId); if (pageIndex >= tableDataFileHeader.TotalPageNum) { throw new ApplicationException("pageIndex"); } var p = new Page(tableDataFileHeader) { FileId = fileId, PageIndex = pageIndex, PageSize = tableDataFileHeader.PageSize, TableName = tableName, DataFileName = filename, }; using (var fileStream = new FileStream(filename, FileMode.Open)) { fileStream.Seek(DataFileHeaderSize + pageIndex * p.PageSize, SeekOrigin.Begin); var pageData = new byte[p.PageSize]; fileStream.Read(pageData, 0, p.PageSize); p.Decode(pageData); } return(p); }
private void CreateTableFile(string tableName, int rowSize, int pageSize = DefaultPageSize, int pageNum = DefaultTotalPages) { for (int j = 0; j <= 1; j++) { string filename = DatabaseName + "." + tableName + ".data." + j; if (File.Exists(filename)) { continue; } var databaseHeader = new DataFileHeader { TotalPageNum = pageNum, PageSize = pageSize, RowSize = rowSize, RowsPerPage = (pageSize - Page.PageHeadSize) / rowSize }; var databaseHeaderBuffer = new byte[DataFileHeaderSize]; byte[] binaryHeader = SerializationHelper.ObjectToByteArray(databaseHeader); Array.Copy(binaryHeader, databaseHeaderBuffer, binaryHeader.Length); //Mark Database data file header using (var fileStream = new FileStream(filename, FileMode.OpenOrCreate)) { fileStream.Seek(0, SeekOrigin.Begin); fileStream.Write(databaseHeaderBuffer, 0, DataFileHeaderSize); fileStream.Flush(); } using (var fileStream = new FileStream(filename, FileMode.OpenOrCreate)) { for (int i = 0; i < pageNum; i++) { fileStream.Seek(DataFileHeaderSize + i * pageSize, SeekOrigin.Begin); //Mark Page Header - {P$}{Page Index}{NextFreeRowIndex} var encoder = new UTF8Encoding(); byte[] byteArray = encoder.GetBytes("P$"); fileStream.Write(byteArray, 0, byteArray.Length); byteArray = BitConverter.GetBytes(i); fileStream.Write(byteArray, 0, byteArray.Length); byteArray = BitConverter.GetBytes(0); fileStream.Write(byteArray, 0, byteArray.Length); fileStream.Flush(); } } } }
private void DiskWritePage(string tableName, Page page, int fileId) { string filename = DatabaseName + "." + page.TableName + ".data." + fileId; DataFileHeader tableDataFileHeader = ReadDataFileHeader(tableName, page.FileId); if (page.PageIndex >= tableDataFileHeader.TotalPageNum) { throw new ApplicationException("pageIndex"); } page.FileId = fileId; using (var fileStream = new FileStream(filename, FileMode.Open)) { fileStream.Seek(DataFileHeaderSize + page.PageIndex * page.PageSize, SeekOrigin.Begin); byte[] pageData = page.Encode(); fileStream.Write(pageData, 0, page.PageSize); fileStream.Flush(); } }
private void CreateTableFile(string tableName, int rowSize, int pageSize = DefaultPageSize, int pageNum = DefaultTotalPages) { for (int j = 0; j <= 1; j++) { string filename = DatabaseName + "." + tableName + ".data." + j; if (File.Exists(filename)) continue; var databaseHeader = new DataFileHeader { TotalPageNum = pageNum, PageSize = pageSize, RowSize = rowSize, RowsPerPage = (pageSize - Page.PageHeadSize) / rowSize }; var databaseHeaderBuffer = new byte[DataFileHeaderSize]; byte[] binaryHeader = SerializationHelper.ObjectToByteArray(databaseHeader); Array.Copy(binaryHeader, databaseHeaderBuffer, binaryHeader.Length); //Mark Database data file header using (var fileStream = new FileStream(filename, FileMode.OpenOrCreate)) { fileStream.Seek(0, SeekOrigin.Begin); fileStream.Write(databaseHeaderBuffer, 0, DataFileHeaderSize); fileStream.Flush(); } using (var fileStream = new FileStream(filename, FileMode.OpenOrCreate)) { for (int i = 0; i < pageNum; i++) { fileStream.Seek(DataFileHeaderSize + i * pageSize, SeekOrigin.Begin); //Mark Page Header - {P$}{Page Index}{NextFreeRowIndex} var encoder = new UTF8Encoding(); byte[] byteArray = encoder.GetBytes("P$"); fileStream.Write(byteArray, 0, byteArray.Length); byteArray = BitConverter.GetBytes(i); fileStream.Write(byteArray, 0, byteArray.Length); byteArray = BitConverter.GetBytes(0); fileStream.Write(byteArray, 0, byteArray.Length); fileStream.Flush(); } } } }
public Page(DataFileHeader dataFileHeader) { this.RowSize = dataFileHeader.RowSize; this.RowsPerPage = dataFileHeader.RowsPerPage; }
public const int PageHeadSize = SimpleDatabase.PageHeaderSize; // {P$}{Page Index}{NextFreeRowIndex} public Page(DataFileHeader dataFileHeader) { this.RowSize = dataFileHeader.RowSize; this.RowsPerPage = dataFileHeader.RowsPerPage; }