private void ReadTablePage(UInt64 page)
        {
            var childPages = new List <UInt64>();

            void AddPage(PageType pageType, UInt64 pageToAdd)
            {
                if (PageType.TableInterior == pageType)
                {
                    childPages.Add(pageToAdd);
                }
            }

            using (var eventHandlerSaver = new EventHandlerSaver(this._parser))
            {
                this._parser.CellStarted  += (s, e) => AddPage(e.CellHeader.PageType, e.CellHeader.LeftChildPage);
                this._parser.PageFinished += (s, e) => AddPage(e.PageHeader.PageType, e.PageHeader.RightMostPointer);

                this._parser.PayloadRead += (s, e) => this.TableRecordRead?.Invoke(this, new TableRecordReadEventArgs(e.Fields));

                this._parser.ParsePage(page);
            }

            foreach (var childPage in childPages)
            {
                this.ReadTablePage(childPage);
            }
        }
        public void ReadMasterTable()
        {
            using (var eventHandlerSaver = new EventHandlerSaver(this, nameof(this.TableRecordRead)))
            {
                this.TableRecordRead += (s, e) => this.MasterTableRecordRead?.Invoke(this, new MasterTableRecordReadEventArgs(e.Fields));

                this.ReadTable(1);
            }
        }
        public void ReadTable(String tableName)
        {
            var rootPage = 0UL;

            using (var eventHandlerSaver = new EventHandlerSaver(this, nameof(this.MasterTableRecordRead)))
            {
                this.MasterTableRecordRead += (s, e) =>
                {
                    if (e.Record.Type.Equals("table") && e.Record.Name.Equals(tableName))
                    {
                        rootPage = e.Record.RootPage;
                    }
                };

                this.ReadMasterTable();
            }

            if (rootPage > 0)
            {
                this.ReadTable(rootPage);
            }
        }