func main()

in tools/cmd/walreader/main.go [14:105]


func main() {
	var (
		dataFile      string
		silent, stats bool
	)

	flag.StringVar(&dataFile, "data-file", "", "Data file input created from data-gen utility")
	flag.BoolVar(&silent, "silent", false, "Silent mode")
	flag.BoolVar(&stats, "stats", false, "Print stats")
	flag.Parse()

	if dataFile == "" {
		logger.Fatalf("data-file is required")
	}

	f, err := os.Open(dataFile)
	if err != nil {
		logger.Fatalf("open file: %s", err)
	}
	defer f.Close()

	stat, err := f.Stat()
	if err != nil {
		logger.Fatalf("stat file: %s", err)
	}

	var segments []*os.File
	if stat.IsDir() {
		files, err := f.Readdir(0)
		if err != nil {
			logger.Fatalf("readdir: %s", err)
		}

		for _, file := range files {
			if filepath.Ext(file.Name()) != ".wal" {
				continue
			}

			f, err := os.Open(filepath.Join(dataFile, file.Name()))
			if err != nil {
				logger.Fatalf("open file: %s", err)
			}
			segments = append(segments, f)
		}
	} else {
		segments = append(segments, f)
	}

	var (
		blocks int
		lines  int
	)

	defer func() {
		for _, f := range segments {
			f.Close()
		}
	}()

	for _, f := range segments {
		if len(segments) > 0 {
			println("Processing", f.Name())
		}

		iter, err := wal.NewSegmentIterator(f)
		if err != nil {
			logger.Fatalf("new segment iterator: %s: %s", f.Name(), err)
		}
		for {
			next, err := iter.Next()
			if err == io.EOF {
				break
			} else if err != nil {
				println(err.Error())
				return
			} else if !next {
				break
			}
			blocks++
			lines += bytes.Count(iter.Value(), []byte("\n"))

			if !silent {
				print(string(iter.Value()))
			}
		}
	}

	if stats {
		println("Blocks:", blocks)
		println("Lines:", lines)
	}
}