public static void ReadFromFile(IndexPage indexPage, BinaryReader reader) { // Seek the stream to the first byte on page long initPos = reader.SetReadPos(Header.FILE_START_HEADER_SIZE + (indexPage.PageID * BasePage.PAGE_SIZE)); if (reader.ReadByte() != (byte)PageType.Index) throw new FileDBException("PageID {0} is not a Index Page", indexPage.PageID); indexPage.NextPageID = reader.ReadUInt32(); indexPage.SetUsedNodeCount(reader.ReadByte()); // Seek the stream to end of header data page reader.SetReadPos(initPos + IndexPage.INDEX_HEADER_SIZE); //in this version //each node uses buffer= 16+1+1+4+1+4+4+8+4+2+36 =81 //IndexPage.NODES_PER_PAGE = 50; //so it use 81*50 = 4050 //IndexPage.INDEX_HEADER_SIZE =46 //so => 4050 +46 = 4096 //and each page has BasePage.PAGE_SIZE = 4096 => matched for (int i = 0; i <= indexPage.UsedNodeCount; i++) { var node = indexPage.Nodes[i]; node.ID = reader.ReadGuid(); //16 node.IsDeleted = reader.ReadBoolean(); //1 node.Right.Index = reader.ReadByte(); //1 node.Right.PageID = reader.ReadUInt32(); //4 node.Left.Index = reader.ReadByte(); //1 node.Left.PageID = reader.ReadUInt32();//4 node.DataPageID = reader.ReadUInt32();//4 node.FileMetaDataLength = reader.ReadUInt16();//2 node.FileLength = reader.ReadUInt32();//4 int filenameCount = reader.ReadByte(); //1 if (filenameCount > IndexNode.FILENAME_SIZE) { node.FileUrl = reader.ReadUtf8String(IndexNode.FILENAME_SIZE); } else { string filename = reader.ReadUtf8String(IndexNode.FILENAME_SIZE); node.FileUrl = filename.Substring(0, filenameCount); } } }
public static BasePage GetBasePage(uint pageID, BinaryReader reader) { // Seek the stream at begin of page long initPos = reader.SetReadPos(Header.FILE_START_HEADER_SIZE + (pageID * BasePage.PAGE_SIZE)); if (reader.ReadByte() == (byte)PageType.Index) return GetIndexPage(pageID, reader); else return GetDataPage(pageID, reader, true); }
public static void ReadFromFile(DataPage dataPage, BinaryReader reader, bool onlyHeader) { // Seek the stream on first byte from data page long initPos = reader.SetReadPos(Header.FILE_START_HEADER_SIZE + (dataPage.PageID * BasePage.PAGE_SIZE)); if (reader.ReadByte() != (byte)PageType.Data) throw new FileDBException("PageID {0} is not a Data Page", dataPage.PageID); dataPage.NextPageID = reader.ReadUInt32(); dataPage.IsEmpty = reader.ReadBoolean(); dataPage.DataBlockLength = reader.ReadInt16(); // If page is empty or onlyHeader parameter, I don't read data content if (!dataPage.IsEmpty && !onlyHeader) { // Seek the stream at the end of page header reader.SetReadPos(initPos + DataPage.DATA_HEADER_SIZE); // Read all bytes from page dataPage.DataBlock = reader.ReadBytes(dataPage.DataBlockLength); } }