Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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();
                    }
                }
            }
        }
Esempio n. 3
0
        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();
                    }
                }
            }
        }
Esempio n. 5
0
 public Page(DataFileHeader dataFileHeader)
 {
     this.RowSize = dataFileHeader.RowSize;
     this.RowsPerPage = dataFileHeader.RowsPerPage;
 }
Esempio n. 6
0
        public const int PageHeadSize = SimpleDatabase.PageHeaderSize; // {P$}{Page Index}{NextFreeRowIndex}

        public Page(DataFileHeader dataFileHeader)
        {
            this.RowSize     = dataFileHeader.RowSize;
            this.RowsPerPage = dataFileHeader.RowsPerPage;
        }