From 0c80dd255d97b398e400e729ee5752b277d43d3d Mon Sep 17 00:00:00 2001 From: Mike Cohen Date: Tue, 3 Dec 2019 10:28:41 +1000 Subject: [PATCH] Bugfix: Do not walk pages we walked before. (#5) --- parser/pages.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/parser/pages.go b/parser/pages.go index d9e9c76..c999328 100644 --- a/parser/pages.go +++ b/parser/pages.go @@ -222,9 +222,20 @@ func (self *ESENT_LEAF_HEADER) Dump() { func WalkPages(ctx *ESEContext, id int64, cb func(header *PageHeader, page_id int64, value *Value) error) error { - if id <= 0 { + seen := make(map[int64]bool) + + return _walkPages(ctx, id, seen, cb) +} + +func _walkPages(ctx *ESEContext, + id int64, seen map[int64]bool, + cb func(header *PageHeader, page_id int64, value *Value) error) error { + + _, pres := seen[id] + if id <= 0 || pres { return nil } + seen[id] = true if DebugWalk { fmt.Printf("Walking page %v\n", id) @@ -248,7 +259,7 @@ func WalkPages(ctx *ESEContext, } else if header.IsBranch() { // Walk the branch branch := NewESENT_BRANCH_ENTRY(ctx, value) - err := WalkPages(ctx, branch.ChildPageNumber(), cb) + err := _walkPages(ctx, branch.ChildPageNumber(), seen, cb) if err != nil { return err } @@ -256,7 +267,7 @@ func WalkPages(ctx *ESEContext, } if header.NextPageNumber() > 0 { - err := WalkPages(ctx, int64(header.NextPageNumber()), cb) + err := _walkPages(ctx, int64(header.NextPageNumber()), seen, cb) if err != nil { return err }