func readWAL()

in wal.go [207:243]


func readWAL(
	access func(PageID) []byte,
	root PageID,
) (walMapping, idList, reason) {
	const op = "txfile/read-wal"

	if root == 0 {
		return walMapping{}, nil, nil
	}

	mapping := walMapping{}
	var metaPages idList
	for pageID := root; pageID != 0; {
		metaPages.Add(pageID)
		node, data := castWalPage(access(pageID))
		if node == nil {
			return nil, nil, errOp(op).of(InvalidMetaPage).
				causedBy(raiseOutOfBounds(pageID)).
				report("write ahead metadata corrupted")
		}

		count := int(node.count.Get())
		pageID = node.next.Get()

		for i := 0; i < count; i++ {
			// read node mapping. Only 7 bytes are used per pageID
			var k, v pgID
			copy(k[0:7], data[0:7])
			copy(v[0:7], data[7:14])
			data = data[14:]

			mapping[k.Get()] = v.Get()
		}
	}

	return mapping, metaPages, nil
}