github.com/segmentio/parquet-go@v0.0.0-20230712180008-5d42db8f0d47/internal/debug/debug.go (about)

     1  package debug
     2  
     3  import (
     4  	"encoding/hex"
     5  	"fmt"
     6  	"io"
     7  	"log"
     8  	"os"
     9  	"strconv"
    10  	"strings"
    11  )
    12  
    13  func ReaderAt(reader io.ReaderAt, prefix string) io.ReaderAt {
    14  	return &ioReaderAt{
    15  		reader: reader,
    16  		prefix: prefix,
    17  	}
    18  }
    19  
    20  type ioReaderAt struct {
    21  	reader io.ReaderAt
    22  	prefix string
    23  }
    24  
    25  func (d *ioReaderAt) ReadAt(b []byte, off int64) (int, error) {
    26  	n, err := d.reader.ReadAt(b, off)
    27  	fmt.Printf("%s: Read(%d) @%d => %d %v \n%s\n", d.prefix, len(b), off, n, err, hex.Dump(b[:n]))
    28  	return n, err
    29  }
    30  
    31  func Reader(reader io.Reader, prefix string) io.Reader {
    32  	return &ioReader{
    33  		reader: reader,
    34  		prefix: prefix,
    35  	}
    36  }
    37  
    38  type ioReader struct {
    39  	reader io.Reader
    40  	prefix string
    41  	offset int64
    42  }
    43  
    44  func (d *ioReader) Read(b []byte) (int, error) {
    45  	n, err := d.reader.Read(b)
    46  	fmt.Printf("%s: Read(%d) @%d => %d %v \n%s\n", d.prefix, len(b), d.offset, n, err, hex.Dump(b[:n]))
    47  	d.offset += int64(n)
    48  	return n, err
    49  }
    50  
    51  func Writer(writer io.Writer, prefix string) io.Writer {
    52  	return &ioWriter{
    53  		writer: writer,
    54  		prefix: prefix,
    55  	}
    56  }
    57  
    58  type ioWriter struct {
    59  	writer io.Writer
    60  	prefix string
    61  	offset int64
    62  }
    63  
    64  func (d *ioWriter) Write(b []byte) (int, error) {
    65  	n, err := d.writer.Write(b)
    66  	fmt.Printf("%s: Write(%d) @%d => %d %v \n  %q\n", d.prefix, len(b), d.offset, n, err, b[:n])
    67  	d.offset += int64(n)
    68  	return n, err
    69  }
    70  
    71  var (
    72  	TRACEBUF int
    73  )
    74  
    75  func init() {
    76  	for _, arg := range strings.Split(os.Getenv("PARQUETGODEBUG"), ",") {
    77  		k := arg
    78  		v := ""
    79  		i := strings.IndexByte(arg, '=')
    80  		if i >= 0 {
    81  			k, v = arg[:i], arg[i+1:]
    82  		}
    83  		var err error
    84  		switch k {
    85  		case "":
    86  			// ignore empty entries
    87  		case "tracebuf":
    88  			if TRACEBUF, err = strconv.Atoi(v); err != nil {
    89  				log.Printf("PARQUETGODEBUG: invalid value for tracebuf: %q", v)
    90  			}
    91  		default:
    92  			log.Printf("PARQUETGODEBUG: unrecognized debug option: %q", k)
    93  		}
    94  	}
    95  }